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.
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.
Voici un screen du résultat :
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
@++