├── README.md ├── icons ├── Icon-App-29x29@1x.png ├── Icon-App-29x29@2x.png ├── Icon-App-29x29@3x.png ├── Icon-App-40x40@1x.png ├── Icon-App-40x40@2x.png ├── Icon-App-60x60@2x.png ├── Icon-App-60x60@3x.png ├── Icon-App-76x76@1x.png └── Icon-App-76x76@2x.png ├── images ├── clouds.png ├── frog.png ├── ground.png └── pipe.png ├── index.html ├── js ├── clouds.js ├── game.js ├── global.js ├── main.js ├── pipes.js ├── require.js ├── scene.js ├── sounds.js └── utils.js ├── lib ├── phaser.min.js └── phaser.min.patched.js └── sounds ├── bgm.mp3 ├── crash.mp3 ├── flap.mp3 ├── ha.mp3 ├── hurt ├── 1.mp3 ├── 10.mp3 ├── 11.mp3 ├── 12.mp3 ├── 13.mp3 ├── 14.mp3 ├── 15.mp3 ├── 16.mp3 ├── 17.mp3 ├── 18.mp3 ├── 19.mp3 ├── 2.mp3 ├── 20.mp3 ├── 21.mp3 ├── 3.mp3 ├── 4.mp3 ├── 5.mp3 ├── 6.mp3 ├── 7.mp3 ├── 8.mp3 └── 9.mp3 └── score ├── 1.mp3 ├── 10.mp3 ├── 11.mp3 ├── 12.mp3 ├── 13.mp3 ├── 14.mp3 ├── 15.mp3 ├── 16.mp3 ├── 17.mp3 ├── 18.mp3 ├── 19.mp3 ├── 2.mp3 ├── 20.mp3 ├── 21.mp3 ├── 22.mp3 ├── 23.mp3 ├── 24.mp3 ├── 25.mp3 ├── 26.mp3 ├── 27.mp3 ├── 28.mp3 ├── 29.mp3 ├── 3.mp3 ├── 30.mp3 ├── 31.mp3 ├── 32.mp3 ├── 33.mp3 ├── 34.mp3 ├── 35.mp3 ├── 36.mp3 ├── 37.mp3 ├── 38.mp3 ├── 39.mp3 ├── 4.mp3 ├── 40.mp3 ├── 41.mp3 ├── 42.mp3 ├── 43.mp3 ├── 5.mp3 ├── 6.mp3 ├── 7.mp3 ├── 8.mp3 └── 9.mp3 /README.md: -------------------------------------------------------------------------------- 1 | # Flappy Frog 重制版 2 | [Flappy Frog](https://github.com/tusenpo/FlappyFrog) 重制版 3 | 加入了更多的长者语音 -------------------------------------------------------------------------------- /icons/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/icons/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /icons/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/icons/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /icons/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/icons/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /icons/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/icons/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /icons/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/icons/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /icons/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/icons/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /icons/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/icons/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /icons/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/icons/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /icons/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/icons/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /images/clouds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/images/clouds.png -------------------------------------------------------------------------------- /images/frog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/images/frog.png -------------------------------------------------------------------------------- /images/ground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/images/ground.png -------------------------------------------------------------------------------- /images/pipe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/images/pipe.png -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Flappy Frog 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 46 | 47 | 48 |
49 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /js/clouds.js: -------------------------------------------------------------------------------- 1 | require.register('clouds.js', function(exports, require, module) { 2 | 'use strict'; 3 | 4 | var global = require('global'); 5 | var utils = require('utils'); 6 | var preloadSpritesheet = utils.preloadSpritesheet; 7 | 8 | var settings = global.settings; 9 | 10 | var cloudGroup; 11 | 12 | var spawnTime = Math.random(), timeElapsed = 0; 13 | 14 | function resetCloud(cloud) { 15 | cloud.x = global.phaserGame.width; 16 | cloud.y = Math.random() * global.phaserGame.height / 2; 17 | cloud.frame = Math.floor(4 * Math.random()); 18 | var cloudScale = 2 + 2 * Math.random(); 19 | cloud.alpha = 2 / cloudScale; 20 | if (cloud.alpha > 0.7) 21 | cloud.alpha = 0.7; 22 | cloud.scale.setTo(cloudScale, cloudScale); 23 | cloud.body.velocity.x = -settings.speed / cloudScale; 24 | } 25 | 26 | function spawn() { 27 | var cloud = cloudGroup.getFirstDead(); 28 | if (cloud) { 29 | cloud.revive(); 30 | } else { 31 | cloud = cloudGroup.create(global.phaserGame.width, global.phaserGame.height, 'clouds'); 32 | } 33 | resetCloud(cloud); 34 | } 35 | 36 | exports.update = function() { 37 | cloudGroup.forEachAlive(function(cloud) { 38 | if (cloud.x + cloud.width < global.phaserGame.world.bounds.left) { 39 | cloud.kill(); 40 | } 41 | }); 42 | 43 | timeElapsed += global.phaserGame.time.physicsElapsed; 44 | if (timeElapsed >= spawnTime) { 45 | spawnTime = 4 * Math.random(); 46 | timeElapsed = 0; 47 | spawn(); 48 | } 49 | 50 | //console.log(cloudGroup.length); 51 | }; 52 | 53 | exports.preload = function() { 54 | preloadSpritesheet('clouds', 128, 64); 55 | }; 56 | 57 | exports.create = function() { 58 | cloudGroup = global.phaserGame.add.group(); 59 | }; 60 | 61 | }); 62 | -------------------------------------------------------------------------------- /js/game.js: -------------------------------------------------------------------------------- 1 | require.register('game.js', function(exports, require, module) { 2 | 'use strict'; 3 | 4 | var global = require('global'); 5 | var preloadImage = require('utils').preloadImage; 6 | var sounds = require('sounds'); 7 | var pipes = require('pipes'); 8 | var clouds = require('clouds'); 9 | 10 | var settings = global.settings; 11 | 12 | var ground, bird; 13 | var gameStarted = false, crashed = false, crashedGround = false; 14 | var scoreText, score; 15 | var timeElapsedText, timeElapsed, startTime; 16 | 17 | function createBackground() { 18 | var graphics = global.phaserGame.add.graphics(0, 0); 19 | graphics.beginFill(0xDDEEFF, 1); 20 | graphics.drawRect(0, 0, global.phaserGame.width, global.phaserGame.height); 21 | graphics.endFill(); 22 | } 23 | 24 | function createGround() { 25 | global.phaserGame.world.bounds.height = global.phaserGame.height + 16; 26 | 27 | var height = 32; 28 | ground = global.phaserGame.add.tileSprite( 29 | 0, 30 | global.phaserGame.height - height, 31 | global.phaserGame.width, 32 | height, 33 | 'ground' 34 | ); 35 | ground.tileScale.setTo(2, 2); 36 | } 37 | 38 | function createBird() { 39 | bird = global.phaserGame.add.sprite( 40 | global.phaserGame.width / 2, 41 | global.phaserGame.height / 2, 42 | 'frog' 43 | ); 44 | bird.anchor.setTo(0.5, 0.5); 45 | bird.body.collideWorldBounds = true; 46 | } 47 | 48 | function createTexts() { 49 | scoreText = global.phaserGame.add.text( 50 | global.phaserGame.width / 2, 51 | global.phaserGame.height / 4, 52 | '', 53 | { 54 | font: '14px ' + global.font, 55 | fill: '#fff', 56 | stroke: '#430', 57 | strokeThickness: 4, 58 | align: 'center' 59 | } 60 | ); 61 | scoreText.anchor.setTo(0.5, 0.5); 62 | 63 | timeElapsedText = global.phaserGame.add.text( 64 | global.phaserGame.width / 2, 65 | scoreText.y + scoreText.height, 66 | '', 67 | { 68 | font: '14px ' + global.font, 69 | fill: '#f00', 70 | align: 'center' 71 | } 72 | ); 73 | timeElapsedText.anchor.setTo(0.5, 0.5); 74 | } 75 | 76 | function updateGround() { 77 | if (crashed) 78 | return; 79 | var t = global.phaserGame.time.physicsElapsed; 80 | var v = settings.speed; 81 | ground.tilePosition.x -= t * v / 2; 82 | } 83 | 84 | function updateBird() { 85 | if (!gameStarted) { 86 | var y = global.phaserGame.height / 2; 87 | bird.y = y + 8 * Math.cos(global.phaserGame.time.now / 200); 88 | return; 89 | } 90 | 91 | if (crashed) 92 | return; 93 | 94 | var dvy = settings.flap + bird.body.velocity.y; 95 | bird.angle = (90 * dvy / settings.flap) - 180; 96 | if (bird.angle < 0) { 97 | bird.angle = 0; 98 | } 99 | } 100 | 101 | function resetBird() { 102 | bird.body.gravity.y = 0; 103 | bird.x = global.phaserGame.width / 4 + bird.width / 2; 104 | bird.angle = 0; 105 | bird.scale.setTo(1, 1); 106 | } 107 | 108 | function flap() { 109 | if (!gameStarted) 110 | return; 111 | 112 | if (!crashed) { 113 | bird.body.velocity.y = -settings.flap; 114 | sounds('flap').isPlaying() || sounds('flap').play(); 115 | } 116 | } 117 | 118 | function crash() { 119 | bird.angle = -20; 120 | bird.scale.setTo(1, -1); 121 | sounds('score').stop(); 122 | sounds('ha').play(); 123 | sounds('crash').play(); 124 | } 125 | 126 | function crashGround() { 127 | bird.angle = -20; 128 | bird.scale.setTo(1, -1); 129 | sounds('score').stop(); 130 | !!crashed || sounds('crash').play(); 131 | } 132 | 133 | function checkCollision() { 134 | if (!crashed) { 135 | if ( 136 | (settings.ceiling && bird.body.bottom - bird.body.height <= global.phaserGame.world.bounds.top) || 137 | pipes.checkCollision( 138 | bird.body.right - bird.body.width, 139 | bird.body.bottom - bird.body.height, 140 | bird.body.right, 141 | bird.body.bottom) 142 | ) { 143 | stop(); 144 | crash(); 145 | crashed = true; 146 | 147 | } else if (pipes.checkScore(bird.body.right)) { 148 | addScore(); 149 | } 150 | } 151 | 152 | if (!crashedGround) { 153 | if (bird.body.bottom >= global.phaserGame.world.bounds.bottom) { 154 | stop(); 155 | crashGround(); 156 | crashed = true; 157 | crashedGround = true; 158 | endGame(); 159 | } 160 | } 161 | } 162 | 163 | function addScore() { 164 | score += 1; 165 | updateScoreText(); 166 | sounds('score').play(); 167 | } 168 | 169 | function updateScoreText() { 170 | scoreText.setText( 171 | '+ %s s'.replace('%s', score) 172 | ); 173 | } 174 | 175 | function updateTimeElapsed() { 176 | if (crashed) 177 | return; 178 | var a = Math.floor(global.phaserGame.time.elapsedSecondsSince(startTime)) + 1; 179 | if (timeElapsed == a) 180 | return; 181 | timeElapsed = a; 182 | timeElapsedText.setText( 183 | '- %s s'.replace('%s', timeElapsed) 184 | ); 185 | } 186 | 187 | var onGameOver; 188 | function endGame() { 189 | global.timeElapsed = timeElapsed; 190 | global.score = score; 191 | if (!global.bestScore || global.bestScore < score) { 192 | global.bestScore = score; 193 | } 194 | 195 | setTimeout(function() { 196 | sounds('hurt').play(); 197 | onGameOver(); 198 | }, 500); 199 | } 200 | 201 | function stop() { 202 | if (crashed) 203 | return; 204 | 205 | pipes.stop(); 206 | } 207 | 208 | exports.start = function(cb) { 209 | startTime = global.phaserGame.time.now; 210 | 211 | sounds('hurt').stop(); 212 | onGameOver = cb; 213 | 214 | bird.body.gravity.y = settings.gravity; 215 | updateScoreText(); 216 | scoreText.visible = true; 217 | pipes.start(); 218 | gameStarted = true; 219 | 220 | flap(); 221 | }; 222 | 223 | exports.reset = function() { 224 | timeElapsedText.setText(''); 225 | 226 | score = 0; 227 | gameStarted = false; 228 | crashed = false; 229 | crashedGround = false; 230 | 231 | scoreText.visible = false; 232 | 233 | pipes.reset(); 234 | resetBird(); 235 | }; 236 | 237 | exports.preload = function() { 238 | pipes.preload(); 239 | clouds.preload(); 240 | preloadImage('frog'); 241 | preloadImage('ground'); 242 | }; 243 | 244 | exports.create = function() { 245 | createBackground(); 246 | pipes.create(); 247 | createBird(); 248 | createGround(); 249 | createTexts(); 250 | clouds.create(); 251 | 252 | global.phaserGame.input.onDown.add(flap); 253 | 254 | exports.reset(); 255 | }; 256 | 257 | exports.update = function() { 258 | clouds.update(); 259 | updateBird(); 260 | updateGround(); 261 | if (gameStarted) { 262 | updateTimeElapsed(); 263 | checkCollision(); 264 | pipes.update(); 265 | } 266 | }; 267 | 268 | exports.render = function() { 269 | if (settings.debug) 270 | global.phaserGame.debug.renderSpriteBody(bird);; 271 | pipes.render(); 272 | }; 273 | 274 | }); 275 | -------------------------------------------------------------------------------- /js/global.js: -------------------------------------------------------------------------------- 1 | require.register('global.js', function(exports, require, module) { 2 | 'use strict'; 3 | 4 | exports.font = '"Segoe UI", "Microsoft YaHei", 宋体, sans-serif'; 5 | 6 | exports.settings = { 7 | gravity: 40, 8 | flap: 620, 9 | speed: 390, 10 | spacing: 468, 11 | gap: 300, 12 | ceiling: false, 13 | canvas: true, 14 | antialias: false, 15 | debug: false, 16 | scoreSounds: 43, 17 | hurtSounds: 21 18 | }; 19 | 20 | }); 21 | -------------------------------------------------------------------------------- /js/main.js: -------------------------------------------------------------------------------- 1 | require.register('main.js', function(exports, require, module) { 2 | 'use strict'; 3 | 4 | var global = require('global'); 5 | var sounds = require('sounds'); 6 | var scene = require('scene'); 7 | var utils = require('utils'); 8 | 9 | var settings = global.settings; 10 | 11 | function preload() { 12 | global.phaserGame.stage.scaleMode = Phaser.StageScaleMode.SHOW_ALL; 13 | global.phaserGame.stage.scale.setScreenSize(true); 14 | 15 | sounds.preload(); 16 | scene.preload(); 17 | } 18 | 19 | function create() { 20 | sounds.create(); 21 | scene.create(); 22 | scene.shift('title'); 23 | } 24 | 25 | function update() { 26 | scene.update(); 27 | } 28 | 29 | function render() { 30 | scene.render(); 31 | } 32 | 33 | exports.run = function() { 34 | utils.loadSettingsFromUrl(); 35 | 36 | var width = 480; 37 | var height = 700; 38 | 39 | var availWidth = document.body.offsetWidth; 40 | var availHeight = document.body.offsetHeight; 41 | if (availWidth > availHeight) { 42 | var w = availWidth; 43 | availWidth = availHeight; 44 | availHeight = w; 45 | } 46 | 47 | var device = new Phaser.Device(); 48 | if (availWidth >= 320 && availHeight >= 480 && availHeight <= 1280) { 49 | if (!device.desktop || settings.mobile) { 50 | width = availWidth; 51 | height = availHeight; 52 | } 53 | } 54 | console.log(device.desktop ? 'desktop' : 'mobile', width, 'x', height); 55 | 56 | global.phaserGame = new Phaser.Game( 57 | width, 58 | height, 59 | settings.canvas ? Phaser.CANVAS : Phaser.AUTO, 60 | document.getElementById('game'), 61 | { 62 | preload: preload, 63 | create: create, 64 | update: update, 65 | render: render 66 | }, 67 | false, 68 | settings.antialias 69 | ); 70 | }; 71 | 72 | }); 73 | -------------------------------------------------------------------------------- /js/pipes.js: -------------------------------------------------------------------------------- 1 | require.register('pipes.js', function(exports, require, module) { 2 | 'use strict'; 3 | 4 | var global = require('global'); 5 | var utils = require('utils'); 6 | var preloadImage = utils.preloadImage; 7 | 8 | var settings = global.settings; 9 | 10 | var pipeLayer; 11 | 12 | function PipePair() { 13 | this.scored = false; 14 | this.alive = true; 15 | this.topPipe = pipeLayer.create(0, 0, 'pipe'); 16 | this.bottomPipe = pipeLayer.create(0, 0, 'pipe'); 17 | this.topPipe.scale.setTo(2, 2); 18 | this.bottomPipe.scale.setTo(2, 2); 19 | } 20 | 21 | PipePair.prototype.reset = function() { 22 | var gap = settings.gap / 2; 23 | 24 | var x = global.phaserGame.width; 25 | var y = global.phaserGame.height / 2 + (Math.random() > 0.5 ? -1 : 1) * Math.random() * global.phaserGame.height / 6; 26 | y -= 50; 27 | 28 | this.topPipe.x = x; 29 | this.topPipe.y = y - gap - this.topPipe.height; 30 | 31 | this.bottomPipe.x = x; 32 | this.bottomPipe.y = y + gap; 33 | 34 | this.scored = false; 35 | }; 36 | 37 | PipePair.prototype.kill = function() { 38 | this.topPipe.visible = false; 39 | this.bottomPipe.visible = false; 40 | this.alive = false; 41 | }; 42 | 43 | PipePair.prototype.revive = function() { 44 | this.topPipe.visible = true; 45 | this.bottomPipe.visible = true; 46 | this.alive = true; 47 | }; 48 | 49 | PipePair.prototype.checkScore = function(x) { 50 | if (!this.alive) 51 | return false; 52 | 53 | if (this.scored) 54 | return false; 55 | 56 | if (x > this.topPipe.x + this.topPipe.width) { 57 | this.scored = true; 58 | return true; 59 | } 60 | 61 | return false; 62 | }; 63 | 64 | PipePair.prototype.checkCollision = function(left, top, right, bottom) { 65 | if (!this.alive) 66 | return false; 67 | 68 | if (utils.overlapAABB(left, top, right, bottom, 69 | this.topPipe.x, this.topPipe.y, 70 | this.topPipe.x + this.topPipe.width, this.topPipe.y + this.topPipe.height)) { 71 | return true; 72 | } 73 | 74 | if (utils.overlapAABB(left, top, right, bottom, 75 | this.bottomPipe.x, this.bottomPipe.y, 76 | this.bottomPipe.x + this.bottomPipe.width, this.bottomPipe.y + this.bottomPipe.height)) { 77 | return true; 78 | } 79 | 80 | return false; 81 | }; 82 | 83 | PipePair.prototype.checkOutOfBound = function() { 84 | return this.topPipe.x + this.topPipe.width <= global.phaserGame.world.bounds.left; 85 | }; 86 | 87 | PipePair.prototype.moveX = function(n) { 88 | if (!this.alive) 89 | return; 90 | 91 | this.topPipe.x -= n; 92 | this.bottomPipe.x -= n; 93 | 94 | if (this.checkOutOfBound()) 95 | this.kill(); 96 | }; 97 | 98 | PipePair.prototype.render = function() { 99 | global.phaserGame.debug.renderSpriteBody(this.topPipe); 100 | global.phaserGame.debug.renderSpriteBody(this.bottomPipe); 101 | }; 102 | 103 | 104 | var pipeList = [], paused = true, distance = 0; 105 | 106 | exports.checkScore = function(x) { 107 | for (var i = 0; i < pipeList.length; i++) { 108 | if (pipeList[i].checkScore(x)) 109 | return true; 110 | } 111 | return false; 112 | }; 113 | 114 | exports.checkCollision = function(left, top, right, bottom) { 115 | for (var i = 0; i < pipeList.length; i++) { 116 | if (pipeList[i].checkCollision(left, top, right, bottom)) 117 | return true; 118 | } 119 | return false; 120 | }; 121 | 122 | function reusePipe() { 123 | var pipe; 124 | for (var i = 0; i < pipeList.length; i++) { 125 | pipe = pipeList[i]; 126 | if (!pipe.alive) 127 | return pipe; 128 | } 129 | return null; 130 | } 131 | 132 | function spawn() { 133 | var pipe = reusePipe(); 134 | if (!pipe) { 135 | pipe = new PipePair(); 136 | pipeList.push(pipe); 137 | } else { 138 | pipe.revive(); 139 | } 140 | pipe.reset(); 141 | } 142 | 143 | exports.update = function() { 144 | if (paused) 145 | return; 146 | 147 | var t = global.phaserGame.time.physicsElapsed; 148 | var s = settings.speed * t; 149 | 150 | pipeList.forEach(function(pipe) { 151 | pipe.moveX(s); 152 | }); 153 | 154 | distance += s; 155 | if (distance >= settings.spacing) { 156 | distance = 0; 157 | spawn(); 158 | } 159 | 160 | //console.log(pipeList.length); 161 | }; 162 | 163 | exports.start = function() { 164 | paused = false; 165 | }; 166 | 167 | exports.stop = function() { 168 | paused = true; 169 | }; 170 | 171 | exports.reset = function() { 172 | pipeList.forEach(function(pipe) { 173 | if (pipe.alive) 174 | pipe.kill(); 175 | }); 176 | distance = 0; 177 | }; 178 | 179 | exports.preload = function() { 180 | preloadImage('pipe'); 181 | }; 182 | 183 | exports.create = function() { 184 | pipeLayer = global.phaserGame.add.group(); 185 | }; 186 | 187 | function render(flags) { 188 | if (!flags) 189 | return; 190 | pipeList.forEach(function(pipe) { 191 | if (flags & 1) 192 | pipe.alive && pipe.render(); 193 | if (flags & 2) 194 | !pipe.alive && pipe.render(); 195 | }); 196 | } 197 | 198 | exports.render = function() { 199 | if (settings.debug) 200 | render(3); 201 | }; 202 | 203 | }); 204 | -------------------------------------------------------------------------------- /js/require.js: -------------------------------------------------------------------------------- 1 | (function(global) { 2 | 'use strict'; 3 | 4 | var modules = {}; 5 | 6 | var require = function(id) { 7 | if (!/\.js$/.test(id)) 8 | id += '.js'; 9 | var module = modules[id]; 10 | if (!module.exports) { 11 | module.exports = {}; 12 | module.call(this, module.exports, require, module); 13 | } 14 | return module.exports; 15 | }; 16 | 17 | require.register = function(id, func) { 18 | modules[id] = func; 19 | }; 20 | 21 | global.require = require; 22 | })(this); 23 | -------------------------------------------------------------------------------- /js/scene.js: -------------------------------------------------------------------------------- 1 | require.register('scene.js', function(exports, require, module) { 2 | 'use strict'; 3 | 4 | var global = require('global'); 5 | var utils = require('utils') 6 | var preloadImage = utils.preloadImage; 7 | var game = require('game'); 8 | var sounds = require('sounds'); 9 | 10 | var settings = global.settings; 11 | 12 | function TextButton(opts) { 13 | this.label = global.phaserGame.add.text( 14 | opts.x || 0, 15 | opts.y || 0, 16 | opts.text || '', 17 | { 18 | font: (opts.size || '22px') + ' ' + global.font, 19 | fill: '#fff', 20 | stroke: '#430', 21 | strokeThickness: 4, 22 | align: 'center' 23 | } 24 | ); 25 | this.label.anchor.setTo( 26 | opts.anchorX || 0, 27 | opts.anchorY || 0 28 | ); 29 | 30 | this.sprite = global.phaserGame.add.sprite(this.label.x, this.label.y); 31 | this.sprite.width = this.label.width; 32 | this.sprite.height = this.label.height; 33 | this.sprite.anchor.setTo(this.label.anchor.x, this.label.anchor.y); 34 | this.sprite.inputEnabled = true; 35 | 36 | this.events = this.sprite.events; 37 | } 38 | 39 | TextButton.prototype.show = function() { 40 | this.label.visible = true; 41 | this.sprite.visible = true; 42 | }; 43 | 44 | TextButton.prototype.hide = function() { 45 | this.label.visible = false; 46 | this.sprite.visible = false; 47 | }; 48 | 49 | 50 | var tipsText, loadingText, scoreText; 51 | var playButton, restartButton, feedbackButton, playBgmButton; 52 | 53 | function setLoadingText(percent) { 54 | loadingText.setText( 55 | 'Loading...\n\n历史的行程: %s %'.replace('%s', percent) 56 | ); 57 | } 58 | 59 | function createLoadingScreen() { 60 | tipsText = global.phaserGame.add.text( 61 | global.phaserGame.width / 2, 62 | global.phaserGame.height / 4, 63 | '请打开声音', 64 | { 65 | font: '16px ' + global.font, 66 | fill: '#fff', 67 | align: 'center' 68 | } 69 | ); 70 | tipsText.anchor.setTo(0.5, 0.5); 71 | 72 | loadingText = global.phaserGame.add.text( 73 | global.phaserGame.width / 2, 74 | global.phaserGame.height / 2, 75 | '', 76 | { 77 | font: '24px ' + global.font, 78 | fill: '#f00', 79 | align: 'center' 80 | } 81 | ); 82 | loadingText.anchor.setTo(0.5, 0.5); 83 | setLoadingText(0); 84 | global.phaserGame.load.onFileComplete.add(setLoadingText); 85 | } 86 | 87 | function unlockAudio() { 88 | utils.unlockAudioContext(); 89 | } 90 | 91 | function createButtons() { 92 | playButton = new TextButton({ 93 | x: global.phaserGame.width / 2, 94 | y: global.phaserGame.height - global.phaserGame.height / 3, 95 | anchorX: 0.5, 96 | anchorY: 0.5, 97 | text: '开始' 98 | }); 99 | playButton.hide(); 100 | 101 | playButton.events.onInputUp.add(function() { 102 | unlockAudio(); 103 | exports.shift('play'); 104 | }); 105 | 106 | 107 | restartButton = new TextButton({ 108 | x: global.phaserGame.width / 2, 109 | y: global.phaserGame.height - global.phaserGame.height / 5, 110 | anchorX: 0.5, 111 | anchorY: 0.5, 112 | text: '重新续' 113 | }); 114 | restartButton.hide(); 115 | 116 | restartButton.events.onInputUp.add(function() { 117 | exports.shift('title'); 118 | }); 119 | 120 | 121 | feedbackButton = new TextButton({ 122 | x: 0, 123 | y: 0, 124 | size: '14px', 125 | text: '"5"可奉告' 126 | }); 127 | 128 | feedbackButton.events.onInputUp.add(function() { 129 | unlockAudio(); 130 | if (settings.scoreSounds >= 15) 131 | sounds('score').playCustom(15); 132 | if (!settings.feedback) 133 | return; 134 | window.open(settings.feedback); 135 | }); 136 | 137 | 138 | playBgmButton = new TextButton({ 139 | x: global.phaserGame.width, 140 | y: 0, 141 | anchorX: 1, 142 | size: '14px', 143 | text: '请州长夫人演唱' 144 | }); 145 | 146 | playBgmButton.events.onInputUp.add(function() { 147 | unlockAudio(); 148 | sounds('bgm').toggle(); 149 | }); 150 | } 151 | 152 | function createScoreText() { 153 | scoreText = global.phaserGame.add.text( 154 | global.phaserGame.width / 2, 155 | global.phaserGame.height / 2, 156 | '', 157 | { 158 | font: '18px ' + global.font, 159 | fill: '#fff', 160 | stroke: '#430', 161 | strokeThickness: 4, 162 | align: 'center' 163 | } 164 | ); 165 | scoreText.anchor.setTo(0.5, 0.5); 166 | scoreText.visible = false; 167 | } 168 | 169 | function showScore() { 170 | var text = '我为长者续命 %s 秒\n志己的生命减少 %s 秒\n而且这个效率efficiency: %s%\n\n最吼的一次续了 %s 秒'; 171 | 172 | var score = global.score; 173 | var timeElapsed = global.timeElapsed; 174 | var a = Math.floor(score / timeElapsed * 100); 175 | a = text.replace('%s', score).replace('%s', timeElapsed).replace('%s', a).replace('%s', global.bestScore); 176 | 177 | scoreText.setText(a); 178 | scoreText.visible = true; 179 | } 180 | 181 | function hideScore() { 182 | scoreText.visible = false; 183 | } 184 | 185 | var sceneName = 'loading'; 186 | var scenes = { 187 | 'loading': { 188 | enter: function() { 189 | }, 190 | 191 | exit: function() { 192 | tipsText.visible = false; 193 | loadingText.visible = false; 194 | } 195 | }, 196 | 197 | 'title': { 198 | enter: function() { 199 | playButton.show(); 200 | }, 201 | 202 | exit: function() { 203 | playButton.hide(); 204 | } 205 | }, 206 | 207 | 'play': { 208 | enter: function() { 209 | game.start(function() { 210 | exports.shift('end'); 211 | }); 212 | }, 213 | 214 | exit: function() { 215 | } 216 | }, 217 | 218 | 'end': { 219 | enter: function() { 220 | restartButton.show(); 221 | showScore(); 222 | }, 223 | 224 | exit: function() { 225 | restartButton.hide(); 226 | hideScore(); 227 | 228 | game.reset(); 229 | } 230 | } 231 | }; 232 | 233 | exports.shift = function(name) { 234 | if (sceneName === name) 235 | return; 236 | if (sceneName) 237 | scenes[sceneName].exit(); 238 | sceneName = name; 239 | scenes[sceneName].enter(); 240 | }; 241 | 242 | 243 | exports.preload = function() { 244 | createLoadingScreen(); 245 | game.preload(); 246 | 247 | }; 248 | 249 | exports.create = function() { 250 | game.create(); 251 | 252 | createButtons(); 253 | createScoreText(); 254 | }; 255 | 256 | exports.update = function() { 257 | game.update(); 258 | }; 259 | 260 | exports.render = function() { 261 | game.render(); 262 | }; 263 | 264 | }); 265 | -------------------------------------------------------------------------------- /js/sounds.js: -------------------------------------------------------------------------------- 1 | require.register('sounds.js', function(exports, require, module) { 2 | 'use strict'; 3 | 4 | var global = require('global'); 5 | var utils = require('utils'); 6 | var preloadAudio = utils.preloadAudio; 7 | var settings = global.settings; 8 | 9 | function SoundArray(name, opts) { 10 | this.sounds = []; 11 | this.name = name; 12 | this.count = opts.count || 0; 13 | this.currentIndex = 0; 14 | this.recentIndex = 0; 15 | this.loop = !!opts.loop; 16 | this.playing = false; 17 | this.manuallyStopped = false; 18 | } 19 | 20 | SoundArray.prototype.preload = function() { 21 | if (!this.count) { 22 | preloadAudio(this.name); 23 | return; 24 | } 25 | 26 | var key, name = this.name; 27 | for (var i = 0, l = this.count; i < l; i++) { 28 | key = name + '/' + (i + 1); 29 | preloadAudio(key); 30 | } 31 | }; 32 | 33 | SoundArray.prototype.createSound = function(key) { 34 | var sound = global.phaserGame.add.audio(key); 35 | sound.onStop.add(this.onStop, this); 36 | return sound; 37 | }; 38 | 39 | SoundArray.prototype.create = function() { 40 | if (!this.count) { 41 | this.sounds[0] = this.createSound(this.name); 42 | this.count = 1; 43 | return; 44 | } 45 | 46 | var key, name = this.name; 47 | for (var i = 0, l = this.count; i < l; i++) { 48 | key = name + '/' + (i + 1); 49 | this.sounds[i] = this.createSound(key); 50 | } 51 | }; 52 | 53 | SoundArray.prototype.random = function() { 54 | if (this.count === 1) { 55 | return; 56 | } 57 | var index = Math.floor(Math.random() * this.count); 58 | if (this.count < 5) { 59 | this.currentIndex = index; 60 | return; 61 | } 62 | if ( (index !== this.currentIndex && index !== this.recentIndex) || 63 | (index === this.currentIndex && index === this.recentIndex) ) { 64 | this.recentIndex = this.currentIndex; 65 | this.currentIndex = index; 66 | return; 67 | } 68 | return this.random(); 69 | } 70 | 71 | SoundArray.prototype.getSound = function() { 72 | return this.sounds[this.currentIndex]; 73 | }; 74 | 75 | SoundArray.prototype.isPlaying = function() { 76 | return this.playing; 77 | }; 78 | 79 | SoundArray.prototype.onStop = function() { 80 | if (this.loop && !this.manuallyStopped) { 81 | this.play(); 82 | return; 83 | } 84 | this.playing = false; 85 | }; 86 | 87 | SoundArray.prototype.playSound = function() { 88 | this.playing = true; 89 | this.getSound().play(); 90 | }; 91 | 92 | SoundArray.prototype.play = function() { 93 | this.manuallyStopped = false; 94 | this.random(); 95 | this.playSound(); 96 | if (settings.debug) 97 | console.log('sound', this.name, this.currentIndex + 1); 98 | }; 99 | 100 | SoundArray.prototype.playCustom = function(id) { 101 | this.manuallyStopped = true; 102 | this.currentIndex = id - 1; 103 | this.playSound(); 104 | }; 105 | 106 | SoundArray.prototype.stop = function() { 107 | this.manuallyStopped = true; 108 | this.getSound().stop(); 109 | }; 110 | 111 | SoundArray.prototype.toggle = function() { 112 | this.playing ? this.stop() : this.play(); 113 | }; 114 | 115 | var sounds; 116 | 117 | exports = function(name) { 118 | return sounds[name]; 119 | }; 120 | 121 | exports.preload = function() { 122 | sounds = { 123 | 'bgm': {loop: true}, 124 | 'crash': {}, 125 | 'flap': {}, 126 | 'ha': {}, 127 | 'hurt': {count: settings.hurtSounds}, 128 | 'score': {count: settings.scoreSounds} 129 | }; 130 | 131 | var opts; 132 | for (var name in sounds) { 133 | opts = sounds[name]; 134 | sounds[name] = new SoundArray(name, opts); 135 | sounds[name].preload(); 136 | } 137 | }; 138 | 139 | exports.create = function() { 140 | for (var name in sounds) { 141 | sounds[name].create(); 142 | } 143 | }; 144 | 145 | module.exports = exports; 146 | 147 | }); 148 | -------------------------------------------------------------------------------- /js/utils.js: -------------------------------------------------------------------------------- 1 | require.register('utils.js', function(exports, require, module) { 2 | 'use strict'; 3 | 4 | var global = require('global'); 5 | 6 | exports.preloadImage = function(key) { 7 | var path = 'images/' + key + '.png'; 8 | global.phaserGame.load.image(key, path); 9 | }; 10 | 11 | exports.preloadSpritesheet = function(key, w, h) { 12 | var path = 'images/' + key + '.png'; 13 | global.phaserGame.load.spritesheet(key, path, w, h); 14 | }; 15 | 16 | exports.preloadAudio = function(key) { 17 | var path = 'sounds/' + key + '.mp3'; 18 | global.phaserGame.load.audio(key, path); 19 | }; 20 | 21 | exports.overlapAABB = function(left1, top1, right1, bottom1, left2, top2, right2, bottom2) { 22 | return left1 < right2 && 23 | right1 > left2 && 24 | top1 < bottom2 && 25 | bottom1 > top2; 26 | }; 27 | 28 | // https://goo.gl/7K7WLu 29 | exports.unlockAudioContext = function() { 30 | var context = global.phaserGame.sound.context; 31 | if (context && context.state === 'suspended') { 32 | context.resume(); 33 | } 34 | }; 35 | 36 | 37 | exports.parseQueryString = function(qs){ 38 | var result = {}, pairs = qs.split('&'), keyValue; 39 | for(var i = 0, l = pairs.length; i < l; i++) { 40 | keyValue = pairs[i].split('='); 41 | result[keyValue[0]] = decodeURIComponent(keyValue[1]); 42 | } 43 | return result; 44 | }; 45 | 46 | exports.loadSettingsFromUrl = function() { 47 | var qs = window.location.search.substr(1); 48 | if (!qs) 49 | return; 50 | 51 | qs = exports.parseQueryString(qs); 52 | var settings = global.settings, k, v; 53 | 54 | for (k in qs) { 55 | v = qs[k]; 56 | if (!v.length) 57 | continue; 58 | else if (v === 'undefined') 59 | v = undefined; 60 | else if (v === 'null') 61 | v = null; 62 | else if (v === 'true') 63 | v = true; 64 | else if (v === 'false') 65 | v = false; 66 | else if (v[0] === "'" && v[v.length - 1] === "'") 67 | v = v.substring(1, v.length - 1); 68 | else 69 | v = Number(v); 70 | 71 | settings[k] = v; 72 | } 73 | }; 74 | 75 | }); 76 | -------------------------------------------------------------------------------- /sounds/bgm.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/bgm.mp3 -------------------------------------------------------------------------------- /sounds/crash.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/crash.mp3 -------------------------------------------------------------------------------- /sounds/flap.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/flap.mp3 -------------------------------------------------------------------------------- /sounds/ha.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/ha.mp3 -------------------------------------------------------------------------------- /sounds/hurt/1.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/hurt/1.mp3 -------------------------------------------------------------------------------- /sounds/hurt/10.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/hurt/10.mp3 -------------------------------------------------------------------------------- /sounds/hurt/11.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/hurt/11.mp3 -------------------------------------------------------------------------------- /sounds/hurt/12.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/hurt/12.mp3 -------------------------------------------------------------------------------- /sounds/hurt/13.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/hurt/13.mp3 -------------------------------------------------------------------------------- /sounds/hurt/14.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/hurt/14.mp3 -------------------------------------------------------------------------------- /sounds/hurt/15.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/hurt/15.mp3 -------------------------------------------------------------------------------- /sounds/hurt/16.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/hurt/16.mp3 -------------------------------------------------------------------------------- /sounds/hurt/17.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/hurt/17.mp3 -------------------------------------------------------------------------------- /sounds/hurt/18.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/hurt/18.mp3 -------------------------------------------------------------------------------- /sounds/hurt/19.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/hurt/19.mp3 -------------------------------------------------------------------------------- /sounds/hurt/2.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/hurt/2.mp3 -------------------------------------------------------------------------------- /sounds/hurt/20.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/hurt/20.mp3 -------------------------------------------------------------------------------- /sounds/hurt/21.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/hurt/21.mp3 -------------------------------------------------------------------------------- /sounds/hurt/3.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/hurt/3.mp3 -------------------------------------------------------------------------------- /sounds/hurt/4.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/hurt/4.mp3 -------------------------------------------------------------------------------- /sounds/hurt/5.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/hurt/5.mp3 -------------------------------------------------------------------------------- /sounds/hurt/6.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/hurt/6.mp3 -------------------------------------------------------------------------------- /sounds/hurt/7.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/hurt/7.mp3 -------------------------------------------------------------------------------- /sounds/hurt/8.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/hurt/8.mp3 -------------------------------------------------------------------------------- /sounds/hurt/9.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/hurt/9.mp3 -------------------------------------------------------------------------------- /sounds/score/1.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/1.mp3 -------------------------------------------------------------------------------- /sounds/score/10.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/10.mp3 -------------------------------------------------------------------------------- /sounds/score/11.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/11.mp3 -------------------------------------------------------------------------------- /sounds/score/12.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/12.mp3 -------------------------------------------------------------------------------- /sounds/score/13.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/13.mp3 -------------------------------------------------------------------------------- /sounds/score/14.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/14.mp3 -------------------------------------------------------------------------------- /sounds/score/15.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/15.mp3 -------------------------------------------------------------------------------- /sounds/score/16.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/16.mp3 -------------------------------------------------------------------------------- /sounds/score/17.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/17.mp3 -------------------------------------------------------------------------------- /sounds/score/18.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/18.mp3 -------------------------------------------------------------------------------- /sounds/score/19.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/19.mp3 -------------------------------------------------------------------------------- /sounds/score/2.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/2.mp3 -------------------------------------------------------------------------------- /sounds/score/20.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/20.mp3 -------------------------------------------------------------------------------- /sounds/score/21.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/21.mp3 -------------------------------------------------------------------------------- /sounds/score/22.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/22.mp3 -------------------------------------------------------------------------------- /sounds/score/23.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/23.mp3 -------------------------------------------------------------------------------- /sounds/score/24.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/24.mp3 -------------------------------------------------------------------------------- /sounds/score/25.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/25.mp3 -------------------------------------------------------------------------------- /sounds/score/26.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/26.mp3 -------------------------------------------------------------------------------- /sounds/score/27.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/27.mp3 -------------------------------------------------------------------------------- /sounds/score/28.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/28.mp3 -------------------------------------------------------------------------------- /sounds/score/29.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/29.mp3 -------------------------------------------------------------------------------- /sounds/score/3.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/3.mp3 -------------------------------------------------------------------------------- /sounds/score/30.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/30.mp3 -------------------------------------------------------------------------------- /sounds/score/31.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/31.mp3 -------------------------------------------------------------------------------- /sounds/score/32.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/32.mp3 -------------------------------------------------------------------------------- /sounds/score/33.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/33.mp3 -------------------------------------------------------------------------------- /sounds/score/34.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/34.mp3 -------------------------------------------------------------------------------- /sounds/score/35.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/35.mp3 -------------------------------------------------------------------------------- /sounds/score/36.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/36.mp3 -------------------------------------------------------------------------------- /sounds/score/37.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/37.mp3 -------------------------------------------------------------------------------- /sounds/score/38.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/38.mp3 -------------------------------------------------------------------------------- /sounds/score/39.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/39.mp3 -------------------------------------------------------------------------------- /sounds/score/4.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/4.mp3 -------------------------------------------------------------------------------- /sounds/score/40.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/40.mp3 -------------------------------------------------------------------------------- /sounds/score/41.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/41.mp3 -------------------------------------------------------------------------------- /sounds/score/42.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/42.mp3 -------------------------------------------------------------------------------- /sounds/score/43.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/43.mp3 -------------------------------------------------------------------------------- /sounds/score/5.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/5.mp3 -------------------------------------------------------------------------------- /sounds/score/6.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/6.mp3 -------------------------------------------------------------------------------- /sounds/score/7.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/7.mp3 -------------------------------------------------------------------------------- /sounds/score/8.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/8.mp3 -------------------------------------------------------------------------------- /sounds/score/9.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/9.mp3 --------------------------------------------------------------------------------