Page 1 sur 1

La base pour programmer un jeux 2D

Publié : lun. 21/févr./2011 15:24
par blendman
salut

merci pour ce tutoriel. C'est pas mal du tout pour débuter (c'est mon cas).
J'ai voulu ajouter des "declare" pour les procédures, en début de code. J'ai aussi voulu changer la couleur de chaque balle. Et je rencontre 2 petits bugs que je ne sais pas encore résoudre.

voici le code que j'ai corrigé et bidouillé :) :

Code : Tout sélectionner

;{ Constantes et variables
nombre_balle=4; On veut 5 balles. Dans les boucles les sprites commencent a 0 !! donc on retire 1 a notre nombre de sprite

; utilisation des Constantes
Enumeration
    #Window ; defini le numero de la fenetre employé
    #Police
    #raquette
  EndEnumeration
  ;}  

;{ Structure
Structure raquette
    x.l ; position x de la raquette
    y.l ;position y de la raquette
    pas_x.l ; le deplacement en pixel en X
    pas_y.l ; le deplacement en pixel en Y
EndStructure
Global Dim raquette.raquette(1) ; une seul raquette

Structure ball
    x.l
    y.l
    pas_x.l
    pas_y.l
    vie.b
    color.a ; byte de 0 à 255, pour définir la couleur
    balle.l ; le sprite de chaque balle
EndStructure
Global Dim ball.ball(nombre_balle)
;}

