Page 2 sur 4

Publié : mar. 22/juin/2004 20:00
par Backup
Procedure Piece()

DisplaySprite(#Piece_1,50,50)
DisplaySprite(#Piece_1,50,30)
DisplaySprite(#Piece_1,50,10)
DisplaySprite(#Piece_1,50,70)
DisplaySprite(#Piece_1,50,90)
DisplaySprite(#Piece_1,50,110)
DisplaySprite(#Piece_1,50,130)
DisplaySprite(#Piece_1,50,150)
DisplaySprite(#Piece_1,50,170)

EndProcedure
ben garzul et les boucles For Next ? ça sert a quoi ?

Code : Tout sélectionner

Procedure Piece()

   for  x= 1 to largeur fenetre step 50
      for y = 1 to hauteur_fenetre step 20
            DisplaySprite(#Piece_1,x,y)
      next y
   next x

EndProcedure
ou bien tu peut lire des data si tes sprites sont pas disposé de façon regulieres !!

regarde a data dans la Doc ! :D [/code]

Publié : mar. 22/juin/2004 20:00
par Backup
Procedure Piece()

DisplaySprite(#Piece_1,50,50)
DisplaySprite(#Piece_1,50,30)
DisplaySprite(#Piece_1,50,10)
DisplaySprite(#Piece_1,50,70)
DisplaySprite(#Piece_1,50,90)
DisplaySprite(#Piece_1,50,110)
DisplaySprite(#Piece_1,50,130)
DisplaySprite(#Piece_1,50,150)
DisplaySprite(#Piece_1,50,170)

EndProcedure
ben garzul et les boucles For Next ? ça sert a quoi ?

Code : Tout sélectionner

Procedure Piece()

   for  x= 1 to largeur fenetre step 50
      for y = 1 to hauteur_fenetre step 20
            DisplaySprite(#Piece_1,x,y)
      next y
   next x

EndProcedure
ou bien tu peut lire des data si tes sprites sont pas disposé de façon regulieres !!

regarde a data dans la Doc ! :D [/code]

Publié : mar. 22/juin/2004 20:10
par garzul
:D merci mais jai fais des piece dans mon programme et je veux que quand le joueur 1 arrive dessu la piece disparais style pacman le seul pb c que mon prog et juste mais au moment de lessai je vois plus mais piece ou sa marche pas .

Code : Tout sélectionner

  ;enumeration des constant
Enumeration
;joueur
#Joueur_1
;au cas ou
#Garzul=1 
#Police=1 
;objet
#Piece_1
#Sprite3D

EndEnumeration
;global
Global X 
  Global Y
  ;les dimension du cercle 
     Width=200
  Height=100 
  ;fin
      aficher_piece_1 = #true

     
Resultat = InitSprite() 
FontID = LoadFont(#Police, "arial", 18, #PB_Font_Bold ) 
EcranX = GetSystemMetrics_(#SM_CXSCREEN):;
EcranY = GetSystemMetrics_(#SM_CYSCREEN):;
WindowID = OpenWindow(1, 0, 0, 320, 200,  #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered , "pour Dobro:)") 

WindowID = WindowID(1) 
Result = OpenWindowedScreen(WindowID,0,0, 320, 200, 1, 0,0)
 
;-sprite joueur
CreateSprite(#Joueur_1, 10, 10 )    :;  

StartDrawing(SpriteOutput(#Joueur_1)) :
DrawingMode(0) 

 Circle(0, 0, 10 ,RGB(Random(255),Random(42),Random(85))) : 

 :; voila on a fini de dessiner notre sprite 
 
StopDrawing() 

 ;-sprite objet
;creation du sprite des pieces.
CreateSprite(#Piece_1, 10, 10 )  
StartDrawing(SpriteOutput(#Piece_1)) :
 x = Width/2 
      y = Height/2 
      For Radius = Height/2 To 10 Step -10 
DrawingMode(0) 

 Circle(0, 0, radius ,RGB($FF,$FE,$00))
  Next 
StopDrawing() 
;fin des sprite

;-mouvement du joueur
Procedure MovePlayer() 
 If KeyboardPushed(#PB_Key_Right) :x + 2  :EndIf 
  If KeyboardPushed(#PB_Key_Left) :x - 2  :EndIf
 
  If x < 12 :x = 12 :EndIf 
  If x > 298 :x = 298 :EndIf 
   If KeyboardPushed(#PB_Key_Up) :y - 2  :EndIf 
If KeyboardPushed(#PB_Key_Down) :y + 2  :EndIf  
   If y < 12 :y = 12 :EndIf 
  If y > 182 :y = 182 :EndIf 

EndProcedure 
Procedure Collision() 
If SpriteCollision(#Joueur_1, x1, y1, #Piece_1, x2, y2)
Afiche_piece_1 = #False

EndIf
EndProcedure 


Procedure Piece() 
 If aficher_piece_1 = #true
 DisplaySprite(#Piece_1,50,50)
  DisplaySprite(#Piece_1,50,30)
    DisplaySprite(#Piece_1,50,10)
  DisplaySprite(#Piece_1,50,70)
  DisplaySprite(#Piece_1,50,90)
  DisplaySprite(#Piece_1,50,110)
  DisplaySprite(#Piece_1,50,130)
  DisplaySprite(#Piece_1,50,150)
  DisplaySprite(#Piece_1,50,170)
EndIf
EndProcedure 


;fin 


;-boucle et evenement
Repeat
    
        event =WindowEvent() :
      Delay(5) 
          x+sensx  :;on ajoute (10) a la position colonne actuel du sprite 
    y+sensy :; ;on ajoute (10) a la position ligne actuel du sprite 
    If x>320-20 :; si le sprite arrive vers le bord droit de l'ecran - la largeur du sprite (10) 
        
                sensx=-sensx :; alors on inverse les coordonées en x (colonne) ceci va faire repartir le sprite dans l'autre sens 
          EndIf       
    If x<1 
        sensx=-sensx : ; si le sprite arrive a gauche de l'ecran on inverse ses coordonees !! 
        ;(pas besoin de compter la largeurdu sprite  puisque c'est le coin superieur GAUCHE qui compte !!) 
           EndIf 
    If y>200-10   : ; pareille si le sprite arrive en bas (c'est a dire le bas de l'ecran - la hauteur du sprite) 
        sensy=-sensy ; on inverse les coordonees (il rebondit) 
    EndIf 
    If y<1 
        sensy=-sensy :; pareille si le sprite arrive en haut !! 
    EndIf 
      

    DisplaySprite(#Joueur_1, x, y) :; enfin on met le sprite au bonne coordonées

      FlipBuffers() 
    ClearScreen(0, 0, 0)
 
  InitKeyboard() 
  ExamineKeyboard() 
  Piece()
  Collision() 
  MovePlayer()
      
      Until event=#PB_Event_CloseWindow 
    End   


et autrement tu trouve que je me debrouille comment dans lavancement

Publié : mar. 22/juin/2004 22:14
par Backup
ben je trouve que t'es pas assé concentré !!!

au debut de ton programme
tu declare "aficher_piece_1 = #True"
ok
dans la procedure collision tu declare
"Afiche_piece_1 = #False" <---- une autre variable (afiche et aficher)

dans la procedure piece()
tu declare "aficher_piece_1 = #True"

d'abord ta deux sortes de variables qui sont semblable !!
a mon avis y a une erreur de syntax de ta part !!!
si c'est voulu c'est a eviter; les variables qui se ressemble ,se confonde !!

d'autre part elle n'ont pas eté declare comm global ,donc elle
n'ont de valeur que dans leur procedure respective !!
si tu veut que la valeur d'une variable a l'interieur d'une procedure
"sorte" de la procedure faut la declarer Shared dans la procedure !!

sinon le plus simple quant tu debute la programmation c'est de declarer toutes tes variables comme Global au debut du listing !!

d'autre part dans un soucis de clarté ,je te suggere de placer tes procedure a la fin de ton listing
et de declarer celles-ci au debut du listing avec "Declare"
ça a l'avantage de te faire voir a nouveau le nom des procedures
et ça evite les erreurs de frappes !!

tu declare

Code : Tout sélectionner

 Width=200
Height=100
 
pis apres tu fait

Code : Tout sélectionner

StartDrawing(SpriteOutput(#Piece_1)) :
X = Width/2 ; <------ ici x=200/2 soit 100
Y = Height/2; <------- ici y=100/2 soit 50       Voir commentaire dessous !!
For Radius = Height/2 To 10 Step -10
    DrawingMode(0)
     Circle(0, 0, Radius ,RGB($FF,$FE,$00))
Next
StopDrawing()
 
Commentaire :: comment veut tu dessiner un cercle de 50 dans un sprite
qui fait 10 pixel de large !!!

voici avec quelques modifications etudie le !!
c'est pas une solution ,c'est juste une modification de ton listing !!
:D

Code : Tout sélectionner

;enumeration des constant
Enumeration
    ;joueur
    #Joueur_1
    ;au cas ou
    #Garzul=1
    #Police=1
    ;objet
    #Piece_1
    #Sprite3D
    
EndEnumeration

; ************ Declaration des procedures **********************
Declare MovePlayer()
Declare Collision()
Declare Piece()

;global
Global X
Global Y
  ;les dimension du cercle
Width=200
Height=100
  ;fin
Global Afiche_piece_1 


     
Resultat = InitSprite()
FontID = LoadFont(#Police, "arial", 18, #PB_Font_Bold )
EcranX = GetSystemMetrics_(#SM_CXSCREEN):;
EcranY = GetSystemMetrics_(#SM_CYSCREEN):;
WindowID = OpenWindow(1, 0, 0, 320, 200,  #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered , "pour Dobro:)")

WindowID = WindowID(1)
Result = OpenWindowedScreen(WindowID,0,0, 320, 200, 1, 0,0)
 
;-sprite joueur
CreateSprite(#Joueur_1, 10, 10 )    :; 
StartDrawing(SpriteOutput(#Joueur_1)) :
DrawingMode(0)
Circle(0, 0, 10 ,RGB(Random(255),Random(42),Random(85))) :

:; voila on a fini de dessiner notre sprite
 
StopDrawing()

 ;-sprite objet
;creation du sprite des pieces.
CreateSprite(#Piece_1, 10, 10 ) 
StartDrawing(SpriteOutput(#Piece_1)) :
 ;  ICI CORRIGE PAR DOBRO pour faire un cercle c'est simple pas besoin de boucle !!
    DrawingMode(0)
    Circle(5, 5, 5 ,RGB($FF,$FE,$00)) :; j'ai mis 5,5 car ton sprite a une cellule de 10x10
StopDrawing()
;fin des sprite

Afiche_piece_1 = #True :; deplace par DOBRO !!

;fin


;-boucle et evenement
Repeat
    
    event =WindowEvent() :
    Delay(5)
    X+sensx  :;on ajoute (10) a la position colonne actuel du sprite
    Y+sensy :; ;on ajoute (10) a la position ligne actuel du sprite
    If X>320-20 :; si le sprite arrive vers le bord droit de l'ecran - la largeur du sprite (10)
        
        sensx=-sensx :; alors on inverse les coordonées en x (colonne) ceci va faire repartir le sprite dans l'autre sens
    EndIf       
    If X<1
        sensx=-sensx : ; si le sprite arrive a gauche de l'ecran on inverse ses coordonees !!
        ;(pas besoin de compter la largeurdu sprite  puisque c'est le coin superieur GAUCHE qui compte !!)
    EndIf
    If Y>200-10   : ; pareille si le sprite arrive en bas (c'est a dire le bas de l'ecran - la hauteur du sprite)
        sensy=-sensy ; on inverse les coordonees (il rebondit)
    EndIf
    If Y<1
        sensy=-sensy :; pareille si le sprite arrive en haut !!
    EndIf
    
    
    DisplaySprite(#Joueur_1, X, Y) :; enfin on met le sprite au bonne coordonées
    
    Piece()
    Collision()
    MovePlayer() 
    
    
    FlipBuffers()
    ClearScreen(0, 0, 0)
    
    InitKeyboard()
    ExamineKeyboard()
    
    
Until event=#PB_Event_CloseWindow
End    




;* *******************   Les PROCEDURES !!!!! **********************************

;-mouvement du joueur
Procedure MovePlayer()
    If KeyboardPushed(#PB_Key_Right) :X + 2  :EndIf
    If KeyboardPushed(#PB_Key_Left) :X - 2  :EndIf
    
    If X < 12 :X = 12 :EndIf
    If X > 298 :X = 298 :EndIf
    If KeyboardPushed(#PB_Key_Up) :Y - 2  :EndIf
    If KeyboardPushed(#PB_Key_Down) :Y + 2  :EndIf 
    If Y < 12 :Y = 12 :EndIf
    If Y > 182 :Y = 182 :EndIf
    
EndProcedure
Procedure Collision()
    
    If SpriteCollision(#Joueur_1, x1, y1, #Piece_1, x2, y2)
        ;Afiche_piece_1 = #False  ;:             ceci empeche tes sprites d'apparaitre !!!
     EndIf
EndProcedure


Procedure Piece()
    If Afiche_piece_1 = #True
        ; MODIFIE PAR DOBRO 
        For spy=10 To 170 Step 20 :; la boucle des lignes !!!  Modifie ça pour voir ce que ça donne ;-)
            For spx=50 To 180 Step 20:; la boucle des colonnes
                DisplaySprite(#Piece_1,spx,spy)
            Next spx 
        Next spy
    EndIf
EndProcedure

Publié : mer. 23/juin/2004 1:23
par garzul
:D ok merci mais alors le false et le true ne sert a rien car si je laisse false tt disparais alors que je voudrai juste que sa disparait quand ya une collision ???

Publié : mer. 23/juin/2004 8:17
par Backup
figure toi que je m'attendai a une reaction comme celle-la !! :lol:


en fait c'est touta fait normal !!

au debut de ton programme

tu cree :

CreateSprite(#Piece_1, 10, 10 ) et CreateSprite(#Joueur_1, 10, 10 ) :;

combien ya de sprite de creé ??? reponse 2 !!!
le sprite du joueur , et le sprite piece !!

alors c'est vrai que tu fait des copie du sprite piece ..
Mais en fait tu ne copie que son image !!!
en realité tu ne copie pas d'ailleurs
tu affiche le meme sprite "piece" a des endroit different !!
et c'est la vitesse du purebasic qui donne l'impression qu'il y en a plusieur
un peut comme quand "satan petit coeur "(dragon ball ) se deplace tres tres vite et que l'on crois qu'il sont beaucoup !! alors qu'il est seul !! :)

moralité lorsqu'une collision se produit avec le joueur
quelque soit l'image de piece que le joueur touche
il touche en fait le MEME sprite !! (le sprite piece ) !!

deduction logic ; il te faut cree un sprite par piece affiché !!!
par exemple comme ça

Code : Tout sélectionner


; ceci va copier le sprite #piece_1 ;et cree 20 sprites numeroté de 3 a 23 avec la meme image
; l'ideal serai que le sprite #joueur soit egale a 1 ; #joueur=1
; et que le premier sprite #piece_1 soit lui egale a 2 ; #piece_1=2

for nombre_de_sprite = 3 to 23
    CopySprite(#Piece_1, nombre_de_sprite) 
next  nombre_de_sprite

; apres ceci tu a  21 sprite de piece qui vont du numero 2 a 23 !!!

 
il te faudra legerement modifier l'affichage des pieces
car pour l'instant je te rapel que tu n'affiche qu'un seul sprite !!!
allez cheche un peut c'est facile !! :D

Publié : mer. 23/juin/2004 8:21
par comtois
tu peux le faire avec un seul sprite , et une liste chainée , quand tu as une collision avec une piece , tu la supprimes de la liste chainee

et ensuite tu fais
ForEach Piece()
DisplaySprite(.....)
next

Va falloir apprendre à te servir des listes chainées , c'est très pratique , et simple quand on a compris :)

Bon je viens de modifier un peu ton code , pour te montrer comment fonctionne les listes chainées. ( et regarde aussi le tut de Crystal , je crois qu'il a fait un truc sur ce sujet :)

Code : Tout sélectionner

;enumeration des constant 
Enumeration 
  ;joueur 
  #Joueur_1 
  ;au cas ou 
  #Garzul=1 
  #Police=1 
  ;objet 
  #Piece_1 
  #Sprite3D 
  
EndEnumeration 

Structure Piece
  x.l
  y.l
EndStructure

NewList Piece.Piece()  ; Liste chainée pour la gestion des pieces

; ************ Declaration des procedures ********************** 
Declare MovePlayer() 
Declare Collision() 
Declare InitPiece()       ; Initialise la liste chainée et l'affichage des pieces
Declare AffichePiece()    ; affiche les pieces contenues dans la liste chainée

;global 
Global x 
Global y 
  ;les dimension du cercle 
Width=200 
Height=100 
  ;fin 
Global Afiche_piece_1 


      
Resultat = InitSprite() 
FontID = LoadFont(#Police, "arial", 18, #PB_Font_Bold ) 
EcranX = GetSystemMetrics_(#SM_CXSCREEN):; 
EcranY = GetSystemMetrics_(#SM_CYSCREEN):; 
WindowID = OpenWindow(1, 0, 0, 320, 200,  #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered , "pour Dobro:)") 

WindowID = WindowID(1) 
Result = OpenWindowedScreen(WindowID,0,0, 320, 200, 1, 0,0) 
  
;-sprite joueur 
CreateSprite(#Joueur_1, 10, 10 )    :; 
StartDrawing(SpriteOutput(#Joueur_1)) : 
DrawingMode(0) 
Circle(0, 0, 10 ,RGB(Random(255),Random(242),Random(185))) : 

:; voila on a fini de dessiner notre sprite 
  
StopDrawing() 

 ;-sprite objet 
;creation du sprite des pieces. 
CreateSprite(#Piece_1, 10, 10 ) 
StartDrawing(SpriteOutput(#Piece_1)) : 
 ;  ICI CORRIGE PAR DOBRO pour faire un cercle c'est simple pas besoin de boucle !! 
DrawingMode(0) 
Circle(5, 5, 5 ,RGB($FF,$FE,$00)) :; j'ai mis 5,5 car ton sprite a une cellule de 10x10 
StopDrawing() 
;fin des sprite 

Afiche_piece_1 = #True :; deplace par DOBRO !! 

;fin 


;-boucle et evenement 
InitPiece()
Repeat 
  
  Event =WindowEvent() : 
  Delay(5) 
  x+sensx  :;on ajoute (10) a la position colonne actuel du sprite 
  y+sensy :; ;on ajoute (10) a la position ligne actuel du sprite 
  If x>320-20 :; si le sprite arrive vers le bord droit de l'ecran - la largeur du sprite (10) 
    
    sensx=-sensx :; alors on inverse les coordonées en x (colonne) ceci va faire repartir le sprite dans l'autre sens 
  EndIf        
  If x<1 
    sensx=-sensx : ; si le sprite arrive a gauche de l'ecran on inverse ses coordonees !! 
    ;(pas besoin de compter la largeurdu sprite  puisque c'est le coin superieur GAUCHE qui compte !!) 
  EndIf 
  If y>200-10   : ; pareille si le sprite arrive en bas (c'est a dire le bas de l'ecran - la hauteur du sprite) 
    sensy=-sensy ; on inverse les coordonees (il rebondit) 
  EndIf 
  If y<1 
    sensy=-sensy :; pareille si le sprite arrive en haut !! 
  EndIf 
  
  
  DisplaySprite(#Joueur_1, x, y) :; enfin on met le sprite au bonne coordonées 
  
  AffichePiece() 
  Collision() 
  MovePlayer() 
  
  
  FlipBuffers() 
  ClearScreen(0, 0, 0) 
  
  InitKeyboard() 
  ExamineKeyboard() 
  
  
Until Event=#PB_Event_CloseWindow 
End    




;* *******************   Les PROCEDURES !!!!! ********************************** 

;-mouvement du joueur 
Procedure MovePlayer() 
  If KeyboardPushed(#PB_Key_Right) :x + 2  :EndIf 
  If KeyboardPushed(#PB_Key_Left) :x - 2  :EndIf 
  
  If x < 12 :x = 12 :EndIf 
  If x > 298 :x = 298 :EndIf 
  If KeyboardPushed(#PB_Key_Up) :y - 2  :EndIf 
  If KeyboardPushed(#PB_Key_Down) :y + 2  :EndIf 
  If y < 12 :y = 12 :EndIf 
  If y > 182 :y = 182 :EndIf 
  
EndProcedure 
Procedure Collision() 
  ; test chaque piece contenue dans la liste chainée 
  ForEach Piece()
    If SpriteCollision(#Joueur_1, x, y, #Piece_1, Piece()\x, Piece()\y) 
      ; si le joueur touche une piece ,on la supprime de la liste 
      DeleteElement(Piece())
    EndIf  
  Next  
EndProcedure 
Procedure AffichePiece() 
  ForEach Piece()
    DisplaySprite(#Piece_1, Piece()\x, Piece()\y) 
  Next 
EndProcedure 

Procedure InitPiece() 
  For spy=10 To 170 Step 20 :; la boucle des lignes !!!  Modifie ça pour voir ce que ça donne ;-) 
    For spx=50 To 180 Step 20:; la boucle des colonnes 
      AddElement(Piece())
      Piece()\x = spx
      Piece()\y = spy
      DisplaySprite(#Piece_1,spx,spy) 
    Next spx 
  Next spy 
EndProcedure 

Publié : mer. 23/juin/2004 8:41
par Dr. Dri
Là Dobro ca mérite un :0:

Ca sent les réflexes DarkBasic de l'utilisateur de sprites ca...
Le truc bien dans ton idée c'est de créer une "entité" par Piece
Le truc pas bien c'est de vouloir créer un sprite par piece !

Parce que là ca reviens à bouffer de la mémoire inutilement car
en fait tu ne fais qu'avoir en mémoire n fois le même élément...
Une surface identique à chaque fois...
Le truc à faire c'est donc de faire en sorte qu'avec un même
sprite on puisse gérer plusieurs pieces... Il est donc nécessaire de
stoquer l'état de chaque piece (x, y, affichage) et pour ca on a
besoin d'un simple tableau... Et si on est plus à l'aise une liste
chainée comme l'a suggéré comtois...

Dri :jesors:

Publié : mer. 23/juin/2004 9:06
par comtois
J'ai fait un peu le ménage pour y voir plus clair :)

c'est pas la peine de mettre initkeyboard() dans la boucle
c'est pas utile d'ajouter un : pour placer un commentaire sur une ligne
:; commentaire
tu peux faire
; commentaire
quand tu fais une enumeration , ça ne sert à rien d'écrire #Police=1
laisse enumeration le faire pour toi :)
ensuite ,ne mélange pas police et sprite , tu peux faire une énumeration par type .

Voila , à toi de bosser maintenant .

Code : Tout sélectionner

;Il ne Pas tout mélanger, police ,sprites , etc :)
;/Enumeration des sprites
Enumeration 
  #Joueur_1 ; joueur
  #Garzul   ; Au cas ou  
  #Piece_1  ;objet
EndEnumeration 
;/Enumeration des polices => pas obligatoire , tu peux faire #Police = 0
Enumeration 
  #Police
EndEnumeration

;/Structure d'une piece , on a pour l'instant ,juste besoin de connaitre les coordonnées de chaque pièce
Structure Piece
  x.l
  y.l
EndStructure

NewList Piece.Piece()  ; Liste chainée pour la gestion des pieces

; ************ Declaration des procedures ********************** 
Declare MovePlayer() 
Declare Collision() 
Declare InitPiece()       ; Initialise la liste chainée et l'affichage des pieces
Declare AffichePiece()    ; affiche les pieces contenues dans la liste chainée

;global 
Global x , y

;les dimension du cercle 
Width=200 
Height=100 
      
Resultat = InitSprite() 
InitKeyboard()  ;<<< inutile de le mettre dans la boucle !
FontID = LoadFont(#Police, "arial", 18, #PB_Font_Bold ) 
EcranX = GetSystemMetrics_(#SM_CXSCREEN) ; 
EcranY = GetSystemMetrics_(#SM_CYSCREEN) ; 
WindowID = OpenWindow(1, 0, 0, 320, 200,  #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered , "pour Dobro:)") 

WindowID = WindowID(1) 
Result = OpenWindowedScreen(WindowID,0,0, 320, 200, 1, 0,0) 
  
;-sprite joueur 
CreateSprite(#Joueur_1, 10, 10 )   
StartDrawing(SpriteOutput(#Joueur_1)) 
  DrawingMode(0) 
  Circle(SpriteWidth(#Joueur_1)/2, SpriteHeight(#Joueur_1)/2, 5 ,RGB(Random(255),Random(242),Random(185))) 
StopDrawing() 

;-sprite des pieces 
CreateSprite(#Piece_1, 10, 10 ) 
StartDrawing(SpriteOutput(#Piece_1)) 
  DrawingMode(0) 
  Circle(SpriteWidth(#Piece_1) / 2, SpriteHeight(#Piece_1) / 2, 5 ,RGB($FF,$FE,$00))
StopDrawing() 


;-boucle et evenement 
InitPiece()
Repeat 
  
  Event =WindowEvent() : 
  Delay(5) 
  AffichePiece() 
  Collision() 
  MovePlayer() 
  DisplaySprite(#Joueur_1, x, y) :; enfin on met le sprite aux bonnes coordonnées 
  
  FlipBuffers() 
  ClearScreen(0, 0, 0) 
  
  ExamineKeyboard() 
 
Until Event=#PB_Event_CloseWindow 
End    


;* *******************   Les PROCEDURES !!!!! ********************************** 

;-mouvement du joueur 
Procedure MovePlayer() 
  If KeyboardPushed(#PB_Key_Right) :x + 2  :EndIf 
  If KeyboardPushed(#PB_Key_Left) :x - 2  :EndIf 
  
  If x < 12 :x = 12 :EndIf 
  If x > 298 :x = 298 :EndIf 
  If KeyboardPushed(#PB_Key_Up) :y - 2  :EndIf 
  If KeyboardPushed(#PB_Key_Down) :y + 2  :EndIf 
  If y < 12 :y = 12 :EndIf 
  If y > 182 :y = 182 :EndIf 
  
EndProcedure 
Procedure Collision() 
  ; test chaque piece contenue dans la liste chainée 
  ForEach Piece()
    If SpriteCollision(#Joueur_1, x, y, #Piece_1, Piece()\x, Piece()\y) 
      ; si le joueur touche une piece ,on la supprime de la liste 
      DeleteElement(Piece())
    EndIf  
  Next  
EndProcedure 
Procedure AffichePiece() 
  ; Affiche toutes les pièces contenues dans la liste
  ForEach Piece()
    DisplaySprite(#Piece_1, Piece()\x, Piece()\y) 
  Next 
EndProcedure 

Procedure InitPiece() 
  For spy=10 To 170 Step 20 :; la boucle des lignes !!!  Modifie ça pour voir ce que ça donne ;-) 
    For spx=50 To 180 Step 20:; la boucle des colonnes 
      ;Ajoute une piece dans la liste 
      AddElement(Piece())
      ;Et mémorise les coordonnées de cette pièce
      Piece()\x = spx
      Piece()\y = spy
    Next spx 
  Next spy 
EndProcedure 

Publié : mer. 23/juin/2004 9:58
par Backup
dans ce cas a quoi sert le numero de sprite ???? :?

pis pour les collisions bonjour la galere !!! comment savoir que l'image 1
est en contact avec l'image 2 (j'ai bien dit image pas sprite)

je m'adresse a un debutant , c'est plus comprehensible en utilisant plusieurs sprite !!
de toute facon ça marche quand meme cette facon !!!

lorsque tu display le sprite numero 2 par exemple en dehors des limite de l'ecran
alors qu'il etait en plein millieu , le sprite disparait bien pourtant !!

DRI a dit :
Parce que là ca reviens à bouffer de la mémoire inutilement car
en fait tu ne fais qu'avoir en mémoire n fois le même élément...
Une surface identique à chaque fois...
oui et si pendant le jeu tu veux transformer tes pieces en lutins par exemple !!
ou bien une piece de temps en temps !!
c'est quant meme pratique de les differencier pour avoir tout de suite
le numero qui t'interresse de changer !!
sinon tu fait comment pour connaitre l'identité d'une image au hazard sur l'ecran ! ???? 8O




d'ailleurs c'est vrais j'ai toujours utiliser des language ou le sprite etait une entité a part entiere , je doit avouer que je comprend toujours pas comment le pure fonctionne avec les sprites qui en fait ne sont pas des sprites
mais des images !!!
ça reviens a faire des get image et put image !!!
et a surveiller toute les coincidences !! (bref on se tappe tout le boulot
en fait dans le musee j'avais deja eu un debat la dessus !!
pour moi , je regrette , mais le pure n'utilise pas de sprite !!!

il utilise des images numeroté nuance..
ya tromperie sur la marchandise !!! :)

alors le parametre numero de sprite ne sert qua differencier une image !!!
c'est nul !!!
j'aurai preferé des sprites qui seraient des cellule vides numerotés dans lequel ont puisse mettre ce qu'on veux comme image !!
et que le sprite soit referencé par ce numero de cellule
bref un BOB , un Sprite, un Vrais !!

pour la memoire occupé ça n'aurai pas perdu grand choses
car on aurai de cette facon pus stocker les images de sprite par planche
(pour l'annimation) ou unique de la mem facon !!
il y aurai juste eu une gestion un peut plus grande pour le purebasic de ces "cellules"
qui aurai permis de savoir a tout moment a l'aide de fonction comme le dark et plein d'autre basic , comme position_sprite=spritex(1)
et d'avoir a dispo dezs fonction comme en dark qui permettent de savoir
quel sprite a touché celui-ci ....

grand dommage c'est mon plus grand regret pour le pure !
et qui je pense fait reculer bon nombre de programmeur pour les jeux !!

j'ai demandé a fred si il pouvait nous faire des BOB qui repondent a ces
criteres , sans toucher au sprite actuel

mais il doit avoir d'autres preoccupations ! :?

et pis il ne semble pas avoir envie de faire un truc comme ça . :(

GARZUL ; je crois que ma collaboration a ton aprentissage sur les jeux
va s'arreter la !!
je ne suis donc pas qualifié pour les sprites en pure !!

(ça m'a pas empeché de faire un casse brique avec plus de 1000 sprites
en permanence a l'ecran gestion a la Darkbasic)
Mais DRI aurai surement fait la meme chose en 2 Kilooctets !!!
: )

donc je passe la main a DRI et a comtois !!!

c'est un Veritable appel a Fred pour la creation de BOBs !!!!!


:D [/quote]

Publié : mer. 23/juin/2004 10:45
par Backup
pour garzul :

tu peut recuperer des images de sprite ici ::

http://dioxaz.free.fr/objets.htm

Publié : mer. 23/juin/2004 10:49
par comtois
eh oh , tu charries là :)

Va falloir songer à t'adapter :lol:

C'est quand même très simple avec les listes chainées, tu fais ce que tu veux . Tu veux un numéro pour identifier tes "images" à l'écran ? ben tu l'ajoutes dans la structure . Et ensuite dans la boucle qui initialise les sprites ,tu fais ça

Code : Tout sélectionner

      AddElement(Piece()) 
      ;Et mémorise les coordonnées de cette pièce 
      Piece()\No = No
      Piece()\x = spx 
      Piece()\y = spy 
      No + 1
Et dans la boucle Collision si tu peux savoir quelle "image" est en collision

Tu as juste à tester Piece()\No pour connaitre le numero .

Même si ça ne sert à rien , comme ça tu es rassuré , ça calme tes angoisses :lol:


[EDIT]
Oublie le Dark , c'est pas une référence en matière de sprite :)

Si tu as fait du Div, ça marchait un peu sur ce principe , tu définissais un PROCESS , et dedans tu décrivais le comportement des sprites .
Un PROCESS TIR , Un PROCESS Vaisseau , etc

le principe de la liste chainée te permet de faire exactement la même chose .
Une procedure vaisseau , une procedure tir , etc

Et tu as juste à faire un

Code : Tout sélectionner

ForEach Tir()
Et ici tu décris le comportement d'un tir 
Next
Et c'est tout :)

Publié : mer. 23/juin/2004 10:59
par garzul
:D non par pas je confirme tu es bon mais vos nex code mon un ppeu gener car sa a changer tt mon prog :( autrement je vais me metre au c ou c++ car un gars ma dit que pure basic et pas un language de prog officiel (ou je sais plus) alors que le c ou le c++ sont des language .... je voudrai sazvpir si cetait vrai

Publié : mer. 23/juin/2004 11:04
par comtois
Tu pourras passer au C quand tu maitriseras PureBasic, ne brûle pas les étapes :)

et puis si tu t'attaques au C maintenant ,tu vas te décourager .

Purebasic est parfait pour apprendre la programmation .

On a un peu cassé ton code c'est vrai , mais c'est pour la bonne cause :)

Pour que tu puisses voir une autre façon de faire , libre à toi de choisir celle qui te convient le mieux ensuite.

Publié : mer. 23/juin/2004 16:07
par Chris
On m'a pas demandé mon avis, mais je le donne quand même !

A partir du moment ou un code fonctionne, pourquoi vouloir obliger à n'importe quel prix celui qui l'a fait à changer son systeme ?

Qu'est-ce que ça peut faire de savoir que de charger 20 fois le même sprite d'un Ko bouffe plus de mémoire que d'utiliser une liste chainée, quand on sait que les cartes actuelles, même bas de gamme, sont capables de traiter des millions d'opérations par secondes ?

C'est de l'économie de bouts de chandelles tout ça, surtout sur un code qui ne dépasse pas une centaine de lignes. (Et encore, là, je suis poli, sinon, je vous aurait parlé des mouches :lol: )

Personnellement, j'ai beaucoup d'estime pour la plupart des gens sur ce forum, que ce soit Dobro, Dri, Comtois, ou d'autres, mais je trouve qu'il y a des jours ou vous êtes vraiments lourds.

Depuis le début de ce post, Dobro aide Garzul sur son code.
Même si il a une approche différente de la vôtre, elle n'est pas obligatoirement mauvaise, (il suffit de voir son casse-brique!), et il sera toujours temps pour Garzul d'étudier une autre manière de faire quand il aura bien compris celle-ci.

Chris :)