flappy bird游戏源代码揭秘和下载

2023-12-11 17:18

本文主要是介绍flappy bird游戏源代码揭秘和下载,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

背景:

  最近火爆全球的游戏flappy bird让笔者叹为观止,于是花了一天的时间山寨了一个一模一样的游戏,现在把游戏的思路和源码分享出来,代码是基于javascript语言,cocos2d-x游戏引擎,cocos2d-x editor手游开发工具完成的,请读者轻砸;

  ps:运行demo必须配置好cocos2d-x editor,暂不支持其他工具。还有demo是跨平台的,可移植运行android,ios,html5移动系统等;


Android Apk下载:(演示效果)

 暂时只移植打包到android系统,可下载运行看看效果;

腾讯微云:http://share.weiyun.com/cac18d8c58d40bf2401b3fdeeb6bcb2f


代码下载:

csdn下载:http://download.csdn.net/detail/touchsnow/6912707

百度云盘:http://pan.baidu.com/s/1pJnWDb9

金山快盘 :http://www.kuaipan.cn/file/id_25348935635745384.htm?source=1


代码如何移植到各平台:

 Android:http://blog.csdn.net/touchsnow/article/details/19176091

 html5:       http://blog.makeapp.co/?p=245


效果图:







开发工具:

   cocos2dx editor,它是开发跨平台的手机游戏工具,运行window/mac系统上,javascript脚本语言,基于cocos2d-x跨平台游戏引擎, 集合代码编辑,场景设计,动画制作,字体设计,还有粒子,物理系统,地图等等的,而且调试方便,和实时模拟;

cocos2dx editor 下载,介绍和教程:http://blog.csdn.net/touchsnow/article/details/19070665;

cocos2dx editor官方博客:http://blog.makeapp.co/;(请持续关注版本更新)