;{ Initialisation
InitKeyboard () :; j'espere qu'il y a un clavier au moins !!
Resultat = InitSprite ()
FontID = LoadFont ( #Police , "arial" , 18, #PB_Font_Bold )
EcranX = 1024;GetSystemMetrics_ ( #SM_CXSCREEN ): ;=largeur de l'ecran
EcranY = 768;GetSystemMetrics_ ( #SM_CYSCREEN ): ;=hauteur de l'ecran
;}

;{ declaration des procedures
Declare ScreenRedraw()
Declare UpdateMap()
;}

;{ Fenetre- ecran

WindowID = OpenWindow (#Window, 0, 0,EcranX, EcranY, "Jeu de baballe" , #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered )
  Result = OpenWindowedScreen ( WindowID (#Window),0,0, EcranX,EcranY, 1, 0,0)
  
  For i=0 To nombre_balle 
        ball(i)\color=RGB(Random(255),Random(255),Random(255)); couleur de la balle
    ; ******* creation d'un sprite Balle************
    If CreateSprite (ball(i)\balle,32,32) ; on creer un sprite vide (une cellule) de 32 par 32 et on lui donne le numero 1
        StartDrawing ( SpriteOutput (ball(i)\balle) ) ; on va dessiner dedans !
            Circle (16,16,16,ball(i)\color) ; on dessine un cercle rouge, ce sera la balle
        StopDrawing ()
      EndIf
      Next i
    ; ***********************************************
   
    ; ******* creation d'un sprite raquette************
    If CreateSprite (#raquette,128,16) ; on creer un sprite vide (une cellule) de 32 par 32 et on lui donne le numero 1
        StartDrawing ( SpriteOutput (#raquette) ) ; on va dessiner dedans !
            Box (1,1,128, 16,RGB (0,255,0)) ; on dessine un cercle rouge, ce sera la balle
        StopDrawing ()
    EndIf
    ; ***********************************************
   
    ; *********************definition des position au debut du jeux ********************
    For i=0 To nombre_balle
        ball(i)\x=EcranX/2 ; on centre les coordonées du sprite en x
        ball(i)\y=EcranY-64 ; on defini la position de la bal en y
    Next i
   
    raquette(1)\x=EcranX/2 ; on centre les coordonées de la raquette en x
    raquette(1)\y=EcranY-32 ; on defini la position de la raquette en y
    ; ****************************************************************************
   
    ; ***initialisation de la vitesse de la balle***
    For i= 0 To nombre_balle
        des=Random(1)
        ball(i)\pas_x= Random(8)+2 ; vitesse de la ball en x
        If des=0
            ; on ne fait rien , on laisse le chiffre positif la balle partira a droite
        Else
            ball(i)\pas_x= -ball(i)\pas_x ; le chiffre est negatif, la balle partira a gauche
        EndIf
       
        ball(i)\pas_y=-Random(8)-2 ; vitesse de la ball en y
        ball(i)\vie=1 ; on donne la vie a notre balle !
    Next i
    ; *************************************
    ;}
    
;{ boucle principale
    Repeat
       
        Event= WindowEvent ()
        ;Delay (2)   
        ExamineKeyboard ()
        UpdateMap()       
        FlipBuffers (): ; affiche l'ecran   
        ScreenRedraw() 
        
      Until Event= #PB_Event_CloseWindow Or KeyboardPushed ( #PB_Key_Escape ) ; press touche droit 
      ;}    
      
 Procedure ScreenRedraw() 
   ClearScreen(RGB(150,150,150))
 EndProcedure
  
 Procedure UpdateMap()
   Shared FontID, EcranX
 
        ; ************ gere le deplacement de la raquette ****************************
        If KeyboardPushed ( #PB_Key_Left ) ; press touche gauche
            ;   Debug " press touche gauche"
            raquette(1)\x=raquette(1)\x-16
            If raquette(1)\x<0
                raquette(1)\x=0
            EndIf
        EndIf
        If KeyboardPushed ( #PB_Key_Right ) ; press touche droit
            ;  Debug " press touche droit"
            raquette(1)\x=raquette(1)\x+16
            If raquette(1)\x>(EcranX-128)
                raquette(1)\x=(EcranX-128)
            EndIf
        EndIf
        ; ************************************************************************
        For u=0 To nombre_balle
            If ball(u)\vie=1 ; si la ball est en vie
                ; gere le deplacement de la balle  , ainsi que son rebond , et collision  !!  (et oui tout ça )
               
                ; *****  le deplacement ****
                ball(u)\x=ball(u)\x+ball(u)\pas_x ; passe son temp a ajouter le pas
                ball(u)\y=ball(u)\y+ball(u)\pas_y
                ; ***********************
               
                ; ********************* Collision avec l'ecran ******************************************
                ; gere le rebond sur les murs representés pas les bords de l'ecran !
                ; pour les X
                ; teste si la balle sort a droite
                If ball(u)\x>(EcranX-32)  ; si le X balle est superieur au X de l'ecran moins 32 ( le bord droit de l'ecran )
                    ball(u)\pas_x=-ball(u)\pas_x ; inverse le mouvement
                EndIf
                ; test si la balle sort a gauche
                If ball(u)\x<0 ; si le x de la ball est plus petit que 0 ( le bord gauche de l'ecran )
                    ball(u)\pas_x=-ball(u)\pas_x ; inverse le mouvement
                EndIf
                ; pour les Y
                ; test si la balle sort en haut de l'ecran
                If ball(u)\y<0
                    ball(u)\pas_y=-ball(u)\pas_y ; inverse le mouvement
                EndIf
               
                ; ***************position par rapport a la Raquette **************************
                ; test si la balle sort en bas ( enfin si elle depasse la raquette !!! ) donc balle pas ratrappé
                If ball(u)\y>(raquette(1)\y+16 )
                    ball(u)\vie=0 ; balle est morte !  sniff !
                EndIf
            EndIf
           
            ; ******************* Collision entre ball et raquette **************************
           
            If SpritePixelCollision(ball(u)\balle, ball(u)\x, ball(u)\y, #raquette, raquette(1)\x, raquette(1)\y)
                ; inversion du pas de deplacement des y de la balle
                ball(u)\pas_y=-ball(u)\pas_y ; inverse le mouvement
            EndIf
           
           
            ; ***************************************************************************
           
           
            ; ********* AFFICHAGE **************************************************
            DisplaySprite (#raquette,raquette(1)\x ,raquette(1)\y ) ; affiche le sprite  raquette au coordonées modifié par les touches
            If ball(u)\vie=1
                DisplaySprite (ball(u)\balle,ball(u)\x ,ball(u)\y ) ; affiche le sprite balle
            Else ; la balle est morte
                StartDrawing(ScreenOutput())
                    DrawingFont(FontID)
                    DrawText(10,10,"Perdu",RGB($EC,$F8,$7))
                StopDrawing()
               
            EndIf
          Next u
 EndProcedure
        
Quand on lance le jeu, ça fonctionne, mais toutes les balles sont au même endroit et je crois de la même couleur. Une idée de ce que j'ai mal fait :) ?*
Merci.

Re: La base pour programmer un jeux 2D

Publié : lun. 21/févr./2011 16:08
par Backup
..........................

Re: La base pour programmer un jeux 2D

Publié : lun. 21/févr./2011 19:01
par blendman
salut Dobro, merci pour ta réponse ;)
Dobro a écrit :Sujet déplacé !!

je rappel que les Tutos ne sont pas un lieu de discussion !
le forum Débutants sert a poser vos questions ... Merci :)
Ah oui, désolé, pourtant j'avais lu le règlement, et même le sujet sur les boulets, mais j'ai fait mon boulet, là ;).

si tu veux que la structure par balle soit a des coordonnées différentes
il te faut les initier avec des coordonnées différentes
comme ça éventuellement

Code : Tout sélectionner

  ; *********************definition des position au debut du jeux ********************
For i=0 To nombre_balle
  ball(i)\x=Random(EcranX/2) ; on centre les coordonées du sprite en x
  ball(i)\y=EcranY-64 ; on defini la position de la bal en y
Next i
Effectivement, c'est ce que j'avais aussi essayer, mais c'est la suite qui me manquait :
et ne pas oublier de mettre
Global nombre_balle=4; en ligne 1 ;)
Si je comprends bien la logique des procedures, on pourrait dire pour simplifier qu'une procédure est une fonction et qu'il faut pour que cela fonctionne que les variables utilisées par la procédure soient soit directement dans le code de la procédure soit globales, c'est ça ?

d'autre part tu fais l'erreur qu'on fait touts lorsqu'on viens d'un basic autre que Purebasic :)
tu veux donner un index diffèrent a chaque sprite
Purebasic ne marche pas comme ça ;)

un sprite c'est d'abord une image , cette image peut etre unique et servir
a 100000 sprite :)
inutile donc de creer autant d'index pour les images :)
En fait, j'avais volontairement créer 1 index différent par balle, car je voulais changer la couleur de chaque balle.
Et j'ai donc supposé que je pouvais changer la couleur du sprite en créant simplement plusieurs sprite, car je ne sais pas s'il existe des fonctions de transformations de sprite directement dans purebasic, comme par ex : changement de couleur, de taille (X et Y), de rotation, d'alpha, etc..
Je suppose que c'est possible de changer ces paramètres d'un même sprite sur plusieurs "objets" (balle par ex), mais je ne sais pas encore comment faire ça.
Je viens tout juste de commencer purebasic (hier) et je n'ai pas fait de basic avant, et très peu de C (je me suis arrêté avant les pointeurs, c'est pour dire :)).

Mais même en créant plusieurs sprites, mon code ne marche pas :P :

Code : Tout sélectionner

WindowID = OpenWindow (#Window, 0, 0,EcranX, EcranY, "Jeu de baballe" , #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered )
  Result = OpenWindowedScreen ( WindowID (#Window),0,0, EcranX,EcranY, 1, 0,0)
  
  For i=0 To nombre_balle 
        ball(i)\color=RGB(Random(255),Random(255),Random(255)); couleur de la balle
    ; ******* creation d'un sprite Balle************
    If CreateSprite (ball(i)\balle,32,32) ; on creer un sprite vide (une cellule) de 32 par 32 et on lui donne le numero 1
        StartDrawing ( SpriteOutput (ball(i)\balle) ) ; on va dessiner dedans !
            Circle (16,16,16,ball(i)\color) ; on dessine un cercle, ce sera la balle
        StopDrawing ()
      EndIf
  Next i
    ; ***********************************************
   
    ; ******* creation d'un sprite raquette************
    If CreateSprite (#raquette,128,16) ; on creer un sprite vide (une cellule) de 128 par 32 et on lui donne le numero 1
        StartDrawing ( SpriteOutput (#raquette) ) ; on va dessiner dedans !
            Box (1,1,128, 16,RGB (0,255,0)) ; on dessine 
        StopDrawing ()
    EndIf
Je suppose que ce n'est pas comme ça que l'on change le paramètre d'un sprite utilisé par plusieurs "objets".