Flappy Punchy

Programmation avancée de jeux en PureBasic
Avatar de l’utilisateur
venom
Messages : 3072
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Flappy Punchy

Message par venom »

Bonjour, voilà hier soir j'ai coder une copie du jeux Flappy Bird. Pour ceux qui ne connaissent pas, voici un lien vers une vidéo.
Flappy Bird est un jeu sur smartphone très basique, il suffi juste de passer entre des tuyaux en appuyant sur son écran.

A la base je l'avait conçu pour un punch, mais comme j'ai plusieurs sons et mes sprites ne sont pas sur une seul planche, j’étais hors course :)
Je vous le pose donc ici en zip avec tout ce qui va bien dedans. :wink:

Le jeu doit surement être mal codé et le résultat pourrait être beaucoup mieux, mais j'ai fait ça hier soir. le résultat me satisfait pour un code en une soirée. Comme je ne compte pas le présenter au pure punch ni le continuer, je met la source au cas ou. :wink:

Voici un screen du résultat :
Image

Pour jouer rien de plus simple ont lance l'exe puis ont jump avec la barre espace, et ont quitte avec échappe.

Voici la source :

Code : Tout sélectionner

; **************************************
; Flappy Punch
; Par : Venom
; Le : 31/07/2014
; PureBasic V 5.30
; **************************************
InitSprite()
InitKeyboard()
InitSound()
InitMouse() 
UsePNGImageDecoder()
UseOGGSoundDecoder()
PoliceID = LoadFont(0, "Arial", 50, #PB_Font_Bold)
PoliceID1 = LoadFont(1, "Arial", 20, #PB_Font_Bold)
dossier$ = ""
score = 0
direction = -2; vitesse de defilement du decort
ResRandom = Random(350); affichage aleatoire sur la hauteur du tuyau du haut
PosY = 301; position du joueur au depart
Declare SaveScore(score, PoliceID)
  
  If OpenWindow(0, 0, 0, 432, 768, "Flappy Punchy", #PB_Window_ScreenCentered)

    If OpenWindowedScreen(WindowID(0), 0, 0, 432, 768)
      LoadSprite(0, dossier$+"fond.png", 0) ; on charge le sprite fond
      LoadSprite(1, dossier$+"sol.png", #PB_Sprite_PixelCollision) ; on charge le sprite sol
      LoadSprite(2, dossier$+"tuyau haut.png", #PB_Sprite_AlphaBlending | #PB_Sprite_PixelCollision) ; on charge le sprite tuyau haut
      LoadSprite(3, dossier$+"tuyau bas.png", #PB_Sprite_AlphaBlending | #PB_Sprite_PixelCollision) ; on charge le sprite tuyau bas
      LoadSprite(4, dossier$+"perso.png", #PB_Sprite_AlphaBlending | #PB_Sprite_PixelCollision) ; on charge le sprite perso
      ClipSprite(4, 0, 37 , 51, 37)
      
      If CreateSprite(5, 75, 70, 0); --------------------\
        StartDrawing(SpriteOutput(5)); --------------------\
        DrawingMode(#PB_2DDrawing_Transparent); ------------\
        DrawingFont(PoliceID); -----------------------------/ on creer le sprite qui affichera le score
        DrawText(0, 0, Str(score), RGB(255, 255, 255), 0); -/
        StopDrawing(); ------------------------------------/
      EndIf 
      
      If CreateSprite(6, 410, 70, 0); ----------------------\
        StartDrawing(SpriteOutput(6)); ----------------------\
        DrawingMode(#PB_2DDrawing_Transparent); --------------\
        DrawingFont(PoliceID); -------------------------------/ on creer le sprite qui affichera game over
        DrawText(0, 0, "GAME OVER", RGB(255, 255, 255), 0); -/
        StopDrawing(); -------------------------------------/ 
      EndIf
      
      If CreateSprite(7, 415, 80, 0); -----------------------------------------\
        StartDrawing(SpriteOutput(7)); -----------------------------------------\
        DrawingMode(#PB_2DDrawing_Transparent); ---------------------------------\
        DrawingFont(PoliceID1); -------------------------------------------------/ on creer le sprite qui affichera ENTER new game, ESC to quit
        DrawText(0, 50, "ENTER new game, ESC to quit", RGB(255, 255, 255), 0); -/
        StopDrawing(); --------------------------------------------------------/
      EndIf
      
      LoadSprite(8, dossier$+"tableau.png", 0) ; on charge le sprite perso

      LoadSound(27, dossier$+"jump.ogg", 0); on charge le son du jump
      LoadSound(28, dossier$+"point.ogg", 0); on charge le son quand on marque 1 point
      LoadSound(29, dossier$+"crash.ogg", 0); on charge le son du crash
      
    EndIf
  EndIf
  
  Repeat
    FlipBuffers() 
    
    ClearScreen(RGB(0, 0, 0))
    ExamineMouse() 
    ReleaseMouse(0); on bloque la souris
    
;{ on affiche le fond a la position en X et Y 
;- on affiche le fond a la position en X et Y 
    DisplaySprite(0, 0, 0)
;}
    
;{ on affiche le tuyau du haut plus du bas en X et Y puis ont créer l'animation de déplacement
;- on affiche le tuyau du haut plus du bas en X et Y puis ont créer l'animation de déplacement
    x1 + direction
    If x1 > 0 : direction = direction : EndIf
    If x1 < -625 : x1 = -78 : ResRandom = Random(350): EndIf
    DisplayTransparentSprite(2, x1+550, ResRandom-350)
    DisplayTransparentSprite(3, x1+550, ResRandom+170)
    Delay(1)
;}
    
;{ on affiche le perso et on fait l'animation a l'appuie de la touche espace
;- on affiche le perso et on fait l'animation a l'appuie de la touche espace
    DisplayTransparentSprite(4, 191, PosY)
    If ExamineKeyboard()
     If KeyboardPushed(#PB_Key_Space)
      ClipSprite(4, 0, 37 , 51, 37)
      DisplayTransparentSprite(4, 191, PosY)
     EndIf
 
     If KeyboardReleased(#PB_Key_Space)
      PosY = PosY-45
      ClipSprite(4, 0, 0 , 51, 37)
      DisplayTransparentSprite(4, 191, PosY)
      PlaySound(27, 0, 100); on joue le son du jump
     EndIf

     If PosY < 566
      PosY = PosY+2
     ElseIf PosY = 566
      DisplayTransparentSprite(6, 10, 349); on affiche game over si le perso touche a terre
      DisplayTransparentSprite(7, 15, 380); et new game ou quit
      x = -90 : x1 = -90 : PosY = 566 
      SaveScore(score, PoliceID)
       If KeyboardReleased(#PB_Key_Return) ; on relance avec la touche entree et on remet le score a 0
        score = 0
        If CreateSprite(5, 75, 70, 0)
         StartDrawing(SpriteOutput(5))
         DrawingMode(#PB_2DDrawing_Transparent)
         DrawingFont(PoliceID)
         DrawText(0, 0, Str(score), RGB(255, 255, 255), 0)
         StopDrawing() 
        EndIf
       PosY = 301 
      EndIf 
     EndIf
    EndIf
;}
    
;{ on affiche le score
;- on affiche le score
    If x1+550  = 200
     score = score+1
     If CreateSprite(5, 75, 70, 0)
        StartDrawing(SpriteOutput(5))
        DrawingMode(#PB_2DDrawing_Transparent)
        DrawingFont(PoliceID)
        DrawText(0, 0, Str(score), RGB(255, 255, 255), 0)
        StopDrawing() 
      EndIf 
     PlaySound(28, 0, 100); on joue le son si on marque 1 point
    ElseIf x1+550  > -74
      score = score
     DisplayTransparentSprite(5, 191, 0)
    EndIf 
;}
    
;{ on affiche le sol a la position X et Y et ont créer l'animation de déplacement
;- on affiche le sol a la position X et Y et ont créer l'animation de déplacement
    DisplaySprite(1, x, 603)
    DisplaySprite(1, x+460, 603)
    x + direction
    If x > 0 : direction = direction : EndIf
    If x < -460 : x = 0 : EndIf
    Delay(1)
;} 
    
;{ on gère les collisions entre le perso les tuyaux le sol
;- on gère les collisions entre le perso les tuyaux le sol
     If SpritePixelCollision(4, 191, PosY, 2,  x1+550, ResRandom-350) <> 0; tuyau du haut
      PlaySound(29, 0, 100); on joue le son du crash
      SaveScore(score, PoliceID)
      PosY = 566 
     EndIf 
     
     If SpritePixelCollision(4, 191, PosY, 2,  x1+550, ResRandom+170) <> 0; tuyau du bas
      PlaySound(29, 0, 100); on joue le son du crash
      SaveScore(score, PoliceID)
      PosY = 566 
     EndIf 
    
     If SpritePixelCollision(4, 191, PosY, 1,  191, 603) <> 0; sol
       PosY = 566 
     EndIf 
;}
     
  Until KeyboardPushed(#PB_Key_Escape):End 
  
Procedure SaveScore(score, PoliceID)
OpenPreferences("Score.pref", 0)
Res = Val(ReadPreferenceString("1", ""))
If Res > score
ElseIf Res = score
ElseIf Res < score
WritePreferenceString("1", Str(score))
EndIf

DisplaySprite(8, 41, 115); on affiche le tableau
DisplayTransparentSprite(5, 90, 175); on affiche le score

If CreateSprite(9, 75, 70, 0); --------------------\
StartDrawing(SpriteOutput(9)); --------------------\
DrawingMode(#PB_2DDrawing_Transparent); ------------\
DrawingFont(PoliceID); -----------------------------/ on creer le sprite qui affichera le best score
DrawText(0, 0, Str(Res), RGB(255, 255, 255), 0); -/
StopDrawing(); ------------------------------------/
EndIf 
DisplayTransparentSprite(9, 270, 175); on affiche le best score
ClosePreferences()     
EndProcedure


Et voici le zip :
télécharger







@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: Flappy Punchy

Message par G-Rom »

c'est injouable :mrgreen:
Trop saccadé les mouvements, je vais te pondre un petit code ;)
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: Flappy Punchy

Message par G-Rom »

Intègre cela , ton jeu va être déjà plus jouable ;) :

Code : Tout sélectionner





OpenWindow(#PB_Any,0,0,640,480,"FlappyMove")
CanvasGadget(0,0,0,640,480,#PB_Canvas_Keyboard)



Angle.f = -90 ; pointe vers le haut de l'écran
              ; 0° est égale à droite 


YPos.f  = 240
XPos.f  = 320
BirdSpeed.f = 0


DeltaTime.f = 0 ; pour le framerate constant

While #True 
  
  If WindowEvent() = #PB_Event_CloseWindow
    Break
  EndIf 
  
  Time = ElapsedMilliseconds()
  
  
  
  ; on reduis l'angle
  ;
  Angle + 500 * DeltaTime
  BirdSpeed + 10 * DeltaTime
  
  
  If BirdSpeed > 1 : BirdSpeed = 1 : EndIf
  If BirdSpeed < 0   : BirdSpeed = 0   : EndIf
  
  ; On bloque l'angle à 90 soit un mouvement possible de 180°
  ;
  If Angle > 90  : Angle = 90  :  EndIf   
  If Angle < -90 : Angle = -90 : EndIf 
  
  ; On bouge seulement l'axe Y suivant l'angle
  ;
  YPos + BirdSpeed * Sin(Angle*#PI/180)
  
  
  ; On simule un saut toutes les 1400ms
  ;
  If SimuleJump < ElapsedMilliseconds()
    SimuleJump = ElapsedMilliseconds() + 1400
    Angle = -90
  EndIf
  
    
  
  StartDrawing(CanvasOutput(0))
  Box(0,0,640,480,$FFFFFF)
  
  
    Circle(XPos,YPos,5,$555555)
    
    x2.f = XPos + 100 * Cos(Angle*#PI/180)
    y2.f = YPos + 100 * Sin(Angle*#PI/180)
    
    LineXY(XPos,YPos,x2,y2,RGB(255,0,0))
    
    
  StopDrawing()
  
  
  
  DeltaTime = (ElapsedMilliseconds() - Time) / 1000
  DeltaTime / 4 ; juste pour ralentir le framerate
  
Wend 
Avatar de l’utilisateur
venom
Messages : 3072
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Flappy Punchy

Message par venom »

Mais euh!!! il est jouable mon jeu MDR :lol: j'arrive a des bon score :P
En effet avec ta démo le résultat devrait être plus fluide et plus sympa a jouer. :D
Merci du code je verrais plus tard pour une adaptation.






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Répondre