思路和源码:


  1 场景设计MainLayer.ccbx,如下图;主要分三层,开始场景、主场景、游戏结束场景,通过显示隐藏控制三个场景的切换。

 

   MainLayer.ccbx代码

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <Document  
  4.         jsControlled="true"  
  5.         jsController="MainLayer"  
  6.         resolution="default"  
  7.         >  
  8.   
  9.     <Resolutions>  
  10.         <Resolution centeredOrigin="false" ext="iphone" height="1280" width="720" name="default" scale="1"/>  
  11.         <Resolution centeredOrigin="false" ext="iphone" height="720" width="1280" name="default1" scale="1"/>  
  12.     </Resolutions>  
  13.   
  14.     <Animations>  
  15.         <Animation autoPlay="true"  
  16.                    id="0"  
  17.                    name="Default Timeline"  
  18.                    length="10"  
  19.                    chainedId="0"  
  20.                    offset="0.0"  
  21.                    position="0.0"  
  22.                    resolution="30"  
  23.                    scale="128">  
  24.             <CallbackChannel>  
  25.             </CallbackChannel>  
  26.             <SoundChannel>  
  27.             </SoundChannel>  
  28.         </Animation>  
  29.   
  30.     </Animations>  
  31.     <Layer  
  32.             positionX="0" positionY="0.0"  
  33.             sizeType="Percent"  
  34.             width="100" height="100"  
  35.             anchorPointX="0.5" anchorPointY="0.5" ignoreAnchorPoint="true"  
  36.             scaleX="1" scaleY="1"  
  37.             >  
  38.   
  39.       <Sprite positionType="LeftBottom" width="720.0" height="1280.0" positionX="0" positionY="0" anchorPointX="0"  
  40.                                          anchorPointY="0" src="Resources/bg.png" name="" var="" target="None" scaleX="1" scaleY="1" visible="true"/>  
  41.       <LayerColor positionType="LeftBottom" width="720" height="1280" positionX="0" positionY="0" anchorPointX="0"  
  42.                   anchorPointY="0" color="#fff2e8ff" visible="false"/>  
  43.       <Menu positionType="LeftBottom" width="40" height="40" positionX="356.0" positionY="237.0" anchorPointX="0.5"  
  44.               anchorPointY="0.5" scaleX="2.4" scaleY="1.725">  
  45.       </Menu>  
  46.       <Sprite positionType="LeftBottom" width="840.0" height="281.0" positionX="0" positionY="0" anchorPointX="0"  
  47.                                          anchorPointY="0" src="Resources/ground.png" var="ground" target="Doc"/>  
  48.       <Node positionType="LeftBottom" width="40" height="40" positionX="800" positionY="250" anchorPointX="0"  
  49.             anchorPointY="0" var="hoseNode" target="Doc">  
  50.         <Sprite positionType="LeftBottom" width="86.0" height="60.0" positionX="-500" positionY="400" anchorPointX="0.5"  
  51.                                          anchorPointY="0.5" src="Resources/flappy_packer.plist/bird3.png" var="test" target="Doc" visible="false"/>  
  52.         <Sprite positionType="LeftBottom" width="86.0" height="60.0" positionX="-550" positionY="500" anchorPointX="0.5"  
  53.                 anchorPointY="0.5" src="Resources/flappy_packer.plist/bird1.png" var="bird" target="Doc" scaleX="1" scaleY="1" rotation="0" visible="true"/>  
  54.       </Node>  
  55.       <Node positionType="LeftBottom" width="40" height="40" positionX="303.0" positionY="500" anchorPointX="0.5"  
  56.             anchorPointY="0.5" var="readyNode" target="Doc" visible="true">  
  57.         <Sprite positionType="LeftBottom" width="508.0" height="158.0" positionX="95.0" positionY="584.0" anchorPointX="0.5"  
  58.                                          anchorPointY="0.5" src="Resources/flappy_packer.plist/getready.png"/>  
  59.         <Sprite positionType="LeftBottom" width="286.0" height="246.0" positionX="73.0" positionY="236.0" anchorPointX="0.5"  
  60.                                          anchorPointY="0.5" src="Resources/flappy_packer.plist/click.png"/>  
  61.       </Node>  
  62.       <Node positionType="LeftBottom" width="40" height="40" positionX="300" positionY="500" anchorPointX="0.5"  
  63.             anchorPointY="0.5" var="overNode" target="Doc" visible="true">  
  64.         <Sprite positionType="LeftBottom" width="590.0" height="298.0" positionX="72.0" positionY="219.0" anchorPointX="0.5"  
  65.                                          anchorPointY="0.5" src="Resources/flappy_packer.plist/base.png">  
  66.           <Sprite positionType="LeftBottom" width="508.0" height="158.0" positionX="286.0" positionY="458.0" anchorPointX="0.5"  
  67.                                          anchorPointY="0.5" src="Resources/flappy_packer.plist/gameover.png"/>  
  68.         </Sprite>  
  69.         <Menu positionType="LeftBottom" width="40" height="40" positionX="0" positionY="0" anchorPointX="0.5"  
  70.               anchorPointY="0.5">  
  71.           <MenuItem positionType="LeftBottom" width="290" height="176" positionX="-65.0" positionY="-92.0" anchorPointX="0.5"  
  72.                     anchorPointY="0.5" normalImage="Resources/flappy_packer.plist/start.png" target="Doc" onClick="onStartClicked"/>  
  73.           <MenuItem positionType="LeftBottom" width="290" height="176" positionX="230.0" positionY="-92.0" anchorPointX="0.5"  
  74.                     anchorPointY="0.5" target="Doc" normalImage="Resources/flappy_packer.plist/grade.png" onClick="onGradeClicked"/>  
  75.         </Menu>  
  76.       </Node>  
  77.     </Layer>  
  78.   
  79.   
  80. </Document>  

 

2 代码编写MainLayer.js

   首先,小鸟在向前飞,其实是底部的路和水管在向左移动,相对的你就感觉小鸟在向右飞了;路循环移动代码:

