HelloWorldScene.cpp

  1. #include "HelloWorldScene.h"
  2.  
  3. USING_NS_CC;
  4.  
  5. CCScene* HelloWorld::scene()
  6. {
  7. // 'scene' is an autorelease object
  8. CCScene *scene = CCScene::create();
  9.  
  10. // 'layer' is an autorelease object
  11. HelloWorld *layer = HelloWorld::create();
  12.  
  13. //添加一个背景颜色图层
  14. CCSize s = CCDirector::sharedDirector()->getWinSize();
  15.  
  16. CCLayer *colorlayer = CCLayerColor::create(ccc4(0x00, 0xff, 0xff, 0xff), s.width, s.height);
  17.  
  18. colorlayer->ignoreAnchorPointForPosition(false);
  19.  
  20. colorlayer->setPosition(s.width / , s.height / );
  21.  
  22. scene->addChild(colorlayer, , colorlayer->getTag());
  23.  
  24. // add layer as a child to scene
  25. //将主图层添加都背景图层中
  26. colorlayer->addChild(layer);
  27.  
  28. // return the scene
  29. return scene;
  30. }
  31.  
  32. // on "init" you need to initialize your instance
  33. bool HelloWorld::init()
  34. {
  35. //////////////////////////////
  36. // 1. super init first
  37. if ( !CCLayer::init() )
  38. {
  39. return false;
  40. }
  41.  
  42. //取得屏幕的大小
  43. screenSize = CCDirector::sharedDirector()->getVisibleSize();
  44.  
  45. //初始化世界
  46. initWorld();
  47.  
  48. //添加小鸟、障碍物容器及地面
  49. addBird();
  50. addBarContainer();
  51. addGround();
  52.  
  53. //每隔一秒添加一组障碍物
  54. scheduleUpdate();
  55. schedule(schedule_selector(HelloWorld::addBar), 1.0f);
  56.  
  57. //设置允许触摸
  58. setTouchEnabled(true);
  59.  
  60. return true;
  61. }
  62.  
  63. void HelloWorld::initWorld()
  64. {
  65. //重力加速度:纵向9.8,横向 0
  66. world = new b2World(b2Vec2(, -9.8f));
  67. //添加监视
  68. world->SetContactListener(this);
  69. }
  70.  
  71. void HelloWorld::startGame(float dt){
  72. scheduleUpdate();
  73. schedule(schedule_selector(HelloWorld::addBar), );
  74. }
  75.  
  76. void HelloWorld::stopGame(){
  77. unscheduleUpdate();
  78. unschedule(schedule_selector(HelloWorld::addBar));
  79. }
  80.  
  81. void HelloWorld::addBird()
  82. {
  83. bird = B2Sprite::create("bird.png");
  84. CCSize size = bird->getContentSize();
  85.  
  86. //添加小鸟
  87. b2BodyDef bodyDef;
  88. bodyDef.type = b2_dynamicBody;
  89. bodyDef.position = b2Vec2(screenSize.width//RATIO, screenSize.height//RATIO);
  90. b2Body * birdBody = world->CreateBody(&bodyDef);
  91.  
  92. //设置边界
  93. b2PolygonShape birdShape;
  94. birdShape.SetAsBox(size.width//RATIO, size.height//RATIO);
  95.  
  96. //碰撞
  97. b2FixtureDef birdFixtureDef;
  98. birdFixtureDef.shape= &birdShape;
  99. birdBody->CreateFixture(&birdFixtureDef);
  100.  
  101. bird->setPTMRatio(RATIO);
  102. bird->setB2Body(birdBody);
  103. addChild(bird);
  104. }
  105.  
  106. void HelloWorld::addBar(float dt)
  107. {
  108. float offset = -rand()%;
  109.  
  110. //downbar
  111. B2Sprite *downBar = B2Sprite::create("down_bar.png");
  112. CCSize downBarSize = downBar->getContentSize();
  113.  
  114. b2BodyDef downBarBodyDef;
  115. downBarBodyDef.type = b2_kinematicBody;
  116. downBarBodyDef.position = b2Vec2(screenSize.width/RATIO + , downBarSize.height/RATIO/ + offset);
  117. downBarBodyDef.linearVelocity = b2Vec2(-5.0f, );
  118.  
  119. b2PolygonShape downBarShape;
  120. downBarShape.SetAsBox(downBarSize.width/RATIO/, downBarSize.height/RATIO/);
  121.  
  122. b2FixtureDef downBarFixtureDef;
  123. downBarFixtureDef.shape = &downBarShape;
  124.  
  125. b2Body *downBarBody = world->CreateBody(&downBarBodyDef);
  126. downBarBody->CreateFixture(&downBarFixtureDef);
  127.  
  128. downBar->setB2Body(downBarBody);
  129. downBar->setPTMRatio(RATIO);
  130.  
  131. //upbar
  132. B2Sprite *upBar = B2Sprite::create("up_bar.png");
  133. CCSize upBarSize = upBar->getContentSize();
  134.  
  135. b2BodyDef upBarBodyDef;
  136. upBarBodyDef.type = b2_kinematicBody;
  137. upBarBodyDef.position = b2Vec2(screenSize.width/RATIO + , upBarSize.height/RATIO/ + offset + downBarSize.height/RATIO + 2.5f);
  138. upBarBodyDef.linearVelocity = b2Vec2(-, );
  139.  
  140. b2PolygonShape upBarShape;
  141. upBarShape.SetAsBox(upBarSize.width/RATIO/, upBarSize.height/RATIO/);
  142.  
  143. b2FixtureDef upBarFixtureDef;
  144. upBarFixtureDef.shape = &upBarShape;
  145.  
  146. b2Body *upBarBody = world->CreateBody(&upBarBodyDef);
  147. upBarBody->CreateFixture(&upBarFixtureDef);
  148.  
  149. upBar->setB2Body(upBarBody);
  150. upBar->setPTMRatio(RATIO);
  151.  
  152. barContainer->addChild(upBar);
  153. barContainer->addChild(downBar);
  154. }
  155.  
  156. void HelloWorld::addBarContainer()
  157. {
  158. //将所有的障碍物包裹在一个容器中
  159. barContainer = CCSprite::create();
  160. addChild(barContainer);
  161. }
  162.  
  163. void HelloWorld::addGround()
  164. {
  165. B2Sprite *ground = B2Sprite::create("ground.png");
  166. CCSize size = ground->getContentSize();
  167.  
  168. b2BodyDef bDef;
  169. bDef.type = b2_staticBody;
  170. bDef.position = b2Vec2(size.width//RATIO, size.height//RATIO);
  171. b2Body *groundBody = world->CreateBody(&bDef);
  172.  
  173. b2PolygonShape groundShape;
  174. groundShape.SetAsBox(size.width//RATIO, size.height//RATIO);
  175.  
  176. b2FixtureDef groundFixtureDef;
  177. groundFixtureDef.shape = &groundShape;
  178. groundBody->CreateFixture(&groundFixtureDef);
  179.  
  180. ground->setPTMRatio(RATIO);
  181. ground->setB2Body(groundBody);
  182. addChild(ground);
  183. }
  184.  
  185. void HelloWorld::update(float dt)
  186. {
  187. world->Step(dt, , );
  188.  
  189. CCSprite *sprite;
  190.  
  191. //取得世界中的所有的body
  192. b2Body *node = world->GetBodyList();
  193.  
  194. //遍历世界中的body
  195. while(node)
  196. {
  197. b2Body *body = node;
  198. node = node->GetNext();
  199. sprite = (CCSprite*)body->GetUserData();
  200.  
  201. //超出屏幕左边界,销毁
  202. if (body->GetPosition().x < -)
  203. {
  204. if (sprite != NULL)
  205. {
  206. //在屏幕上清除
  207. sprite->removeFromParent();
  208. }
  209. //在内存中销毁
  210. world->DestroyBody(body);
  211. }
  212. }
  213. }
  214.  
  215. void HelloWorld::BeginContact(b2Contact *contact){
  216. //碰撞检测,有一个为鸟游戏就结束
  217. if (contact->GetFixtureA()->GetBody()->GetUserData()==bird || contact->GetFixtureB()->GetBody()->GetUserData()==bird)
  218. {
  219. //游戏结束,弹出dialog
  220. stopGame();
  221. CCMessageBox("Game Over", "Alert");
  222. }
  223. }
  224.  
  225. void HelloWorld::ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent)
  226. {
  227. //触碰屏幕时,小鸟向上运动,重力加速度:纵向 5,横向 0
  228. bird->getB2Body()->SetLinearVelocity(b2Vec2(, 5.0f));
  229. }
  230.  
  231. void HelloWorld::menuCloseCallback(CCObject* pSender)
  232. {
  233. #if (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) || (CC_TARGET_PLATFORM == CC_PLATFORM_WP8)
  234. CCMessageBox("You pressed the close button. Windows Store Apps do not implement a close button.","Alert");
  235. #else
  236. CCDirector::sharedDirector()->end();
  237. #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
  238. exit();
  239. #endif
  240. #endif
  241. }

HelloWorldScene.h

  1. #ifndef __HELLOWORLD_SCENE_H__
  2. #define __HELLOWORLD_SCENE_H__
  3.  
  4. #include "cocos2d.h"
  5. #include "Box2D\Box2D.h"
  6. #include "B2Sprite.h"
  7.  
  8. #define RATIO 72.0f
  9.  
  10. class HelloWorld : public cocos2d::CCLayer,public b2ContactListener
  11. {
  12. public:
  13. // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
  14. virtual bool init();
  15.  
  16. // there's no 'id' in cpp, so we recommend returning the class instance pointer
  17. static cocos2d::CCScene* scene();
  18.  
  19. // a selector callback
  20. void menuCloseCallback(CCObject* pSender);
  21.  
  22. // implement the "static node()" method manually
  23. CREATE_FUNC(HelloWorld);
  24.  
  25. virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent);
  26. virtual void BeginContact(b2Contact* contact);
  27.  
  28. virtual void update(float dt);
  29.  
  30. b2World *world;
  31. B2Sprite *bird;
  32.  
  33. CCSize screenSize;
  34.  
  35. CCSprite *barContainer;
  36.  
  37. private:
  38. void addBird();
  39. void addGround();
  40. void initWorld();
  41. void addBar(float dt);
  42. void addBarContainer();
  43. void startGame(float dt);
  44. void stopGame();
  45. };
  46.  
  47. #endif // __HELLOWORLD_SCENE_H__

Cocos2d-x FlappyBird的更多相关文章

  1. Cocos2d-x 2.3.3版本 FlappyBird

    Cocos2d-x 2.3.3版本 FlappyBird   本篇博客基于Cocos2d-x 2.3.3, 介绍怎样开发一款之前非常火的一款游戏FlappyBird.本篇博客内容大纲例如以下:   1 ...

  2. 小尝试一下 cocos2d

    好奇 cocos2d 到底是怎样一个框架,正好有个项目需要一个游戏框架,所以稍微了解了一下.小结一下了解到的情况. 基本概念 首先呢,因为 cocos2d 是基于 pyglet 做的,你完全可以直接用 ...

  3. 采用cocos2d-x lua 制作数字滚动效果样例

    require "Cocos2d"require "Cocos2dConstants"local testscene = class("testsce ...

  4. Cocos2d 利用继承Draw方法制作可显示三维数据(宠物三维等)的三角形显示面板

    很久没有写博客了,这段时间比较忙,又是搬家又是做自己的项目,还有太多琐碎的事情缠身,好不容易抽出时间把最近自己做的一些简单例子记录一下. 在我的项目中,我需要一个显示面板来显示游戏中的一个三维数据,例 ...

  5. cocos2dx 实现flappybird

    前两天在博客园看到网友实现的一个网页版的flappy bird,挂在360游戏平台,玩了一会儿得分超低,就很想自己做一个.刚好这两天炫舞的活都清了,就弄一下玩玩. 效果图 布局类GameScene.h ...

  6. [Canvas前端游戏开发]——FlappyBird详解

    一直想自己做点小东西,直到最近看了本<HTML5游戏开发>,才了解游戏开发中的一点点入门知识. 本篇就针对学习的几个样例,自己动手实践,做了个FlappyBird,源码共享在度盘 :也可以 ...

  7. iPhone开发与cocos2d 经验谈

    转CSDN jilongliang : 首先,对于一个完全没有mac开发经验,甚至从没摸过苹果系统的开发人员来说,首先就是要熟悉apple的那一套开发框架(含开发环境IDE.开发框架uikit,还有开 ...

  8. cocos2d学习记录

    视频 - http://www.manew.com/forum-105-3.html一个论坛帖 - http://www.zhihu.com/question/21114802官网 - http:// ...

  9. Android下Cocos2d创建HelloWorld工程

    最近在搭建Cocos2d的环境,结果各种问题,两人弄了一天才能搞好一个环境-! -_-!! 避免大家也可能会遇到我这种情况,所以写一个随笔,让大家也了解下如何搭建吧- 1.环境安装准备 下载 tadp ...

  10. 学生信息管理系统(cocos2d引擎)——数据结构课程设计

    老师手把手教了两天半,看了一下模式,加了几个功能就大功告成了!!! 给我的感想就是全都是指针! 添加图片精灵: CCSprite*  spBG = CCSprite::create("&qu ...

随机推荐

  1. Box2d学习

    Box2d 学习 . Testbed 项目: Testbed 是 Box2d 源码里包含的一个例子程序.Testbed 封装了界面显示.游戏循环等部分的代码.添加新的例子的时候,只需要关注与 Box ...

  2. power designer 连接数据库提示“connection test failed”

    利用powerdesigner反向生成表结构时,需要mysql连接,配置好连接,测试时直接报:connection test failed”! OS:WIN7 旗舰版 64位 JDK: 64位 Pow ...

  3. ZOJ 3367 Counterfeit Money(最大相同子矩阵)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3909 题意:给出两个矩阵A和B,找出最大的相同子矩阵S.输出S的高和 ...

  4. BZOJ 1041 圆上的整点

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1041 题意:求圆x^2+y^2=r^2上的整点. 思路:由于对称性,我们只需要计算第一象 ...

  5. char和vchar

    Varchar往往用来保存可变长度的字符串.简单的说,我们只是给其固定了一个最大值,然后系统会根据实际存储的数据量来分配合适的存储空间. 为此相比CHAR字符数据而言,其能够比固定长度类型占用更少的存 ...

  6. C语言输出当前日期和时间

    #include <stdio.h> #include <time.h> char* asctime2(const struct tm *timeptr) { static c ...

  7. [HIHO1143]骨牌覆盖问题·一(矩阵快速幂,递推)

    题目链接:http://hihocoder.com/problemset/problem/1143 这个递推还是很经典的,结果是斐波那契数列.f(i) = f(i-1) + f(i-2).数据范围太大 ...

  8. leetcode:Implement Stack using Queues 与 Implement Queue using Stacks

    一.Implement Stack using Queues Implement the following operations of a stack using queues. push(x) - ...

  9. js判断页面放大缩小

    项目中,经常会碰到页面被放大或者缩小,导致页面显示错误,js可以判断页面放大缩小. // 若返回100则为默认无缩放,如果大于100则是放大,否则缩小 function detectZoom (){ ...

  10. typedef struct trx_struct trx_t;

    /* The transaction handle; every session has a trx object which is freed only when the session is fr ...