Cocos2d-x 2.3.3版本 FlappyBird
1. 怎样创建Cocos2d-x 2.3.3
2. 初始化Box2d物理世界,并模拟物理世界
- // -10表示重力加速度方向为向下
- world = new b2World(b2Vec2(0, -10));
- // 模拟物理世界
- // Box2D建议的迭代次数是速度阶段8次,位置阶段3次
- world->Step(dt, 8, 3);
3. 怎样加入小鸟到物理世界
关于Box2d相关的概念。笔者在这里不具体说,读者能够自己找百度老师。学习很多其它关于Box2d的知识。
- /**
- * 加入小鸟
- *
- */
- void HelloWorld::addBird()
- {
- // 创建小鸟
- bird = B2Sprite::create("bird.png");
- // 获取内容大小
- CCSize size = bird->getContentSize();
- // 刚体属性
- b2BodyDef bodyDef;
- // 动态刚体
- bodyDef.type = b2_dynamicBody;
- // 设置初始位置
- bodyDef.position = b2Vec2(screenSize.width/2/RATIO, screenSize.height/2/RATIO);
- // 创建一个小鸟刚体
- b2Body *birdBody = world->CreateBody(&bodyDef);
- // 隐形形状
- b2PolygonShape birdShape;
- // 设置为盒子。參数为内容的半宽半高
- birdShape.SetAsBox(size.width/2/RATIO, size.height/2/RATIO);
- // 材料属性
- b2FixtureDef birdFixtureDef;
- // 形状
- birdFixtureDef.shape = &birdShape;
- // 加入地表物体
- birdBody->CreateFixture(&birdFixtureDef);
- // 设置度量比例
- bird->setPTMRatio(RATIO);
- // 设置小鸟刚体
- bird->setB2Body(birdBody);
- // 加入小鸟到层中
- addChild(bird);
- }
4. 怎样加入地板
- /**
- * 加入地板
- */
- void HelloWorld::addGround()
- {
- // 地板精灵
- B2Sprite *ground = B2Sprite::create("ground.png");
- // 得到地板内容的大小
- CCSize size = ground->getContentSize();
- // 用于初始化刚体在物理世界的一些属性。比方位置,类型
- b2BodyDef bDef;
- // 静态的刚体
- bDef.type = b2_staticBody;
- // 设置位置
- bDef.position = b2Vec2(size.width/2/RATIO, size.height/2/RATIO);
- // 创建刚体
- b2Body *groundBody = world->CreateBody(&bDef);
- // 形状
- b2PolygonShape groundShape;
- // 设置为矩形
- groundShape.SetAsBox(size.width/2/RATIO, size.height/2/RATIO);
- // 材料定制器
- b2FixtureDef groundFixtureDef;
- // 设置形状
- groundFixtureDef.shape = &groundShape;
- // 创建定制器
- groundBody->CreateFixture(&groundFixtureDef);
- // 为精灵设置刚体
- ground->setB2Body(groundBody);
- // 设置度量比例
- ground->setPTMRatio(RATIO);
- // 加入地板到层其中
- addChild(ground);
- }
5. 加入水管
- / 加入运动的水管
- void HelloWorld::addBar(float dt) {
- // 随机生成偏移量
- float offset = -rand() %5;
- // 创建向下水管的精灵
- B2Sprite *down_bar = B2Sprite::create("down_bar.png");
- // 得到水管的大小
- CCSize down_bar_size = down_bar->getContentSize();
- // 下水管
- b2BodyDef down_bar_body_def;
- // 运动学物体,但不受重力影响
- down_bar_body_def.type = b2_kinematicBody;
- // 设置下水管的位置
- down_bar_body_def.position = b2Vec2(screenSize.width/RATIO + 2, down_bar_size.height/RATIO/2 +offset);
- // 线性速度,从右往左移动
- down_bar_body_def.linearVelocity = b2Vec2(-5,0);
- // 创建刚体
- b2Body *down_bar_body = world->CreateBody(&down_bar_body_def);
- // 隐形形状
- b2PolygonShape down_bar_shape;
- // 设置为盒子,參数为内容的半宽半高
- down_bar_shape.SetAsBox(down_bar_size.width/2/RATIO, down_bar_size.height/2/RATIO);
- // 声明定制器
- b2FixtureDef down_bar_fixture_def;
- // 定制器形状
- down_bar_fixture_def.shape = &down_bar_shape;
- // 为刚体创建定制器
- down_bar_body->CreateFixture(&down_bar_fixture_def);
- // 设置精灵刚体
- down_bar->setB2Body(down_bar_body);
- // 设置度量
- down_bar->setPTMRatio(RATIO);
- // 上水管
- B2Sprite *up_bar = B2Sprite::create("up_bar.png");
- // 获得内容大小
- CCSize up_bar_size = up_bar->getContentSize();
- b2BodyDef up_bar_body_def;
- // 运动学物体。但不受重力影响
- up_bar_body_def.type = b2_kinematicBody;
- // 设置水管位置
- up_bar_body_def.position = b2Vec2(screenSize.width/RATIO+2, down_bar_size.height/RATIO+offset+2+up_bar_size.height/2/RATIO);
- up_bar_body_def.linearVelocity = b2Vec2(-5, 0);
- b2Body *up_bar_body = world->CreateBody(&up_bar_body_def);
- // 隐形形状
- b2PolygonShape up_bar_shape;
- // 设置为盒子形状,參数为半宽半高
- up_bar_shape.SetAsBox(up_bar_size.width/2/RATIO, up_bar_size.height/2/RATIO);
- b2FixtureDef up_bar_fixture_def;
- up_bar_fixture_def.shape = &up_bar_shape;
- up_bar_body->CreateFixture(&up_bar_fixture_def);
- up_bar->setB2Body(up_bar_body);
- up_bar->setPTMRatio(RATIO);
- barContainer->addChild(down_bar);
- barContainer->addChild(up_bar);
- }
6. 加入碰撞检測
- virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent);
实现:
- // 触摸事件開始
- void HelloWorld::ccTouchesBegan(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent) {
- bird->getB2Body()->SetLinearVelocity(b2Vec2(0, 5));
- }
接下来讲碰撞检測,这个我们相同也要设置监听器,我们设置的是物理世界的事件监听。
- // 加入碰撞监听
- world->SetContactListener(this);
- virtual void BeginContact(b2Contact* contact);
- void HelloWorld::BeginContact(b2Contact *contact) {
- // 发生碰撞,则弹出对话框
- if (contact->GetFixtureA()->GetBody()->GetUserData() == bird ||
- contact->GetFixtureB()->GetBody()->GetUserData() == bird) {
- stopGame();
- CCMessageBox("游戏失败","游戏失败");
- }
- }
7. 本文总结
- #ifndef __HELLOWORLD_SCENE_H__
- #define __HELLOWORLD_SCENE_H__
- #include "cocos2d.h"
- #include "Box2D\Box2D.h"// 引入Box2D物理引擎
- #include "B2Sprite.h"
- // 定义物理世界的比例
- #define RATIO 48.0f
- class HelloWorld : public cocos2d::CCLayer,public b2ContactListener
- {
- public:
- // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
- virtual bool init();
- // there's no 'id' in cpp, so we recommend returning the class instance pointer
- static cocos2d::CCScene* scene();
- // a selector callback
- void menuCloseCallback(CCObject* pSender);
- // implement the "static node()" method manually
- CREATE_FUNC(HelloWorld);
- virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent);
- virtual void BeginContact(b2Contact* contact);
- // 重写update方法
- virtual void update(float dt);
- // 声明物理世界引用
- b2World *world;
- B2Sprite *bird;
- CCSize screenSize;
- CCSprite *barContainer;
- private:
- // 加入小鸟
- void addBird();
- // 初始化物理世界
- void initWorld();
- // 加入地板
- void addGround();
- // 加入水管
- void addBar(float dt);
- // 加入一个容器
- void addBarContainer();
- // 開始游戏
- void startGame(float dt);
- // 结束游戏
- void stopGame();
- };
- #endif // __HELLOWORLD_SCENE_H__
HelloWorldScene.cpp
- #include "HelloWorldScene.h"
- USING_NS_CC;
- CCScene* HelloWorld::scene()
- {
- // 'scene' is an autorelease object
- CCScene *scene = CCScene::create();
- // 'layer' is an autorelease object
- HelloWorld *layer = HelloWorld::create();
- // add layer as a child to scene
- scene->addChild(layer);
- // return the scene
- return scene;
- }
- // on "init" you need to initialize your instance
- bool HelloWorld::init()
- {
- //////////////////////////////
- // 1. super init first
- if ( !CCLayer::init() )
- {
- return false;
- }
- // 获取屏幕大小
- screenSize = CCDirector::sharedDirector()->getVisibleSize();
- initWorld();
- addBird();
- addBarContainer();
- addGround();
- // 设置可点击
- setTouchEnabled(true);
- //scheduleUpdate();
- //schedule(schedule_selector(HelloWorld::addBar), 1);
- // 3秒之后运行
- scheduleOnce(schedule_selector(HelloWorld::startGame),3);
- return true;
- }
- /**
- * 加入小鸟
- *
- */
- void HelloWorld::addBird()
- {
- // 创建小鸟
- bird = B2Sprite::create("bird.png");
- // 获取内容大小
- CCSize size = bird->getContentSize();
- // 刚体属性
- b2BodyDef bodyDef;
- // 动态刚体
- bodyDef.type = b2_dynamicBody;
- // 设置初始位置
- bodyDef.position = b2Vec2(screenSize.width/2/RATIO, screenSize.height/2/RATIO);
- // 创建一个小鸟刚体
- b2Body *birdBody = world->CreateBody(&bodyDef);
- // 隐形形状
- b2PolygonShape birdShape;
- // 设置为盒子。參数为内容的半宽半高
- birdShape.SetAsBox(size.width/2/RATIO, size.height/2/RATIO);
- // 材料属性
- b2FixtureDef birdFixtureDef;
- // 形状
- birdFixtureDef.shape = &birdShape;
- // 加入地表物体
- birdBody->CreateFixture(&birdFixtureDef);
- // 设置度量比例
- bird->setPTMRatio(RATIO);
- // 设置小鸟刚体
- bird->setB2Body(birdBody);
- // 加入小鸟到层中
- addChild(bird);
- }
- // 初始化物理世界
- void HelloWorld::initWorld()
- {
- // -10表示重力加速度方向为向下
- world = new b2World(b2Vec2(0, -10));
- // 加入碰撞监听
- world->SetContactListener(this);
- }
- // 更新
- void HelloWorld::update(float dt)
- {
- // 模拟物理世界
- // Box2D建议的迭代次数是速度阶段8次。位置阶段3次
- world->Step(dt, 8, 3);
- CCSprite *s;
- // 遍历销毁
- for (b2Body *b = world->GetBodyList(); b!= NULL; b=b->GetNext()) {
- if (b->GetPosition().x<-3) {
- s = (CCSprite*)b->GetUserData();
- if (s != NULL) {
- s->removeFromParent();
- CCLog("Remove");
- }
- world->DestroyBody(b);
- }
- }
- }
- /**
- * 加入地板
- */
- void HelloWorld::addGround()
- {
- // 地板精灵
- B2Sprite *ground = B2Sprite::create("ground.png");
- // 得到地板内容的大小
- CCSize size = ground->getContentSize();
- // 用于初始化刚体在物理世界的一些属性。比方位置,类型
- b2BodyDef bDef;
- // 静态的刚体
- bDef.type = b2_staticBody;
- // 设置位置
- bDef.position = b2Vec2(size.width/2/RATIO, size.height/2/RATIO);
- // 创建刚体
- b2Body *groundBody = world->CreateBody(&bDef);
- // 形状
- b2PolygonShape groundShape;
- // 设置为矩形
- groundShape.SetAsBox(size.width/2/RATIO, size.height/2/RATIO);
- // 材料定制器
- b2FixtureDef groundFixtureDef;
- // 设置形状
- groundFixtureDef.shape = &groundShape;
- // 创建定制器
- groundBody->CreateFixture(&groundFixtureDef);
- // 为精灵设置刚体
- ground->setB2Body(groundBody);
- // 设置度量比例
- ground->setPTMRatio(RATIO);
- // 加入地板到层其中
- addChild(ground);
- }
- // 触摸事件開始
- void HelloWorld::ccTouchesBegan(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent) {
- bird->getB2Body()->SetLinearVelocity(b2Vec2(0, 5));
- }
- // 加入运动的水管
- void HelloWorld::addBar(float dt) {
- // 随机生成偏移量
- float offset = -rand() %5;
- // 创建向下水管的精灵
- B2Sprite *down_bar = B2Sprite::create("down_bar.png");
- // 得到水管的大小
- CCSize down_bar_size = down_bar->getContentSize();
- // 下水管
- b2BodyDef down_bar_body_def;
- // 运动学物体,但不受重力影响
- down_bar_body_def.type = b2_kinematicBody;
- // 设置下水管的位置
- down_bar_body_def.position = b2Vec2(screenSize.width/RATIO + 2, down_bar_size.height/RATIO/2 +offset);
- // 线性速度,从右往左移动
- down_bar_body_def.linearVelocity = b2Vec2(-5,0);
- // 创建刚体
- b2Body *down_bar_body = world->CreateBody(&down_bar_body_def);
- // 隐形形状
- b2PolygonShape down_bar_shape;
- // 设置为盒子。參数为内容的半宽半高
- down_bar_shape.SetAsBox(down_bar_size.width/2/RATIO, down_bar_size.height/2/RATIO);
- // 声明定制器
- b2FixtureDef down_bar_fixture_def;
- // 定制器形状
- down_bar_fixture_def.shape = &down_bar_shape;
- // 为刚体创建定制器
- down_bar_body->CreateFixture(&down_bar_fixture_def);
- // 设置精灵刚体
- down_bar->setB2Body(down_bar_body);
- // 设置度量
- down_bar->setPTMRatio(RATIO);
- // 上水管
- B2Sprite *up_bar = B2Sprite::create("up_bar.png");
- // 获得内容大小
- CCSize up_bar_size = up_bar->getContentSize();
- b2BodyDef up_bar_body_def;
- // 运动学物体,但不受重力影响
- up_bar_body_def.type = b2_kinematicBody;
- // 设置水管位置
- up_bar_body_def.position = b2Vec2(screenSize.width/RATIO+2, down_bar_size.height/RATIO+offset+2+up_bar_size.height/2/RATIO);
- up_bar_body_def.linearVelocity = b2Vec2(-5, 0);
- b2Body *up_bar_body = world->CreateBody(&up_bar_body_def);
- // 隐形形状
- b2PolygonShape up_bar_shape;
- // 设置为盒子形状,參数为半宽半高
- up_bar_shape.SetAsBox(up_bar_size.width/2/RATIO, up_bar_size.height/2/RATIO);
- b2FixtureDef up_bar_fixture_def;
- up_bar_fixture_def.shape = &up_bar_shape;
- up_bar_body->CreateFixture(&up_bar_fixture_def);
- up_bar->setB2Body(up_bar_body);
- up_bar->setPTMRatio(RATIO);
- barContainer->addChild(down_bar);
- barContainer->addChild(up_bar);
- }
- // 运动条的容器
- void HelloWorld::addBarContainer()
- {
- barContainer = CCSprite::create();
- addChild(barContainer);
- }
- // 開始游戏
- void HelloWorld::startGame(float dt) {
- scheduleUpdate();
- schedule(schedule_selector(HelloWorld::addBar),1);
- }
- // 结束游戏
- void HelloWorld::stopGame() {
- unscheduleUpdate();
- unschedule(schedule_selector(HelloWorld::addBar));
- }
- void HelloWorld::BeginContact(b2Contact *contact) {
- // 发生碰撞,则弹出对话框
- if (contact->GetFixtureA()->GetBody()->GetUserData() == bird ||
- contact->GetFixtureB()->GetBody()->GetUserData() == bird) {
- stopGame();
- CCMessageBox("游戏失败","游戏失败");
- }
- }
- void HelloWorld::menuCloseCallback(CCObject* pSender)
- {
- #if (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) || (CC_TARGET_PLATFORM == CC_PLATFORM_WP8)
- CCMessageBox("You pressed the close button. Windows Store Apps do not implement a close button.","Alert");
- #else
- CCDirector::sharedDirector()->end();
- #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
- exit(0);
- #endif
- #endif
- }
版权声明:本文博客原创文章,博客,未经同意,不得转载。
Cocos2d-x 2.3.3版本 FlappyBird的更多相关文章
- mac下搭建cocos2d-x2.2.1版本android编译环境教程
首先我们先以引擎2.2.1为例子来新建一个TestJni的项目,来作为测试例. 创建方式如下: python create_project.py -project TestJni -package o ...
- 如何在cocos2d项目中enable ARC
如何在cocos2d项目中enable ARC 基本思想就是不支持ARC的代码用和支持ARC的分开,通过xcode中设置编译选项,让支持和不支持ARC的代码共存. cocos2d是ios app开发中 ...
- HTML5 学习总结(四)——canvas绘图、WebGL、SVG
一.Canvas canvas是HTML5中新增一个HTML5标签与操作canvas的javascript API,它可以实现在网页中完成动态的2D与3D图像技术.<canvas> 标记和 ...
- canvas绘图、WebGL、SVG
目录 一.Canvas 1.1.创建canvas元素 1.2.画线 1.3.绘制矩形 1.4.绘制圆弧 1.5.绘制图像 1.6.绘制文字 1.7.随机颜色与简单动画 二.WebGL 2.1.HTML ...
- HTML5 学习笔记(四)——canvas绘图、WebGL、SVG
一.Canvas canvas是HTML5中新增一个HTML5标签与操作canvas的javascript API,它可以实现在网页中完成动态的2D与3D图像技术.<canvas> 标记和 ...
- project.json
概述 项目相关配置,由原来的cocos2d.js中转移到project.json中,该文件需要与index.html同级,一般建议放在根目录下. 字段说明 debugMode 相当于原来的COCOS2 ...
- 使用 CocoStudio UI 编辑器实现《乱斗堂》设置界面
由于是引用别人的,所以直接贴上地址了.http://www.cocoachina.com/bbs/read.php?tid=164820&fpage=7 1 游戏中必不可少的 UI 元素 ...
- HTML学习总结(四)【canvas绘图、WebGL、SVG】
一.Canvas canvas是HTML5中新增一个HTML5标签与操作canvas的javascript API,它可以实现在网页中完成动态的2D与3D图像技术.<canvas> 标记和 ...
- cocos2d-js V3.0 V3.1使用DragonBones
DragonBones是Adobe支持的一个开源项目,用于制作和播放骨骼动画,官网地址是:http://dragonbones.effecthub.com/.DragonBones首先在Flash和S ...
随机推荐
- shell编程三大神器之grep
- Hadoop Mapreduce刮
前言 的一个渣渣程序猿一枚,因为个人工作,须要常常和hadoop打交道,可是自己之前没有接触过hadoop.所以算是边学边用,这个博客算是记录一下学习历程,梳理一下自己的思路,请各位看官轻拍.本博客大 ...
- 2014辽宁ACM省赛 Prime Factors
问题 L: Prime Factors 时间限制: 1 Sec 内存限制: 128 MB [提交][状态][论坛] 题目描写叙述 I'll give you a number , please te ...
- [ACM] POJ 2342 Anniversary party (树DP获得冠军)
Anniversary party Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4410 Accepted: 2496 ...
- SQL 将URL编码转汉字!
原文:SQL 将URL编码转汉字! -- ============================================= -- 作 者: ruijc -- 描 述: 将Url编码转明文字符 ...
- 64位sql server 如何使用链接服务器连接Access
原文:64位sql server 如何使用链接服务器连接Access 测试环境 操作系统版本:Windows Server 2008 r2 64位 数据库版本:Sql Server 2005 64位 ...
- javascript小白学习指南0---1
引言: 做为一名程序猿.都是真心的想把自己的东西分享出来,供大家一起学习探讨.一起提高技能.一起涨工资,呵 这一系列的文章都是关于Javascript 基础的 当然文章其中穿插了些我自己的理解.希 ...
- 开源 自由 java CMS - FreeCMS2.0 签字
项目地址:http://www.freeteam.cn/ 会员注冊 打开浏览器,输入http://localhost:8080/register.jsp. 输入注冊信息后点击"注冊" ...
- php_DWZ-JUI中碰到的问题解决方法详解(thinkphp+dwz)
原文:php_DWZ-JUI中碰到的问题解决方法详解(thinkphp+dwz) 折腾了两天,dwz删除后,数据不能自动刷新,解决方案,直接看图 . 1. 删除.修改状态后无法刷新记录: 在dwz. ...
- Go如何使用实现继承的组合
Go它提供了一个非常值得称道的并发支持,但Go它不支持完全面向对象的.这并不意味着Go不支持面向对象,,和Go的OO系统做的很轻巧,学习降至最低成本.向对象让Go失去了一些OO的方便特性,可是更高的效 ...