[javascript]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. MainLayer.prototype.groundRun = function ()  
  2. {  
  3.     var action1 = cc.MoveTo.create(0.5, cc.p(-120, 0));  
  4.     var action2 = cc.MoveTo.create(0, cc.p(0, 0));  
  5.     var action = cc.Sequence.create(action1, action2);  
  6.     this.ground.runAction(cc.RepeatForever.create(action));  
  7. }  

   初始化高低不同的水管,每一关卡都由上下两水管和空隙组成。总长度相同,空隙也一定,随机取下面水管的长度,就形成错落有致的水管关卡;

[javascript]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. MainLayer.prototype.newHose = function (num)  
  2. {  
  3.     var hoseHeight = 830;  
  4.     var acrossHeight = 300;  
  5.     var downHeight = 100 + getRandom(400);  
  6.     var upHeight = 1100 - downHeight - acrossHeight;  
  7.   
  8.     var hoseX = 400 * num;  
  9.   
  10.     var HoseName = FP_MAIN_TEXTURE.HOSE;  
  11.     var ccSpriteDown = cc.Sprite.createWithSpriteFrameName(HoseName[0]);  
  12.     ccSpriteDown.setZOrder(1);  
  13.     ccSpriteDown.setAnchorPoint(cc.p(0, 0));  
  14.     ccSpriteDown.setPosition(cc.p(hoseX, 0));  
  15.     ccSpriteDown.setScaleY(downHeight / hoseHeight);  
  16.   
  17.     var ccSpriteUp = cc.Sprite.createWithSpriteFrameName(HoseName[1]);  
  18.     ccSpriteUp.setZOrder(1);  
  19.     ccSpriteUp.setAnchorPoint(cc.p(0, 0));  
  20.     ccSpriteUp.setPosition(cc.p(hoseX, downHeight + acrossHeight));  
  21.     ccSpriteUp.setScaleY(upHeight / hoseHeight);  
  22.   
  23.     this.hoseNode.addChild(ccSpriteDown);  
  24.     this.hoseNode.addChild(ccSpriteUp);  
  25.     this.hoseSpriteList.push(ccSpriteDown);  
  26.     this.hoseSpriteList.push(ccSpriteUp);  
  27.     return null;  
  28. }  

  一开始进入游戏让底部路不断移动,初始化水管,显示准备游戏场景;

[javascript]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. MainLayer.prototype.onEnter = function ()  
  2. {  
  3.     cc.AnimationCache.getInstance().addAnimations("Resources/flappy_frame.plist");  
  4.     this.groundRun();  
  5.     this.ground.setZOrder(10);  
  6.     this.birdReadyAction();  
  7.     this.bird.setZOrder(20);  
  8.     this.readyNode.setVisible(true);  
  9.     this.overNode.setVisible(false);  
  10.   
  11.     for (var i = 0; i < 30; i++) {  
  12.         this.newHose(i);  
  13.     }  
  14. }  

 点击屏幕,小鸟向上飞60dp,然后更快的速度下落(移动动画),同时闪动翅膀(帧动画);

[javascript]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. MainLayer.prototype.birdRiseAction = function ()  
  2. {  
  3.     var riseHeight = 60;  
  4.     var birdX = this.bird.getPositionX();  
  5.     var birdY = this.bird.getPositionY();  
  6.     var time = birdY / 600;  
  7.   
  8.     var actionFrame = cc.Animate.create(cc.AnimationCache.getInstance().getAnimation("fly"));  
  9.     var flyAction = cc.Repeat.create(actionFrame, 90000);  
  10.     var riseAction1 = cc.MoveTo.create(0.2, cc.p(birdX, birdY + riseHeight));  
  11.     var riseAction2 = cc.RotateTo.create(0, -30);  
  12.     var riseAction = cc.Spawn.create(riseAction1, riseAction2);  
  13.     var fallAction1 = cc.MoveTo.create(time, cc.p(birdX, 50));  
  14.     var fallAction2 = cc.Sequence.create(cc.DelayTime.create(time / 6), cc.RotateTo.create(0, 30));  
  15.     var fallAction = cc.Spawn.create(fallAction1, fallAction2);  
  16.   
  17.     this.bird.stopAllActions();  
  18.     this.bird.runAction(cc.Spawn.create(  
  19.             cc.Sequence.create(riseAction, cc.DelayTime.create(0.1), fallAction),  
  20.             flyAction)  
  21.     );  
  22. }  

 检测碰撞,如果小鸟碰到地面和水管,发生碰撞,这里碰撞直接用cocos2d-x 里面的图片和图片交叉函数 cc.rectIntersectsRect;

