Pour GARZUL

Programmation avancée de jeux en PureBasic
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Pour GARZUL

Message par Backup »

tiens essaye de comprendre ça
si tu comprend ça tu peut faire des jeux 2D !!! :D




Code : Tout sélectionner

#dobro=1
#Police=1
#Sprite=1
; ***********************************
Resultat = InitSprite()
FontID = LoadFont(#Police, "arial", 18, #PB_Font_Bold )
EcranX = GetSystemMetrics_(#SM_CXSCREEN):;=largeur de l'ecran
EcranY = GetSystemMetrics_(#SM_CYSCREEN):;=hauteur de l'ecran
WindowID = OpenWindow(1, 0, 0, 320, 200,  #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered , "pour Garzul") 

WindowID = WindowID(1) 
Result = OpenWindowedScreen(WindowID,0,0, 320, 200, 1, 0,0)

CreateSprite(#Sprite, 10, 10 )    :; ici on créé un sprite de taille 10 par 10

StartDrawing(SpriteOutput(#Sprite)) :; on s'aprette a dessiner a l'interieur
; en faite en pure il faut considerer les sprites comme des cases vides !!!
Box(0, 0, 50, 50 , RGB(255,0,255) ) : ; on dessine une boite violette de la taille du sprite
StopDrawing() :; voila on a fini de dessiner notree sprite

x=100 :; on va place le sprite en colonne 100
y=100 ; et en ligne 100
sensx=10 :; ceci determine la vitesse de deplacement plus le chiffre est grand plus le sprite fait des grand pas
sensy=10 :; en y pareil !!
Repeat
    
     ;event=WaitWindowEvent():; ça ça ne l'est pas !!!
    event =WindowEvent() :; ça c'est multitache
    Delay(5) :; on rend la main au system pendant 
    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-10 :; si le sprite arrive vers le bord droit de l'ecran - la largeur du sprite (10)
        ; en fait la reference du sprite est son coin superieur gauche !!! 
        ;c'est pour ça que je tiens compte de la largeur du sprite 
        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(#Sprite, x, y) :; enfin on met le sprite au bonne coordonées
    
     
    FlipBuffers():;  on affiche l'ecran (pour que les gens voient le sprite ou il se trouve !
    ClearScreen(0, 0, 0) :; on efface l'ecran car sinon le sprite va laisser une copie de son image sur le fons de l'ecran
    ;(utile pour faire un TRON par exemple !!)
    
Until event=#PB_Event_CloseWindow  
Dernière modification par Backup le ven. 18/juin/2004 8:25, modifié 1 fois.
filperj
Messages : 395
Inscription : jeu. 22/janv./2004 1:13

Message par filperj »

#dobro=1
#Police=1
#Sprite=1
; *******
alors si j'ai bien suivi:

Code : Tout sélectionner

#dobro=1
#Police=1
  donc:
#dobro=#Police
alors faites attention :wink:

Code : Tout sélectionner

#Police=1
#Sprite=1
  donc:
#Police=#Sprite (mot anglais pour "Lutin")
Faites TRES attention!!! 8O
Le chaos l'emporte toujours sur l'ordre
parcequ'il est mieux organisé.
(Ly Tin Wheedle)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

:lol: :lol: :lol:

@garzul la constante #dobro est un relicat du squelette de programme
que j'utilise pour mes jeux (ben oui ça sert a rien de retaper toujours les meme commande d'ouverture de fenetre ect ...

@ Filperj : Ta Logique est imparable !! c'est pas Filperj que tu aurai du prendre comme pseudo , c'es Mr Spock !!! :lol: :lol: :lol: :lol:
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message par Crystal Noir »

3 constantes peuvent très bien être de même valeur, si elles ne font pas partie du même type (sprite ou fontes ou son...etc...).

Après tout dans un jeu, je peux très bien utiliser plusieurs constantes et je peux très bien avec deux constantes de même valeur si j'en ai besoin.

Ce qu'il ne faut pas en revanche c'est créer par ex deux sprites avec les mêmes valeurs constantes, là yaura conflict.
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Message par garzul »

salut vu que javais des probleme au niveau du forum (je pouvais pas me conecter car si je le faissai sa me mettai toujour voulez vous vous conecter alors que jetai conecter 8O )Autrement merci dobro je vais voir sa et le comprendre sans aide et merci . :P je te le dirai quand jaurais compri mais vu que je suis pas la du week end a++ les gars (et les fille mais bon jen ai pas encore vus sur le forum)lol :D
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Message par garzul »

Ok c bon jai compri jai fais sa pour comprendre et jai changer des petit truc pour comprendre regarde

Code : Tout sélectionner

#Garzul=1 
#Police=1 
#Sprite=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) 

CreateSprite(#Sprite, 10, 10 )    :;  

StartDrawing(SpriteOutput(#Sprite)) :
 Circle(0, 0, 10 ,RGB(Random(255),Random(42),Random(85))) : ; on dessine une boite violette de la taille du sprite 
StopDrawing() :; voila on a fini de dessiner notree sprite 

x=50 :; on va place le sprite en colonne 100 
y=100 ; et en ligne 100 
sensx=4 :; ceci determine la vitesse de deplacement plus le chiffre est grand plus le sprite fait des grand pas 
sensy=4 :; en y pareil !! 
Repeat 
    
     ;event=WaitWindowEvent():; ça ça ne l'est pas !!! 
    event =WindowEvent() :; ça c'est multitache 
    Delay(5) :; on rend la main au system pendant 
    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-10 :; si le sprite arrive vers le bord droit de l'ecran - la largeur du sprite (10) 
        ; en fait la reference du sprite est son coin superieur gauche !!! 
        ;c'est pour ça que je tiens compte de la largeur du sprite 
        sensx=-sensx :; alors on inverse les coordonées en x (colonne) ceci va faire repartir le sprite dans l'autre sens 
        MessageRequester("LOL","Attention vous depassez la matrix hihihihihihihi sur le coin droit",#PB_MessageRequester_Ok)
    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 !!) 
        MessageRequester("LOL","Attention vous depassez la matrix hihihihihihihi sur le coin gauche",#PB_MessageRequester_Ok)
    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(#Sprite, x, y) :; enfin on met le sprite au bonne coordonées 
    
      
    FlipBuffers():;  on affiche l'ecran (pour que les gens voient le sprite ou il se trouve ! 
    ClearScreen(0, 0, 0) :; on efface l'ecran car sinon le sprite va laisser une copie de son image sur le fons de l'ecran 
    ;(utile pour faire un TRON par exemple !!) 
    
Until event=#PB_Event_CloseWindow 
voila autremnt merci je vais essayer de faire un petit jeu a partir de sa mais ya que un seul truc que jai pas compri c pk tu met sa

Code : Tout sélectionner

   ;event=WaitWindowEvent():; ça ça ne l'est pas !!! 
    event =WindowEvent() :; ça c'est multitache 
    Delay(5) :; on rend la main au system pendant 
    x+sensx  :;on ajoute (10) a la position colonne actuel du sprite 
    y+sensy :; ;on ajoute (10) a la position ligne actuel du sprite 
car on cree la bouvle mais pk delay et les autre truc en bas 8O merci explique moi stp :D
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

;event=WaitWindowEvent():; ça ça ne l'est pas !!!
event =WindowEvent() :; ça c'est multitache
Delay(5) :; on rend la main au system pendant
x+sensx :;on ajoute (10) a la position colonne actuel du sprite
y+sensy :; ;on ajoute (10) a la position ligne actuel du sprite
ben si tu active la ligne : "event=WaitWindowEvent():; ça ça ne l'est pas !!!"( en mettant un point virgule devant la ligne)

et que tu desactive la ligne: "event =WindowEvent() :; ça c'est multitache"
en retirant le point virgule devant la ligne

tu verra que ton sprite bougera seulement si tu bouge la souris !!
bref avec "WaitWindowEvent()" le programme attend un evenement !!

alors qu'avec "event =WindowEvent()" il n'attend pas specialement un evenement
donc le program tourne mem si ta souris est immobile !!

le delay() apres la boucle sert dans le cas ou tu utilise

event =WindowEvent()
car en effet "WindowEvent()" n'attend pas d'evenement mais il prend beaucoup de temps cpu (pour le verifier sur XP lorsque le programe tourne tu appuis une seule fois sur Contrl + ALT + SUPR apres tu aura une fenetre qui te montre les processus et le temps CPU qu'il prennent !!)

donc pour empecher cette fonction d'etre trop performante on la
'deconnecte" le temps d'une pause !!"
avec un Delay(1) par exemple !!
il faut savoir que plus tu accorde de temps au system
moins le program prend de temps CPU , mais PLUS il s'accade !!!
c'est le revers de la medaille !!
mais avec des valeur de delay(1) a delay(20) c'est cool !!


les lignes en remarque (avec un point virgule devant)
qui ce trouve dans le listing m'on servi pour d'autre choses !!
en fait je me sert d'un squelette de programme pour les appli fenetré avec boutons
ou bien les applis fenetre type jeux !!!
comme ça je ne reecrit pas toujours les mem lignes
j'ai plus qu'a remplir mon squelette de programme pour faire un jeu !!


voici mon squelette de programme pour les jeux
(il y a le minimum )
c'est a dire une fenetre ,un ecran dedans, et la boucle qui attend que je mettes les fonction a l'interieur , mais le squelette peut etre lanc" comme ça ,il n'y a rien dedans mais le program est viable !!

Code : Tout sélectionner

#dobro=1
#Police=1
; *************ICI LES DECLARATIONS des Procedures**********************


; ************* ici les initialisation de variables et constantes et system *********

; la creation des sprites peut se faire ici !!!

Resultat = InitSprite()
FontID = LoadFont(#Police, "arial", 18, #PB_Font_Bold )
EcranX = GetSystemMetrics_(#SM_CXSCREEN):;=largeur de l'ecran
EcranY = GetSystemMetrics_(#SM_CYSCREEN):;=hauteur de l'ecran
WindowID = OpenWindow(1, 0, 0, EcranX, EcranY,  #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered , "hello") 

WindowID = WindowID(1) 
Result = OpenWindowedScreen(WindowID,0,0, EcranX, EcranY, 1, 0,0)
;******* ici les initialisation avant de rentrer dans la boucle **
; *********exemple lecture de DATA pour un tableau de decor de jeux *******

Repeat
   
    Event=WaitWindowEvent()
    StartDrawing( ScreenOutput()) 
    ; ici on dessine sur l'ecran avec les commande 2D
    ; on peut rajouter des sprites
    
    
    
    StopDrawing() 
    
    
    ; ici on affiche les sprites que l'on a cree !!
    
    ;DisplaySprite(#dobro, de, ysprite) :
    
    
    
    


  


FlipBuffers():; affiche l'ecran
ClearScreen(0, 0, 0) :;efface l'ecran

  Until Event=#PB_Event_CloseWindow 
PS les variable ecranx et ecranY contienne la resolution en cours !!
(Merci le Soldat !! )

donc si tu change la resolution de l'ecran le programme peut s'adapter
a la nouvelle resolution !!

ces variables sont mise a jour par l'api GetSystemMetrics_(#SM_CXSCREEN):;=largeur de l'ecran
donc mon squelette ouvre une fenettre de la taille de l'ecran !!
en cherchan sur le forum tu trouvera des code pour decouper la fenetre
de façon a ce qu'elle n'ait plus de bord !!!









:D
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Message par garzul »

:D merci je men vais regarde ce code et dis moi pk sa quitte lecran a droite et ect .. voila tienb le code (tu vois c presque un jeux)

Code : Tout sélectionner

Enumeration
#Joueur_1
#Garzul=1 
#Police=1 
EndEnumeration
Global X 
  Global Y      
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) 

CreateSprite(#Joueur_1, 10, 10 )    :;  

StartDrawing(SpriteOutput(#Joueur_1)) :
 Circle(0, 0, 10 ,RGB(Random(255),Random(42),Random(85))) : ; on dessine une boite violette de la taille du sprite 
StopDrawing() :; voila on a fini de dessiner notree sprite 



Procedure MovePlayer() 
 If KeyboardPushed(#PB_Key_Right) :x + 4  :EndIf 
  If KeyboardPushed(#PB_Key_Left) :x + 4  :EndIf
 
  If x < 12 :x = 12 :EndIf 
  If x > 487 :x = 487 :EndIf 
   If KeyboardPushed(#PB_Key_Up) :y + 4  :EndIf 
If KeyboardPushed(#PB_Key_Down) :y + 4  :EndIf  
   If y < 12 :y = 12 :EndIf 
  If y > 487 :y = 487 :EndIf 
  DisplaySprite(#Joueur_1,X,Y) 
EndProcedure 

Repeat
    
     ;event=WaitWindowEvent():; ça ça ne l'est pas !!! 
    event =WindowEvent() :; ça c'est multitache 
      Delay(5) :; on rend la main au system pendant 
    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-10 :; si le sprite arrive vers le bord droit de l'ecran - la largeur du sprite (10) 
        ; en fait la reference du sprite est son coin superieur gauche !!! 
        ;c'est pour ça que je tiens compte de la largeur du sprite 
        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() 
  DisplaySprite(#Joueur_1,0,0) 
  MovePlayer()
      
    :; on efface l'ecran car sinon le sprite va laisser une copie de son image sur le fons de l'ecran 
    ;(utile pour faire un TRON par exemple !!) 
    Until event=#PB_Event_CloseWindow 
    End   

Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

alors tu as fait une petite erreur d'inatention !!

Code : Tout sélectionner

 If KeyboardPushed(#PB_Key_Right) :x + 4  :EndIf
    If KeyboardPushed(#PB_Key_Left) :x + 4  :EndIf
    
    If x < 12 :x = 12 :EndIf
    If x > 487 :x = 487 :EndIf
    If KeyboardPushed(#PB_Key_Up) :y + 4  :EndIf
    If KeyboardPushed(#PB_Key_Down) :y + 4  :EndIf 
si tu appuis sur le touche fleche droite
tu augmente la ccoordonee popur que le vaisseau aille a droite
jusque la daccord !!
Mais si tu appuis sur la touche fleche gauche tu augmente encore la coordonée alors que si tu veut que ton vaissseau aill vers la gauche il faut la diminuer !!

car l'origine x=0 et y=0 est le coin superieur gauche de l'ecran !!
donc pour allez vers la gauche il faut aller ver le zero !!

donc si ta colonne est egale a 10 (par ex) ben faut DIMINUER le x

donc au lieu de

Code : Tout sélectionner

  If KeyboardPushed(#PB_Key_Left) :x + 4  :EndIf 
il faut faire

Code : Tout sélectionner

  If KeyboardPushed(#PB_Key_Left) :x - 4  :EndIf 

pareil pour descendre faut augmenter la coordonee y
mais pour monter faut la DIMINUER
et la encore tu a fait l'erreur !!

au lieu de

Code : Tout sélectionner

 If KeyboardPushed(#PB_Key_Up) :y + 4  :EndIf
il faut faire

Code : Tout sélectionner

 If KeyboardPushed(#PB_Key_Up) :y - 4  :EndIf


voila !!! sinon c'est un debut !!

autre chose tu limite ton vaisseau a 487 en colonne
alors que ton ecran est parametre pour etre avec 320 colonnes
donc il y a 487-320=167 pixel que tu vois pas !!
donc ton vaisseau s'arretera en colonne 487 de ton ecran
mais en dehors de ta fenetre !!!
mais tu ne le verra pas et tu aura l'impression que ton vaisseau sort de la fenetre
il sortira de la fenetre qui fait 320 mais pas de ton ecran qui fait 487 !!

fait en sorte que la limite de ton ecran soit la mem que ta fenetre
si tu veux pas que ton vaisseau sorte de la vue !!! :D [/quote]
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Message par garzul »

:D j'etais dans l'ile d'oleron re tt le monde et merci dobro le seul prob c que je comprend pas ce que tu as marquer pourle sprite qui continue je sais quil continue mais je narrive pas a le faire revenir ou que comme sa

Code : Tout sélectionner

Procedure MovePlayer() 
 If KeyboardPushed(#PB_Key_Right) :x + 4  :EndIf 
  If KeyboardPushed(#PB_Key_Left) :x - 4  :EndIf
 
  If x < 12 :x = 12 :EndIf 
  If x > 320 :x = 300 :EndIf 
   If KeyboardPushed(#PB_Key_Up) :y - 4  :EndIf 
If KeyboardPushed(#PB_Key_Down) :y + 4  :EndIf  
   If y < 12 :y = 12 :EndIf 
  If y > 200 :y = 180 :EndIf 
  DisplaySprite(#Joueur_1,X,Y) 
EndProcedure 
a++
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Message par garzul »

:D non en faite c bon jai decouvert mon prob en fait javais pas fait attention lol comme sa pour lecran

Code : Tout sélectionner

Procedure MovePlayer() 
 If KeyboardPushed(#PB_Key_Right) :x + 4  :EndIf 
  If KeyboardPushed(#PB_Key_Left) :x - 4  :EndIf
 
  If x < 12 :x = 12 :EndIf 
  If x > 300 :x = 300 :EndIf 
   If KeyboardPushed(#PB_Key_Up) :y - 4  :EndIf 
If KeyboardPushed(#PB_Key_Down) :y + 4  :EndIf  
   If y < 12 :y = 12 :EndIf 
  If y > 180 :y = 180 :EndIf 
  DisplaySprite(#Joueur_1,X,Y) 
EndProcedure 
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Message par garzul »

:D help me car en fait jarrive pas a afficher un autre sprite pk et comment faire?

Code : Tout sélectionner

Enumeration
#Joueur_1
#Garzul=1 
#Police=1 
#Piece_1
EndEnumeration
Global X 
  Global Y      
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) 

CreateSprite(#Joueur_1, 10, 10 )    :;  


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

 Circle(0, 0, 10 ,RGB(Random(255),Random(42),Random(85))) : ; on dessine un cercle de la taille du sprite 
 :; voila on a fini de dessiner notre sprite 
StopDrawing() 
;creation du sprite des pieces.
CreateSprite(#Piece_1, 10, 10 )    :;  
StartDrawing(SpriteOutput(#Piece_1)) :
DrawingMode(0) 

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



Procedure MovePlayer() 
 If KeyboardPushed(#PB_Key_Right) :x + 4  :EndIf 
  If KeyboardPushed(#PB_Key_Left) :x - 4  :EndIf
 
  If x < 12 :x = 12 :EndIf 
  If x > 300 :x = 300 :EndIf 
   If KeyboardPushed(#PB_Key_Up) :y - 4  :EndIf 
If KeyboardPushed(#PB_Key_Down) :y + 4  :EndIf  
   If y < 12 :y = 12 :EndIf 
  If y > 180 :y = 180 :EndIf 
  DisplaySprite(#Joueur_1,X,Y) 
EndProcedure 

Repeat
    
     ;event=WaitWindowEvent():
    event =WindowEvent() :
      Delay(5) :; on rend la main au system pendant 
    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) 
        ; en fait la reference du sprite est son coin superieur gauche !!! 
        ;c'est pour ça que je tiens compte de la largeur du sprite 
        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() 
  DisplaySprite(#Joueur_1,0,0) 

  MovePlayer()
      
    :; on efface l'ecran car sinon le sprite va laisser une copie de son image sur le fons de l'ecran 
    ;(utile pour faire un TRON par exemple !!) 
    Until event=#PB_Event_CloseWindow 
    End   
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Enumeration
#Joueur_1
#Garzul=1
#Police=1
#Piece_1
EndEnumeration
Global X
Global Y
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)

CreateSprite(#Joueur_1, 10, 10 ) :;


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

Circle(0, 0, 10 ,RGB(Random(255),Random(42),Random(85))) : ; on dessine un cercle de la taille du sprite
:; voila on a fini de dessiner notre sprite
StopDrawing()
;creation du sprite des pieces.
CreateSprite(#Piece_1, 10, 10 ) :;
StartDrawing(SpriteOutput(#Piece_1)) :
DrawingMode(0)

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



Procedure MovePlayer()
If KeyboardPushed(#PB_Key_Right) : x + 4 :EndIf
If KeyboardPushed(#PB_Key_Left) : x - 4 :EndIf

If x < 12 : x = 12 :EndIf
If x > 300 : x = 300 :EndIf
If KeyboardPushed( #PB_Key_Up ) : y - 4 :EndIf
If KeyboardPushed( #PB_Key_Down ) : y + 4 :EndIf
If y < 12 :y = 12 :EndIf
If y > 180 :y = 180 :EndIf
DisplaySprite( #Joueur_1,X,Y )
EndProcedure

Repeat

;event=WaitWindowEvent():
event =WindowEvent() :
Delay(5) :; on rend la main au system pendant
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)
; en fait la reference du sprite est son coin superieur gauche !!!
;c'est pour ça que je tiens compte de la largeur du sprite
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()
DisplaySprite(#Joueur_1,0,0)

MovePlayer()

:; on efface l'ecran car sinon le sprite va laisser une copie de son image sur le fons de l'ecran
;(utile pour faire un TRON par exemple !!)
Until event=#PB_Event_CloseWindow
End

la premiere ligne en rouge indique que tu place le sprite "#joueur"
pas "#piece_1"

et en plus ça va pas marcher car tu est dans une procedure !!
et dans les procedures les variables (x et y) sont local a la procedure
; c'est a dire qu'elles sont differente du "x" et "y" qui sont eux en dehors
de la procedure !! ; le x dedans pourrai par exemple etre egale a 5
alors que le x en dehors pourrai etre egale a 20 (par exemple)
c'est pas le meme x !!!!

regarde dans la doc a "Shared" et a "Global" !!

dans la deuxieme ligne rouge tu replace a nouveau le sprite #joueur a 0,0
ça ne sert a rien !! car ça le "colle" dans le coin haut a gauche pour rien
puisque tu le deplace a chaque fois avec les touches flechée !!

en fait je sais pas ce que tu veux faire du sprite #piece_1
si tu veux qu'il bouge avec tes fleches aussi ? ou
si tu veux qu'il soit autonome , auquel cas il te faudra lui atribuer ses propre coordonnées (surtout pas x et y qui sont deja pris par le sprite #joueur) !!!!



:)
:D
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Message par garzul »

:D ok merci mais en fait je veux que mon sprite soit afficher et quil reste fixe c des piece qui quand on va les prendre elle rajoute 10 au score voila?....
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Message par garzul »

:D le seul probleme c que je sais pas comment faire pour que ce soit automatuisee au lieu de faire sa manuellement car je suis obliger de replacer mes sprite alors que sa serait bien si sa pourrait le faire automatiquement

Code : Tout sélectionner

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 
a++
Répondre