Samples Gallery & Reference > Games
Flappy Bird Clone by Terry Ritchie
(1/1)
Qwerkey:
Flappy Bird
Author: @TerryRitchie
Source: qb64.org Forum
URL: https://www.qb64.org/forum/index.php?topic=437.0
Version: 1
Tags: [Graphics], [2D], [Game], [Side-scroller]
Description:
Here's an oldie, my QB64 version of FlappyBird. I used this program as an introduction to game programming in the course I used to teach.
Source Code:
Note the source code is given here for reference. You will need all the files from the .zip
--- Code: QB64: --- ' ----------------------------------------------- ' QB64 FlappyBird Clone by Terry Ritchie 02/28/14 ' ' This program was created to accompany the QB64 ' Game Programming course located at: ' http://www.qb64sourcecode.com ' ' You may not sell or distribute this game! It ' was made for instructional purposes only. ' ' Update: 04/29/20 ' ' Added EXE icon support in lines 18 and 19 ' Any key press now starts game in line 274 ' Any key press now flaps bird in line 196 ' ' ----------------------------------------------- $EXEICON:'.\fbird.ico' _ICON '-------------------------------- '- Variable declaration section - '-------------------------------- CONST FALSE = 0 ' boolean: truth 0 CONST TRUE = NOT FALSE ' boolean: truth -1 CONST LARGE = 0 ' large numbers CONST SMALL = 1 ' small numbers (not used in current version of game) CONST GOLD = 0 ' gold medal CONST SILVER = 1 ' silver medal CONST LIGHT = 0 ' light colored gold/silver medal CONST DARK = 1 ' dark colored gold/silver medal TYPE PARALLAX ' parallax scenery settings image AS LONG ' scene image x AS INTEGER ' scene image x location y AS INTEGER ' scene image y location frame AS INTEGER ' current parallax frame fmax AS INTEGER ' maximum parallax frames allowed END TYPE TYPE INFLIGHT ' flappy bird inflight characterisitcs y AS SINGLE ' flappy bird y location yvel AS SINGLE ' flappy bird y velocity flap AS INTEGER ' wing flap position flapframe AS INTEGER ' wing flap frame counter angle AS INTEGER ' angle of flappy bird END TYPE TYPE PIPE ' pipe characteristics x AS INTEGER ' pipe x location y AS INTEGER ' pipe y location END TYPE DIM Pipes(3) AS PIPE ' define 3 moving sets of pipes DIM Pipe&(1) ' pipe images 0=top 1=bottom DIM PipeImage& ' all three pipes drawn image DIM Birdie AS INFLIGHT ' bird flight characteristics DIM Scenery(4) AS PARALLAX ' define 4 moving scenes in parallax DIM Fbird&(8, 3) ' flapping bird images DIM Num&(9, 1) ' big and small numeral images DIM Plaque& ' medal/score plaque DIM FlappyBird& ' Flappy Bird title image DIM GameOver& ' Game Over image DIM GetReady& ' Get Ready image DIM Medal&(1, 1) ' gold/silver medal images DIM Finger& ' tap finger image DIM ScoreButton& ' score button image DIM ShareButton& ' share button image DIM StartButton& ' start button image DIM OKButton& ' OK button image DIM RateButton& ' RATE button image DIM MenuButton& ' MENU button image DIM PlayButton& ' PLAY [|>] button image DIM PauseButton& ' PAUSE [||] button image DIM HazardBar& ' Hazard bar parallax image DIM Clouds& ' Clouds parallax image DIM City& ' Cityscape parallax image DIM Bushes& ' Bushes parallax image DIM New& ' red NEW image DIM Clean& ' clean playing screen image DIM HitBird% ' boolean: TRUE if bird hits something DIM HighScore% ' high score DIM Score% ' current score DIM Paused% ' boolean: TRUE if game paused DIM Ding& ' ding sound DIM Flap& ' flapping sound DIM Smack& ' bird smack sound DIM Latch% ' boolean: TRUE if mouse button held down DIM WinX% ' stops player from exiting program at will '------------------------ '- Main Program Section - '------------------------ SCREEN _NEWIMAGE(432, 768, 32) ' create 432x768 game screen _TITLE "FlappyBird" ' give window a title CLS ' clear the screen _DELAY .5 ' slight delay before moving screen to middle _SCREENMOVE _MIDDLE ' move window to center of desktop WinX% = _EXIT ' program will handle all window close requests LOADASSETS ' set/load game graphics/sounds/settings Birdie.flap = 1 ' set initial wing position of bird DO ' BEGIN MAIN GAME LOOP _LIMIT 60 ' 60 frames per second UPDATESCENERY ' update parallaxing scenery _PUTIMAGE (40, 265), FlappyBird& ' place game title on screen _PUTIMAGE (350, 265), Fbird&(2, FLAPTHEBIRD%) ' place flapping bird on screen IF BUTTON%(64, 535, StartButton&) THEN PLAYGAME ' if start button pressed play game IF BUTTON%(248, 535, ScoreButton&) THEN SHOWSCORE ' if score button pressed show scores IF BUTTON%(248, 480, RateButton&) THEN RATEGAME ' if rate button pressed bring up browser _DISPLAY ' update screen with changes LOOP UNTIL _KEYDOWN(27) OR _EXIT ' END MAIN GAME LOOP when ESC pressed or window closed CLEANUP ' clean the computer's RAM before leaving SYSTEM ' return to Windows desktop '------------------------------------- '- Subroutines and Functions section - '------------------------------------- '---------------------------------------------------------------------------------------------------------------------- FUNCTION FLAPTHEBIRD% () '* '* Returns the next index value used in Fbird&() to animate the bird's '* flapping wings. '* SHARED Birdie AS INFLIGHT Birdie.flapframe = Birdie.flapframe + 1 ' increment frame counter IF Birdie.flapframe = 4 THEN ' hit limit? Birdie.flapframe = 0 ' yes, reset frame counter Birdie.flap = Birdie.flap + 1 ' increment flap counter IF Birdie.flap = 4 THEN Birdie.flap = 1 ' reset flap counter when limit hit END IF FLAPTHEBIRD% = Birdie.flap ' return next index value END SUB '---------------------------------------------------------------------------------------------------------------------- SUB MOVEPIPES () '* '* Creates and moves the pipe images across the screen. '* SHARED Pipes() AS PIPE, Pipe&(), PipeImage&, Paused%, Score%, Ding& DIM p% ' counter indicating which pipe being worked on _DEST PipeImage& ' work on this image CLS , _RGBA32(0, 0, 0, 0) ' clear image with transparent black _DEST 0 ' back to work on screen DO ' BEGIN PIPE LOOP p% = p% + 1 ' increment pipe counter IF NOT Paused% THEN ' is game paused? Pipes(p%).x = Pipes(p%).x - 3 ' no, move pipe to the left IF Pipes(p%).x < -250 THEN ' hit lower limit? Pipes(p%).x = 500 ' yes, move pipe all the way right Pipes(p%).y = -(INT(RND(1) * 384) + 12) ' generate random pipe height position END IF IF Pipes(p%).x = 101 THEN ' is pipe crossing bird location? _SNDPLAY Ding& ' play ding sound Score% = Score% + 1 ' increment player score END IF END IF IF Pipes(p%).x > -78 AND Pipes(p%).x < 432 THEN ' is pipe currently seen on screen? _PUTIMAGE (Pipes(p%).x, Pipes(p%).y), Pipe&(0), PipeImage& ' place top pipe _PUTIMAGE (Pipes(p%).x, Pipes(p%).y + 576), Pipe&(1), PipeImage& ' place bottom pipe END IF LOOP UNTIL p% = 3 ' END PIPE LOOP when all pipes moved _PUTIMAGE (0, 0), PipeImage& ' place pipe image on screen END SUB '---------------------------------------------------------------------------------------------------------------------- SUB FLYBIRDIE () '* '* Controls the flight of bird on screen. '* SHARED Birdie AS INFLIGHT, Fbird&(), Paused%, Flap&, HitBird%, Latch%, Smack& DIM b% ' boolean: TRUE if left mouse button pressed DIM Angle% ' angle of bird in flight IF NOT Paused% THEN ' is game paused? WHILE _MOUSEINPUT: WEND ' no, get latest mouse information b% = _MOUSEBUTTON(1) ' get left mouse button status IF _KEYHIT > 0 THEN b% = -1 ' any key will also make bird flap (added 04/29/20) IF NOT b% THEN Latch% = FALSE ' release latch if button let go IF NOT HitBird% THEN ' has bird hit something? IF NOT Latch% THEN ' no, has left button been release? IF b% THEN ' yes, was left button pressed? Birdie.yvel = -8 ' yes, reset bird y velocity _SNDPLAY Flap& ' play flap sound Latch% = TRUE ' remember mouse button pressed END IF END IF END IF Birdie.yvel = Birdie.yvel + .5 ' bleed off some bird y velocity Birdie.y = Birdie.y + Birdie.yvel ' add velocity to bird's y direction IF NOT HitBird% THEN ' has bird hit something? IF Birdie.y < -6 OR Birdie.y > 549 THEN ' no, has bird hit top/bottom of screen? HitBird% = TRUE ' yes, remeber bird hit something _SNDPLAY Smack& ' play smack sound END IF END IF IF Birdie.yvel < 0 THEN ' is bird heading upward? Birdie.angle = 1 ' yes, set angle of bird accordingly ELSE Angle% = INT(Birdie.yvel * .5) + 1 ' calculate angle according to bird velocity IF Angle% > 8 THEN Angle% = 8 ' keep angle within limits Birdie.angle = Angle% ' set bird angle END IF END IF _PUTIMAGE (100, Birdie.y), Fbird&(Birdie.angle, FLAPTHEBIRD%) ' place bird on screen END SUB '---------------------------------------------------------------------------------------------------------------------- SUB UPDATESCORE () '* '* Displays player's score on screen. '* SHARED Num&(), Score% DIM s$ ' score in string format DIM w% ' width of score string DIM x% ' x location of score digits DIM p% ' position counter s$ = LTRIM$(RTRIM$(STR$(Score%))) ' convert score to string w% = LEN(s$) * 23 ' calculate width of score x% = (432 - w%) \ 2 ' calculate x position of score FOR p% = 1 TO LEN(s$) ' cycle through each position in score string _PUTIMAGE (x%, 100), Num&(ASC(MID$(s$, p%, 1)) - 48, LARGE) ' place score digit on screen x% = x% + 23 ' move to next digit position NEXT p% END SUB '---------------------------------------------------------------------------------------------------------------------- SUB READY () '* '* displays instructions to the player and waits for player to start game. '* SHARED Fbird&(), Finger&, GetReady& DIM b% ' boolean: TRUE if left mouse button pressed DO ' BEGIN READY LOOP _LIMIT 60 ' 60 frames per second UPDATESCENERY ' move parallax scenery _PUTIMAGE (180, 350), Finger& ' place finger instructions on screen _PUTIMAGE (85, 225), GetReady& ' place get ready image on screen _PUTIMAGE (100, 375), Fbird&(2, FLAPTHEBIRD%) ' place bird on screen UPDATESCORE ' place score on screen _DISPLAY ' update screen with changes WHILE _MOUSEINPUT: WEND ' get latest mouse information b% = _MOUSEBUTTON(1) ' get status of left mouse button IF _KEYHIT > 0 THEN b% = -1 ' any key press will also begin game (added 04/29/20) IF _EXIT THEN CLEANUP: SYSTEM ' leave game if user closes game window LOOP UNTIL b% ' END READY LOOP when left button pressed _DELAY .2 ' slight delay to allow mouse button release END SUB '---------------------------------------------------------------------------------------------------------------------- SUB PLAYGAME () '* '* Allows player to play the game. '* SHARED Pipes() AS PIPE, Birdie AS INFLIGHT, PauseButton&, PlayButton&, Paused%, HitBird%, Score% RANDOMIZE TIMER ' seed random number generator Score% = 0 ' reset player score Birdie.y = 0 ' reset bird y location Birdie.yvel = 0 ' reset bird y velocity Birdie.flap = 1 ' reset bird wing flap index Pipes(1).x = 500 ' reset position of first pipe Pipes(2).x = 749 ' reset position of second pipe Pipes(3).x = 998 ' reset position of third pipe Pipes(1).y = -(INT(RND(1) * 384) + 12) ' calculate random y position of pipe 1 Pipes(2).y = -(INT(RND(1) * 384) + 12) ' calculate random y position of pipe 2 Pipes(3).y = -(INT(RND(1) * 384) + 12) ' calculate random y position of pipe 3 READY ' display instructions to player DO ' BEGIN GAME PLAY LOOP _LIMIT 60 ' 60 frames per second UPDATESCENERY ' move parallax scenery MOVEPIPES ' move pipes UPDATESCORE ' display player score FLYBIRDIE ' move and display bird CHECKFORHIT ' check for bird hits IF NOT Paused% THEN ' is game paused? IF BUTTON%(30, 100, PauseButton&) THEN ' no, was pause button pressed? Paused% = TRUE ' yes, place game in pause state END IF ELSE ' no, game is not paused IF BUTTON%(30, 100, PlayButton&) THEN ' was play button pressed? Paused% = FALSE ' yes, take game out of pause state END IF END IF _DISPLAY ' update screen with changes IF _EXIT THEN CLEANUP: SYSTEM ' leave game if user closes game window LOOP UNTIL HitBird% ' END GAME PLAY LOOP if bird hits something DO ' BEGIN BIRD DROPPING LOOP _LIMIT 60 ' 60 frames per second Paused% = TRUE ' place game in paused state UPDATESCENERY ' draw parallax scenery MOVEPIPES ' draw pipes Paused% = FALSE ' take game out of pause state FLYBIRDIE ' move bird on screen _DISPLAY ' update screen with changes IF _EXIT THEN CLEANUP: SYSTEM ' leave game if user closes game window LOOP UNTIL Birdie.y >= 546 ' END BIRD DROPPING LOOP when bird hits ground SHOWSCORE ' display player's score plaque HitBird% = FALSE ' reset bird hit indicator END SUB '---------------------------------------------------------------------------------------------------------------------- SUB CHECKFORHIT () '* '* Detects if bird hits a pipe. '* SHARED Pipes() AS PIPE, Birdie AS INFLIGHT, HitBird%, Smack& DIM p% ' pipe counter FOR p% = 1 TO 3 ' cycle through all pipe positions IF Pipes(p%).x <= 153 AND Pipes(p%).x >= 22 THEN ' is pipe in bird territory? IF BOXCOLLISION(105, Birdie.y + 6, 43, 41, Pipes(p%).x, Pipes(p%).y, 78, 432) THEN ' collision? HitBird% = TRUE ' yes, remember bird hit pipe END IF IF BOXCOLLISION(105, Birdie.y + 6, 43, 41, Pipes(p%).x, Pipes(p%).y + 576, 78, 432) THEN ' collision? HitBird% = TRUE ' yes, remember bird hit pipe END IF END IF NEXT p% IF HitBird% THEN _SNDPLAY Smack& ' play smack sound if bird hit pipe END SUB '---------------------------------------------------------------------------------------------------------------------- SUB RATEGAME () '* '* Allows player to rate game. '* SHELL "https://www.qb64.org/forum/index.php?topic=437.0" ' go to QB64 web site forum area for flappy bird END SUB '---------------------------------------------------------------------------------------------------------------------- SUB SHOWSCORE () '* '* Display's current and high scores on score plaque '* SHARED Fbird&(), Num&(), Medal&(), FlappyBird&, GameOver&, Plaque&, OKButton&, ShareButton& SHARED HitBird%, HighScore%, Score%, New& DIM Ok% ' boolean: TRUE if OK button pressed DIM Scores%(1) ' current and high scores DIM sc% ' current score being drawn DIM x% ' x location of score digits DIM p% ' digit position counter DIM ShowNew% ' boolean: TRUE if score is a new high score DIM s$ ' score in string format IF Score% > HighScore% THEN ' is this a new high score? OPEN "fbird.sco" FOR OUTPUT AS #1 ' yes, open score file PRINT #1, Score% ' save new high score CLOSE #1 ' close score file HighScore% = Score% ' remember new high score ShowNew% = TRUE ' remember this is a new high score END IF Scores%(0) = Score% ' place score in array Scores%(1) = HighScore% ' place high score in array Ok% = FALSE ' reset OK button status indicator DO ' BEGIN SCORE LOOP _LIMIT 60 ' 60 frames per second IF HitBird% THEN ' did bird hit something? _PUTIMAGE (75, 200), GameOver& ' yes, place game over image on screen ELSE ' no, bird did not hit anything UPDATESCENERY ' move parallax scenery _PUTIMAGE (40, 200), FlappyBird& ' place flappy bird title on screen _PUTIMAGE (350, 200), Fbird&(2, FLAPTHEBIRD%) ' place flapping bird on screen END IF _PUTIMAGE (46, 295), Plaque& ' place plaque on screen SELECT CASE HighScore% ' what is range of high score? CASE 25 TO 49 ' from 25 to 49 _PUTIMAGE (85, 360), Medal&(SILVER, LIGHT) ' display a light silver medal CASE 50 TO 99 ' from 50 to 99 _PUTIMAGE (85, 360), Medal&(SILVER, DARK) ' display a dark silver medal CASE 100 TO 199 ' from 100 to 199 _PUTIMAGE (85, 360), Medal&(GOLD, LIGHT) ' display a light gold medal CASE IS > 199 ' from 200 and beyond _PUTIMAGE (85, 360), Medal&(GOLD, DARK) ' display a dark gold medal END SELECT FOR sc% = 0 TO 1 ' cycle through both scores s$ = LTRIM$(RTRIM$(STR$(Scores%(sc%)))) ' convert score to string x% = 354 - LEN(s$) * 23 ' calculate position of score digit FOR p% = 1 TO LEN(s$) ' cycle through score string _PUTIMAGE (x%, 346 + sc% * 64), Num&(ASC(MID$(s$, p%, 1)) - 48, LARGE) ' place digit on plaque x% = x% + 23 ' increment digit position NEXT p% NEXT sc% IF ShowNew% THEN _PUTIMAGE (250, 382), New& ' display red new image if new high score IF BUTTON%(64, 535, OKButton&) THEN Ok% = TRUE ' remember if OK button was pressed IF BUTTON%(248, 535, ShareButton&) THEN ' was share button pressed? SHAREPROGRAM ' yes, share program with others UPDATESCENERY ' draw parallax scenery MOVEPIPES ' draw pipes END IF _DISPLAY ' update screen with changes IF _EXIT THEN CLEANUP: SYSTEM ' leave game if user closes game window LOOP UNTIL Ok% ' END SCORE LOOP when OK button pressed END SUB '---------------------------------------------------------------------------------------------------------------------- SUB SHAREPROGRAM () '* '* Allows player to share program with others '* SHARED Fbird&(), FlappyBird&, OKButton& DIM Message& ' composed message to player's friend(s) DIM Ok% ' boolean: TRUE if OK button pressed Message& = _NEWIMAGE(339, 174, 32) ' create image to hold message to player _CLIPBOARD$ = "I just discovered a great game! You can download it here: http:\\www.qb64sourcecode.com\fbird.exe" _PRINTMODE _KEEPBACKGROUND ' printed text will save background LINE (58, 307)-(372, 453), _RGB32(219, 218, 150), BF ' clear plaque image COLOR _RGB32(210, 170, 79) ' compose message to player on plaque _PRINTSTRING (66, 316), "The following message has been copied" COLOR _RGB32(82, 55, 71) _PRINTSTRING (65, 315), "The following message has been copied" COLOR _RGB32(210, 170, 79) _PRINTSTRING (66, 331), "to your computer's clipboard:" COLOR _RGB32(82, 55, 71) _PRINTSTRING (65, 330), "to your computer's clipboard:" COLOR _RGB32(210, 170, 79) _PRINTSTRING (66, 351), "'I just discovered a great game! You" COLOR _RGB32(82, 55, 71) _PRINTSTRING (65, 350), "'I just discovered a great game! You" COLOR _RGB32(210, 170, 79) _PRINTSTRING (66, 366), "can download it here:" COLOR _RGB32(82, 55, 71) _PRINTSTRING (65, 365), "can download it here:" COLOR _RGB32(210, 170, 79) _PRINTSTRING (66, 381), "www.qb64sourcecode.com\fbird.exe'" COLOR _RGB32(82, 55, 71) _PRINTSTRING (65, 380), "www.qb64sourcecode.com\fbird.exe'" COLOR _RGB32(210, 170, 79) _PRINTSTRING (66, 401), "Create an email for your friends and" COLOR _RGB32(82, 55, 71) _PRINTSTRING (65, 400), "Create an email for your friends and" COLOR _RGB32(210, 170, 79) _PRINTSTRING (66, 416), "paste this message into it! Go ahead," COLOR _RGB32(82, 55, 71) _PRINTSTRING (65, 415), "paste this message into it! Go ahead," COLOR _RGB32(210, 170, 79) _PRINTSTRING (66, 431), "do it now before you change your mind!" COLOR _RGB32(82, 55, 71) _PRINTSTRING (65, 430), "do it now before you change your mind!" _PUTIMAGE , _DEST, Message&, (46, 295)-(384, 468) ' place message in image DO ' BEGIN SHARE LOOP _LIMIT 60 ' 60 frames per second UPDATESCENERY ' move parallax scenery _PUTIMAGE (40, 200), FlappyBird& ' place flappy bird title on screen _PUTIMAGE (350, 200), Fbird&(2, FLAPTHEBIRD%) ' place flapping bird on screen _PUTIMAGE (46, 295), Message& ' place message on plaque IF BUTTON%(156, 535, OKButton&) THEN Ok% = TRUE ' remeber if OK button pressed _DISPLAY ' update screen with changes IF _EXIT THEN CLEANUP: SYSTEM ' leave game if user closes game window LOOP UNTIL Ok% ' END SHRE LOOP when OK button pressed _FREEIMAGE Message& ' message image no longer needed END SUB '---------------------------------------------------------------------------------------------------------------------- FUNCTION BUTTON% (xpos%, ypos%, Image&) '* '* Creates a button on the screen the player can click with the mouse button. '* '* xpos% - x coordinate position of button on screen '* ypos% - y coordinate position of button on screen '* Image& - button image '* '* Returns: boolean: TRUE if button pressed '* FALSE if button not pressed '* DIM x% ' current mouse x coordinate DIM y% ' current mouse y coordinate DIM b% ' boolean: TRUE if left mouse button pressed _PUTIMAGE (xpos%, ypos%), Image& ' place button image on the screen WHILE _MOUSEINPUT: WEND ' get latest mouse information x% = _MOUSEX ' get current mouse x coordinate y% = _MOUSEY ' get current mouse y coordinate b% = _MOUSEBUTTON(1) IF b% THEN ' is left mouse button pressed? IF x% >= xpos% THEN ' yes, is mouse x within lower limit of button? IF x% <= xpos% + _WIDTH(Image&) THEN ' yes, is mouse x within upper limit of button? IF y% >= ypos% THEN ' yes, is mouse y within lower limit of button? IF y% <= ypos% + _HEIGHT(Image&) THEN ' yes, is mouse y within upper limit of button? BUTTON% = TRUE ' yes, remember that button was clicked on _DELAY .2 ' slight delay to allow button to release END IF END IF END IF END IF END IF END FUNCTION '---------------------------------------------------------------------------------------------------------------------- SUB UPDATESCENERY () '* '* Updates the moving parallax scenery '* SHARED Scenery() AS PARALLAX, Clean&, HazardBar&, Paused% DIM c% ' scenery index indicator _PUTIMAGE , Clean& ' clear screen with clean image DO ' BEGIN SCENERY LOOP c% = c% + 1 ' increment index value IF NOT Paused% THEN ' is game in paused state? Scenery(c%).frame = Scenery(c%).frame + 1 ' no, update frame counter of current scenery IF Scenery(c%).frame = Scenery(c%).fmax THEN ' frame counter hit limit? Scenery(c%).frame = 0 ' yes, reset frame counter Scenery(c%).x = Scenery(c%).x - 1 ' move scenery 1 pixel to left IF Scenery(c%).x = -432 THEN ' scenery hit lower limit? Scenery(c%).x = 0 ' yes, reset scenery to start position END IF END IF END IF _PUTIMAGE (Scenery(c%).x, Scenery(c%).y), Scenery(c%).image ' place current scenery on screen LOOP UNTIL c% = 3 ' END SCENERY LOOP when all scenery updated IF NOT Paused% THEN ' is game in paused state? Scenery(4).x = Scenery(4).x - 3 ' no, move hazard bar 3 pixels to left IF Scenery(4).x = -21 THEN Scenery(4).x = 0 ' reset to start position if lower limit hit END IF _PUTIMAGE (Scenery(4).x, Scenery(4).y), HazardBar& ' place hazard bar on screen END SUB '---------------------------------------------------------------------------------------------------------------------- SUB LOADASSETS () '* '* Loads game graphics, sounds and initial settings. '* SHARED Scenery() AS PARALLAX, Birdie AS INFLIGHT, Pipes() AS PIPE, Pipe&(), Fbird&() SHARED Num&(), Medal&(), Plaque&, FlappyBird&, GameOver&, GetReady&, Finger& SHARED ScoreButton&, ShareButton&, StartButton&, OKButton&, RateButton&, MenuButton& SHARED PlayButton&, PauseButton&, HazardBar&, Clouds&, City&, Bushes&, New&, Clean& SHARED HighScore%, PipeImage&, Ding&, Flap&, Smack& DIM Sheet& ' sprite sheet image DIM x% ' generic counter DIM y% ' generic counter DIM PipeTop& ' temporary top of pipe image DIM PipeTube& ' temporary pipe tube image Ding& = _SNDOPEN("fbding.ogg", "VOL,SYNC") ' load game sounds Flap& = _SNDOPEN("fbflap.ogg", "VOL,SYNC") Smack& = _SNDOPEN("fbsmack.ogg", "VOL,SYNC") Sheet& = _LOADIMAGE("fbsheet.png", 32) ' load sprite sheet FOR y% = 0 TO 2 ' cycle through bird image rows FOR x% = 0 TO 7 ' cycle through bird image columns Fbird&(x% + 1, y% + 1) = _NEWIMAGE(53, 53, 32) ' create image holder then get image _PUTIMAGE , Sheet&, Fbird&(x% + 1, y% + 1), (x% * 53, y% * 53)-(x% * 53 + 52, y% * 53 + 52) NEXT x% NEXT y% FOR x% = 0 TO 9 ' cycle trough 9 numeral images Num&(x%, 0) = _NEWIMAGE(21, 30, 32) ' create image holder for big Num&(x%, 1) = _NEWIMAGE(18, 21, 32) ' create image holder for small _PUTIMAGE , Sheet&, Num&(x%, 0), (x% * 21, 159)-(x% * 21 + 20, 188) ' get images _PUTIMAGE , Sheet&, Num&(x%, 1), (x% * 18 + 210, 159)-(x% * 18 + 227, 179) NEXT x% Plaque& = _NEWIMAGE(339, 174, 32) ' define remaining image sizes FlappyBird& = _NEWIMAGE(288, 66, 32) GameOver& = _NEWIMAGE(282, 57, 32) GetReady& = _NEWIMAGE(261, 66, 32) PipeTop& = _NEWIMAGE(78, 36, 32) PipeTube& = _NEWIMAGE(78, 36, 32) Pipe&(0) = _NEWIMAGE(78, 432, 32) Pipe&(1) = _NEWIMAGE(78, 432, 32) PipeImage& = _NEWIMAGE(432, 596, 32) Medal&(0, 0) = _NEWIMAGE(66, 66, 32) Medal&(0, 1) = _NEWIMAGE(66, 66, 32) Medal&(1, 0) = _NEWIMAGE(66, 66, 32) Medal&(1, 1) = _NEWIMAGE(66, 66, 32) Finger& = _NEWIMAGE(117, 147, 32) ScoreButton& = _NEWIMAGE(120, 42, 32) ShareButton& = _NEWIMAGE(120, 42, 32) StartButton& = _NEWIMAGE(120, 42, 32) OKButton& = _NEWIMAGE(120, 42, 32) RateButton& = _NEWIMAGE(120, 42, 32) MenuButton& = _NEWIMAGE(120, 42, 32) PlayButton& = _NEWIMAGE(39, 42, 32) PauseButton& = _NEWIMAGE(39, 42, 32) HazardBar& = _NEWIMAGE(462, 24, 32) Clouds& = _NEWIMAGE(864, 120, 32) City& = _NEWIMAGE(864, 57, 32) Bushes& = _NEWIMAGE(864, 27, 32) New& = _NEWIMAGE(48, 21, 32) _PUTIMAGE , Sheet&, Plaque&, (0, 189)-(338, 362) ' grab images from sprite sheet _PUTIMAGE , Sheet&, FlappyBird&, (0, 363)-(287, 428) _PUTIMAGE , Sheet&, GameOver&, (588, 246)-(869, 302) _PUTIMAGE , Sheet&, GetReady&, (588, 303)-(847, 368) _PUTIMAGE , Sheet&, Medal&(0, 0), (339, 327)-(404, 392) _PUTIMAGE , Sheet&, Medal&(0, 1), (405, 327)-(470, 392) _PUTIMAGE , Sheet&, Medal&(1, 0), (339, 261)-(404, 326) _PUTIMAGE , Sheet&, Medal&(1, 1), (405, 261)-(470, 326) _PUTIMAGE , Sheet&, Finger&, (471, 246)-(587, 392) _PUTIMAGE , Sheet&, ScoreButton&, (288, 417)-(407, 458) _PUTIMAGE , Sheet&, ShareButton&, (408, 417)-(527, 458) _PUTIMAGE , Sheet&, StartButton&, (528, 417)-(647, 458) _PUTIMAGE , Sheet&, OKButton&, (424, 204)-(543, 245) _PUTIMAGE , Sheet&, RateButton&, (544, 204)-(663, 245) _PUTIMAGE , Sheet&, MenuButton&, (664, 204)-(783, 245) _PUTIMAGE , Sheet&, PlayButton&, (784, 204)-(822, 245) _PUTIMAGE , Sheet&, PauseButton&, (823, 204)-(861, 245) _PUTIMAGE , Sheet&, HazardBar&, (288, 393)-(749, 416) _PUTIMAGE (0, 0)-(431, 119), Sheet&, Clouds&, (424, 0)-(855, 119) _PUTIMAGE (432, 0)-(863, 119), Sheet&, Clouds&, (424, 0)-(855, 119) _PUTIMAGE (0, 0)-(431, 56), Sheet&, City&, (424, 120)-(855, 176) _PUTIMAGE (432, 0)-(863, 56), Sheet&, City&, (424, 120)-(855, 176) _PUTIMAGE (0, 0)-(431, 26), Sheet&, Bushes&, (424, 177)-(855, 203) _PUTIMAGE (432, 0)-(863, 26), Sheet&, Bushes&, (424, 177)-(855, 203) _PUTIMAGE , Sheet&, New&, (289, 363)-(336, 383) _PUTIMAGE , Sheet&, PipeTop&, (339, 189)-(416, 224) _PUTIMAGE , Sheet&, PipeTube&, (339, 225)-(416, 260) _PUTIMAGE (0, 431)-(77, 395), PipeTop&, Pipe&(0) ' create bottom of upper tube image _PUTIMAGE (0, 0), PipeTop&, Pipe&(1) ' create top of lower tube image FOR y% = 0 TO 395 STEP 36 ' cycle through tube body of pipes _PUTIMAGE (0, y% + 35)-(77, y%), PipeTube&, Pipe&(0) ' draw tube on upper pipe image _PUTIMAGE (0, 36 + y%), PipeTube&, Pipe&(1) ' draw tube on lower pipe image NEXT y% _FREEIMAGE PipeTop& ' temporary image no longer needed _FREEIMAGE PipeTube& ' temporary image no longer needed _FREEIMAGE Sheet& ' sprite sheet no longer needed Clean& = _NEWIMAGE(432, 768, 32) ' create clean image holder _DEST Clean& ' work on clean image CLS , _RGB32(84, 192, 201) ' clear image with sky blue color LINE (0, 620)-(431, 767), _RGB32(219, 218, 150), BF ' create brown ground portion of image LINE (0, 577)-(431, 595), _RGB32(100, 224, 117), BF ' create green grass portion of image _DEST 0 ' back to work on screen Scenery(1).image = Clouds& ' set scenery parallax information Scenery(1).y = 457 Scenery(1).fmax = 8 Scenery(2).image = City& Scenery(2).y = 510 Scenery(2).fmax = 4 Scenery(3).image = Bushes& Scenery(3).y = 550 Scenery(3).fmax = 2 Scenery(4).image = HazardBar& Scenery(4).y = 596 IF _FILEEXISTS("fbird.sco") THEN ' does high score file exist? OPEN "fbird.sco" FOR INPUT AS #1 ' yes, open high score file INPUT #1, HighScore% ' get high score from file CLOSE #1 ' close high score file END IF END SUB '---------------------------------------------------------------------------------------------------------------------- FUNCTION BOXCOLLISION% (Box1X%, Box1Y%, Box1Width%, Box1Height%, Box2X%, Box2Y%, Box2Width%, Box2Height%) '** '** Detects if two bounding box areas are in collision '** '** INPUT : Box1X% - upper left corner X location of bounding box 1 '** Box1Y% - upper left corner Y location of bounding box 1 '** Box1Width% - the width of bounding box 1 '** Box1Height% - the height of bounding box 1 '** Box2X% - upper left corner X location of bounding box 2 '** Box2Y% - upper left corner Y location of bounding box 2 '** Box2Width% - the width of bounding box 2 '** Box2Height% - the height of bounding box 2 '** '** OUTPUT: BOXCOLLISION - 0 (FALSE) for no collision, -1 (TRUE) for collision '** IF Box1X% <= Box2X% + Box2Width% - 1 THEN ' is box1 x within lower limit of box2 x? IF Box1X% + Box1Width% - 1 >= Box2X% THEN ' yes, is box1 x within upper limit of box2 x? IF Box1Y% <= Box2Y% + Box2Height% - 1 THEN ' yes, is box1 y within lower limit of box2 y? IF Box1Y% + Box1Height% - 1 >= Box2Y% THEN ' yes, is box1 y within upper limit of box2 y? BOXCOLLISION% = TRUE ' yes, then a collision occured, return result END IF END IF END IF END IF END FUNCTION '---------------------------------------------------------------------------------------------------------------------- SUB CLEANUP () '* '* Removes all game assets from the computer's RAM. '* SHARED Fbird&(), Pipe&(), Num&(), Medal&(), Plaque&, FlappyBird&, GameOver&, GetReady& SHARED Finger&, ScoreButton&, ShareButton&, StartButton&, OKButton&, RateButton& SHARED MenuButton&, PlayButton&, PauseButton&, HazardBar&, Clouds&, City&, Bushes& SHARED New&, Clean&, PipeImage&, Ding&, Flap&, Smack& DIM x% ' generic counter DIM y% ' generic counter _SNDCLOSE Ding& ' remove game sounds from RAM _SNDCLOSE Flap& _SNDCLOSE Smack& FOR y% = 0 TO 2 ' cycle through bird image rows FOR x% = 0 TO 7 ' cycle through bird image columns _FREEIMAGE Fbird&(x% + 1, y% + 1) ' remove bird image from RAM NEXT x% NEXT y% FOR x% = 0 TO 9 ' cycle trough 9 numeral images _FREEIMAGE Num&(x%, 0) ' remove large numeral image from RAM _FREEIMAGE Num&(x%, 1) ' remove small numeral image from RAM NEXT x% _FREEIMAGE Plaque& ' remove all remaining images from RAM _FREEIMAGE FlappyBird& _FREEIMAGE GameOver& _FREEIMAGE GetReady& _FREEIMAGE Pipe&(0) _FREEIMAGE Pipe&(1) _FREEIMAGE PipeImage& _FREEIMAGE Medal&(0, 0) _FREEIMAGE Medal&(0, 1) _FREEIMAGE Medal&(1, 0) _FREEIMAGE Medal&(1, 1) _FREEIMAGE Finger& _FREEIMAGE ScoreButton& _FREEIMAGE ShareButton& _FREEIMAGE StartButton& _FREEIMAGE OKButton& _FREEIMAGE RateButton& _FREEIMAGE MenuButton& _FREEIMAGE PlayButton& _FREEIMAGE PauseButton& _FREEIMAGE HazardBar& _FREEIMAGE Clouds& _FREEIMAGE City& _FREEIMAGE Bushes& _FREEIMAGE New& _FREEIMAGE Clean& END SUB '----------------------------------------------------------------------------------------------------------------------
Navigation
[0] Message Index
Go to full version