[javascript]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. MainLayer.prototype.checkCollision = function ()  
  2. {  
  3.     if (this.bird.getPositionY() < 60) {  
  4.         cc.log("floor");  
  5.         this.birdFallAction();  
  6.         return;  
  7.     }  
  8.     for (var i = 0; i < this.hoseSpriteList.length; i++) {  
  9.         var hose = this.hoseSpriteList[i];  
  10.         if (!this.isInScreen(hose)) {  
  11.             // continue;  
  12.         }  
  13.   
  14.         if (cc.rectIntersectsRect(hose.getBoundingBox(), this.bird.getBoundingBox())) {  
  15.             cc.log("hose positionX==" + hose.getBoundingBox().x);  
  16.             cc.log("this.bird positionX==" + this.bird.getBoundingBox().x);  
  17.             cc.log("i==" + i);  
  18.             cc.log("birdFallAction");  
  19.             this.birdFallAction();  
  20.             return;  
  21.         }  
  22.     }  
  23. }  

碰撞后,小鸟先下落,游戏结束场景显示;

[javascript]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. MainLayer.prototype.birdFallAction = function ()  
  2. {  
  3.     this.gameMode = OVER;  
  4.     this.bird.stopAllActions();  
  5.     this.ground.stopAllActions();  
  6.     var birdX = this.bird.getPositionX();  
  7.     var birdY = this.bird.getPositionY();  
  8.     var time = birdY / 2000;  
  9.     this.bird.runAction(cc.Sequence.create(  
  10.             cc.DelayTime.create(0.1),  
  11.             cc.Spawn.create(cc.RotateTo.create(time, 90), cc.MoveTo.create(time, cc.p(birdX, 50))))  
  12.     );  
  13.     this.overNode.setVisible(true);  
  14. }  

游戏的难度主要在于多个水管的移动,小鸟触摸动画,检测碰撞,我把Mainlayer.js所有代码贴出来;

[javascript]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. FP_MAIN_TEXTURE = {  
  2.     FRAME_ANIMS: "beanstalk/Resources/bs_main_anims.plist",  
  3.     HOSE: ["holdback1.png""holdback2.png"]  
  4. }  
  5.   
  6. READY = 1;  
  7. START = 2;  
  8. OVER = 3;  
  9.   
  10. var MainLayer = function ()  
  11. {  
  12.     cc.log("MainLayer");  
  13.     this.bird = this.bird || {};  
  14.     this.ground = this.ground || {};  
  15.     this.hoseNode = this.hoseNode || {};  
  16.     this.readyNode = this.readyNode || {};  
  17.     this.overNode = this.overNode || {};  
  18.   
  19.     this.passTime = 0;  
  20.     this.hoseSpriteList = [];  
  21.     this.isStart = false;  
  22.   
  23.     this.gameMode = READY;  
  24. };  
  25.   
  26. MainLayer.prototype.onDidLoadFromCCB = function ()  
  27. {  
  28.     if (sys.platform == 'browser') {  
  29.         this.onEnter();  
  30.     }  
  31.     else {  
  32.         this.rootNode.onEnter = function ()  
  33.         {  
  34.             this.controller.onEnter();  
  35.         };  
  36.     }  
  37.   
  38.     this.rootNode.schedule(function (dt)  
  39.     {  
  40.         this.controller.onUpdate(dt);  
  41.     });  
  42.   
  43.     this.rootNode.onExit = function ()  
  44.     {  
  45.         this.controller.onExit();  
  46.     };  
  47.   
  48.     this.rootNode.onTouchesBegan = function (touches, event)  
  49.     {  
  50.         this.controller.onTouchesBegan(touches, event);  
  51.         return true;  
  52.     };  
  53.   
  54.     this.rootNode.onTouchesMoved = function (touches, event)  
  55.     {  
  56.         this.controller.onTouchesMoved(touches, event);  
  57.         return true;  
  58.     };  
  59.     this.rootNode.onTouchesEnded = function (touches, event)  
  60.     {  
  61.         this.controller.onTouchesEnded(touches, event);  
  62.         return true;  
  63.     };  
  64.     this.rootNode.setTouchEnabled(true);  
  65. };  
  66.   
  67. MainLayer.prototype.onEnter = function ()  
  68. {  
  69.     cc.AnimationCache.getInstance().addAnimations("Resources/flappy_frame.plist");  
  70.     this.groundRun();  
  71.     this.ground.setZOrder(10);  
  72.     this.birdReadyAction();  
  73.     this.bird.setZOrder(20);  
  74.     this.readyNode.setVisible(true);  
  75.     this.overNode.setVisible(false);  
  76.   
  77.     for (var i = 0; i < 30; i++) {  
  78.         this.newHose(i);  
  79.     }  
  80. }  
  81.   
  82. MainLayer.prototype.newHose = function (num)  
  83. {  
  84.     var hoseHeight = 830;  
  85.     var acrossHeight = 300;  
  86.     var downHeight = 100 + getRandom(400);  
  87.     var upHeight = 1100 - downHeight - acrossHeight;  
  88.   
  89.     var hoseX = 400 * num;  
  90.   
  91.     var HoseName = FP_MAIN_TEXTURE.HOSE;  
  92.     var ccSpriteDown = cc.Sprite.createWithSpriteFrameName(HoseName[0]);  
  93.     ccSpriteDown.setZOrder(1);  
  94.     ccSpriteDown.setAnchorPoint(cc.p(0, 0));  
  95.     ccSpriteDown.setPosition(cc.p(hoseX, 0));  
  96.     ccSpriteDown.setScaleY(downHeight / hoseHeight);  
  97.   
  98.     var ccSpriteUp = cc.Sprite.createWithSpriteFrameName(HoseName[1]);  
  99.     ccSpriteUp.setZOrder(1);  
  100.     ccSpriteUp.setAnchorPoint(cc.p(0, 0));  
  101.     ccSpriteUp.setPosition(cc.p(hoseX, downHeight + acrossHeight));  
  102.     ccSpriteUp.setScaleY(upHeight / hoseHeight);  
  103.   
  104.     this.hoseNode.addChild(ccSpriteDown);  
  105.     this.hoseNode.addChild(ccSpriteUp);  
  106.     this.hoseSpriteList.push(ccSpriteDown);  
  107.     this.hoseSpriteList.push(ccSpriteUp);  
  108.     return null;  
  109. }  
  110.   
  111. MainLayer.prototype.groundRun = function ()  
  112. {  
  113.     var action1 = cc.MoveTo.create(0.5, cc.p(-120, 0));  
  114.     var action2 = cc.MoveTo.create(0, cc.p(0, 0));  
  115.     var action = cc.Sequence.create(action1, action2);  
  116.     this.ground.runAction(cc.RepeatForever.create(action));  
  117. }  
  118.   
  119. MainLayer.prototype.birdReadyAction = function ()  
  120. {  
  121.     var birdX = this.bird.getPositionX();  
  122.     var birdY = this.bird.getPositionY();  
  123.     var time = birdY / 2000;  
  124.     var actionFrame = cc.Animate.create(cc.AnimationCache.getInstance().getAnimation("fly"));  
  125.     var flyAction = cc.Repeat.create(actionFrame, 90000);  
  126.     this.bird.runAction(cc.Sequence.create(  
  127.             flyAction)  
  128.     );  
  129. }  
  130.   
  131. MainLayer.prototype.birdFallAction = function ()  
  132. {  
  133.     this.gameMode = OVER;  
  134.     this.bird.stopAllActions();  
  135.     this.ground.stopAllActions();  
  136.     var birdX = this.bird.getPositionX();  
  137.     var birdY = this.bird.getPositionY();  
  138.     var time = birdY / 2000;  
  139.     this.bird.runAction(cc.Sequence.create(  
  140.             cc.DelayTime.create(0.1),  
  141.             cc.Spawn.create(cc.RotateTo.create(time, 90), cc.MoveTo.create(time, cc.p(birdX, 50))))  
  142.     );  
  143.     this.overNode.setVisible(true);  
  144. }  
  145.   
  146. MainLayer.prototype.birdRiseAction = function ()  
  147. {  
  148.     var riseHeight = 60;  
  149.     var birdX = this.bird.getPositionX();  
  150.     var birdY = this.bird.getPositionY();  
  151.     var time = birdY / 600;  
  152.   
  153.     var actionFrame = cc.Animate.create(cc.AnimationCache.getInstance().getAnimation("fly"));  
  154.     var flyAction = cc.Repeat.create(actionFrame, 90000);  
  155.     var riseAction1 = cc.MoveTo.create(0.2, cc.p(birdX, birdY + riseHeight));  
  156.     var riseAction2 = cc.RotateTo.create(0, -30);  
  157.     var riseAction = cc.Spawn.create(riseAction1, riseAction2);  
  158.     var fallAction1 = cc.MoveTo.create(time, cc.p(birdX, 50));  
  159.     var fallAction2 = cc.Sequence.create(cc.DelayTime.create(time / 6), cc.RotateTo.create(0, 30));  
  160.     var fallAction = cc.Spawn.create(fallAction1, fallAction2);  
  161.   
  162.     this.bird.stopAllActions();  
  163.     this.bird.runAction(cc.Spawn.create(  
  164.             cc.Sequence.create(riseAction, cc.DelayTime.create(0.1), fallAction),  
  165.             flyAction)  
  166.     );  
  167. }  
  168.   
  169. MainLayer.prototype.onUpdate = function (dt)  
  170. {  
  171.     if (this.gameMode != START) {  
  172.         return;  
  173.     }  
  174.     this.passTime += dt;  
  175.   
  176.     this.hoseNode.setPositionX(800 - 200 * this.passTime);  
  177.     this.bird.setPositionX(-500 + 200 * this.passTime);  
  178.     this.checkCollision();  
  179. }  
  180.   
  181. MainLayer.prototype.checkCollision = function ()  
  182. {  
  183.     if (this.bird.getPositionY() < 60) {  
  184.         cc.log("floor");  
  185.         this.birdFallAction();  
  186.         return;  
  187.     }  
  188.     for (var i = 0; i < this.hoseSpriteList.length; i++) {  
  189.         var hose = this.hoseSpriteList[i];  
  190.         if (!this.isInScreen(hose)) {  
  191.             // continue;  
  192.         }  
  193.   
  194.         if (cc.rectIntersectsRect(hose.getBoundingBox(), this.bird.getBoundingBox())) {  
  195.             cc.log("hose positionX==" + hose.getBoundingBox().x);  
  196.             cc.log("this.bird positionX==" + this.bird.getBoundingBox().x);  
  197.             cc.log("i==" + i);  
  198.             cc.log("birdFallAction");  
  199.             this.birdFallAction();  
  200.             return;  
  201.         }  
  202.     }  
  203. }  
  204.   
  205. MainLayer.prototype.isInScreen = function (sprite)  
  206. {  
  207.     return (sprite.getPositionX() > 0 && sprite.getPositionX() < 720);  
  208. }  
  209.   
  210. MainLayer.prototype.onExitClicked = function ()  
  211. {  
  212. }  
  213.   
  214. MainLayer.prototype.onStartClicked = function ()  
  215. {  
  216.     cc.Director.getInstance().resume();  
  217.     cc.BuilderReader.runScene("""MainLayer");  
  218. }  
  219.   
  220. MainLayer.prototype.onExit = function ()  
  221. {  
  222.     cc.log("onExit");  
  223. }  
  224.   
  225. MainLayer.prototype.onTouchesBegan = function (touches, event)  
  226. {  
  227.     var loc = touches[0].getLocation();  
  228. }  
  229.   
  230. MainLayer.prototype.onTouchesMoved = function (touches, event)  
  231. {  
  232. }  
  233.   
  234. MainLayer.prototype.onTouchesEnded = function (touches, event)  
  235. {  
  236.     if (this.gameMode == OVER) {  
  237.         return;  
  238.     }  
  239.   
  240.     if (this.gameMode == READY) {  
  241.         this.gameMode = START;  
  242.         this.readyNode.setVisible(false);  
  243.     }  
  244.   
  245.     var loc = touches[0].getLocation();  
  246.     this.birdRiseAction();  
  247.   
  248. }  
  249.   
  250. function isInRect(ccRect, ccTouchBeganPos)  
  251. {  
  252.     if (ccTouchBeganPos.x > ccRect.x && ccTouchBeganPos.x < (ccRect.x + ccRect.width)) {  
  253.         if (ccTouchBeganPos.y > ccRect.y && ccTouchBeganPos.y < (ccRect.y + ccRect.height)) {  
  254.             return true;  
  255.         }  
  256.     }  
  257.     return false;  
  258. }  
  259.   
  260. function getRandom(maxSize)  
  261. {  
  262.     return Math.floor(Math.random() * maxSize) % maxSize;  
  263. }  

再次提示代码下载地址:

csdn下载:http://download.csdn.net/detail/touchsnow/6912707

百度云盘:http://pan.baidu.com/s/1pJnWDb9

金山快盘 :http://www.kuaipan.cn/file/id_25348935635745384.htm?source=1


flappy博文系列:

flappy bird游戏源代码揭秘和下载

flappy bird游戏源代码揭秘和下载后续---移植到android真机上

flappy bird游戏源代码揭秘和下载后续---移植到html5网页浏览器

flappy bird游戏源代码揭秘和下载后续---日进5万美元的秘诀AdMob广告 (将写

flappy bird游戏源代码揭秘和下载后续---移植到苹果ios上 (未写


笔者语:

想了解更多请进入官方博客,最新博客和代码在官方博客首发;请持续关注,还有更多cocos2dx editor游戏源码即将放出;

联系笔者:zuowen@makeapp.co(邮箱)


后言:

为了鼓励更多手游爱好者加入cocos2d-x editor阵营,也为了读者坚定对该工具的信心,笔者基于以上的flappy bird代码和新的图片资源,往google play和中国应用市场发布了一个相似的游戏----腾飞的小鸟(fly bird)。该游戏还加入了广告模块,可以获得些许的广告费。也希望读者通过cocos2d-x editor可以在市场上发布更多的好游戏;

google play地址:https://play.google.com/store/apps/details?id=com.makeapp.game.flybird (小秘密:如果应用.apk后缀改为.rar,你会获得意想不到的东西

机锋市场地址:    http://apk.gfan.com/Product/App741996.html

html5在线演示:http://www.makeapp.co/flybird/ (微软ie浏览器存在兼容性问题,请选择其他浏览器;公司内网,小卡,见谅)

这篇关于flappy bird游戏源代码揭秘和下载的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/481454

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

揭秘世界上那些同时横跨两大洲的国家

我们在《世界人口过亿的一级行政区分布》盘点全球是那些人口过亿的一级行政区。 现在我们介绍五个横跨两州的国家,并整理七大洲和这些国家的KML矢量数据分析分享给大家,如果你需要这些数据,请在文末查看领取方式。 世界上横跨两大洲的国家 地球被分为七个大洲分别是亚洲、欧洲、北美洲、南美洲、非洲、大洋洲和南极洲。 七大洲示意图 其中,南极洲是无人居住的大陆,而其他六个大洲则孕育了众多国家和

三国地理揭秘:为何北伐之路如此艰难,为何诸葛亮无法攻克陇右小城?

俗话说:天时不如地利,不是随便说说,诸葛亮六出祁山,连关中陇右的几座小城都攻不下来,行军山高路险,无法携带和建造攻城器械,是最难的,所以在汉中,无论从哪一方进攻,防守方都是一夫当关,万夫莫开;再加上千里运粮,根本不需要打,司马懿只需要坚守城池拼消耗就能不战而屈人之兵。 另一边,洛阳的虎牢关,一旦突破,洛阳就无险可守,这样的进军路线,才是顺势而为的用兵之道。 读历史的时候我们常常看到某一方势

常用的jdk下载地址

jdk下载地址 安装方式可以看之前的博客: mac安装jdk oracle 版本:https://www.oracle.com/java/technologies/downloads/ Eclipse Temurin版本:https://adoptium.net/zh-CN/temurin/releases/ 阿里版本: github:https://github.com/

无线领夹麦克风什么牌子好用?揭秘领夹麦克风哪个牌子音质好!

随着短视频行业的星期,围绕着直播和视频拍摄的电子数码类产品也迎来了热销不减的高增长,其中除了数码相机外,最为重要的麦克风也得到了日益增长的高需求,尤其是无线领夹麦克风,近几年可谓是异常火爆。别看小小的一对无线麦克风,它对于视频拍摄的音质起到了极为关键的作用。 不过目前市面上的麦克风品牌种类多到让人眼花缭乱,盲目挑选的话容易踩雷,那么无线领夹麦克风什么牌子好用?今天就给大家推荐几款音质好的

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

负债不再是障碍?银行信贷“白名单“揭秘

谈及银行信贷产品,常闻有言称存在无需考量负债与查询记录之奇品,此等说法十有八九为中介诱人上钩之辞。轻信之下,恐将步入连环陷阱。除非个人资质出类拔萃,如就职于国央企或事业单位,工龄逾年,五险一金完备,还款能力卓越,或能偶遇线下产品对查询记录稍显宽容,然亦非全然无视。宣称全然不顾者,纯属无稽之谈。 银行非慈善机构,不轻易于困境中援手,更偏爱锦上添花之举。若无坚实资质,即便求助于银行亦难获青睐。反

国产游戏崛起:技术革新与文化自信的双重推动

近年来,国产游戏行业发展迅猛,技术水平和作品质量均得到了显著提升。特别是以《黑神话:悟空》为代表的一系列优秀作品,成功打破了过去中国游戏市场以手游和网游为主的局限,向全球玩家展示了中国在单机游戏领域的实力与潜力。随着中国开发者在画面渲染、物理引擎、AI 技术和服务器架构等方面取得了显著进展,国产游戏正逐步赢得国际市场的认可。然而,面对全球游戏行业的激烈竞争,国产游戏技术依然面临诸多挑战,未来的

2. 下载rknn-toolkit2项目

官网链接: https://github.com/airockchip/rknn-toolkit2 安装好git:[[1. Git的安装]] 下载项目: git clone https://github.com/airockchip/rknn-toolkit2.git 或者直接去github下载压缩文件,解压即可。

前端form表单+ifarme方式实现大文件下载

// main.jsimport Vue from 'vue';import App from './App.vue';import { downloadTokenFile } from '@/path/to/your/function'; // 替换为您的函数路径// 将 downloadTokenFile 添加到 Vue 原型上Vue.prototype.$downloadTokenF