cocos2d-x游戏开发 跑酷(两) 物理世界
原创。转载请注明出处:http://blog.csdn.net/dawn_moon/article/details/21240343
泰然的跑酷用的chipmunk物理引擎。我没有细致学过这个东西。
只是我看了一下他们的使用方法,感觉跟box2d差点儿相同。box2d用纯真的面向对象C++开发,用在这里应该没有问题,试一下。
泰然的project没有增加box2d模块。所以须要增加。
将external/Box2D增加project,将没用的引用删掉。增加后结构例如以下
然后新建一个PlayScene类。開始创建物理世界。
为了方便调试box2d物理世界,须要接入debug渲染器。将TestCpp/Classes/Box2DTestBed/下的GLES-Render.h和GLES-Render.cpp增加到project,这个能够绘制出物理模型的形状。
由于box2d针对0-10米的仿真做过优化。所以我这里将像素大小映射到10左右
- #define RATIO 32
看下PlayScene.h
- //
- // PlayScene.h
- // Parkour
- //
- // Created by lerry on 14-3-14.
- // Copyright (c) 2014年 Goonear Co.,Ltd. All rights reserved.
- //
- #ifndef __Parkour__PlayScene__
- #define __Parkour__PlayScene__
- #include "cocos2d.h"
- #include "Box2D.h"
- #include "GLES-Render.h"
- #define RATIO 32
- #define GROUND_HEIGHT 57
- #define RUUNER_STARTX 80
- class PlayScene : public cocos2d::CCLayer
- {
- b2World* mWorld;
- GLESDebugDraw* mDebugDraw;
- private:
- // 初始化物理世界
- void initPhysics();
- // 绘制物理世界debug区域
- void draw();
- // 开启物理世界debug
- void setDebug(bool isDebug);
- public:
- virtual bool init();
- virtual void update(float dt);
- CREATE_FUNC(PlayScene);
- static cocos2d::CCScene* scene();
- };
- #endif /* defined(__Parkour__PlayScene__) */
如今主要有一个初始化物理世界的函数initPhysics()函数,在这里创建了一个地板。
- void PlayScene::initPhysics()
- {
- mWorld = new b2World(b2Vec2(0, -10));
- mWorld->SetAllowSleeping(true);
- mWorld->SetContinuousPhysics(true);
- // mWorld->SetContactListener(this);
- // 地板body
- b2Body* ground = NULL;
- b2BodyDef bd;
- ground = mWorld->CreateBody(&bd);
- // 地板
- b2EdgeShape shape;
- shape.Set(b2Vec2(0, GROUND_HEIGHT / RATIO), b2Vec2(INT_MAX, GROUND_HEIGHT / RATIO));
- ground->CreateFixture(&shape, 0.0f);
- setDebug(true);
- }
这里创建了一个边缘形状。边缘形状类似静态物体。可是它没有体积。box2d里面的碰撞算法要求碰撞的两个物体至少一个要有体积。所以边缘形状不能和边缘形状碰撞。能够和其它形状类物体碰撞。
box2d的物理世界有自己的世界循环函数。跟cocos2d-x的update函数类似,所以在update函数里面调用box2d的迭代函数
- void PlayScene::update(float dt)
- {
- // 物理世界的迭代函数
- mWorld->Step(dt, 10, 8);
- }
Step函数的參数解释一下,第一个时间參数,单步迭代步长,第二个參数单步时间内速度迭代次数。第三个參数但不是件内位置迭代次数。
这几个參数有建议值。我这里就取这几个值。
然后在MainScene.cpp的onPlay函数里面填上回调的实现:
- // startbutton回调
- void MainScene::onPay()
- {
- CCLog("onPlay click");
- // 创建带过渡的场景
- CCScene* s = CCTransitionFade::create(1, PlayScene::scene());
- CCDirector::sharedDirector()->replaceScene(s);
- }
这里加了一个过渡场景,跑起来看到一条线。初步完毕。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGF3bl9tb29u/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" style="border:none; max-width:100%">
cocos2d-x游戏开发 跑酷(两) 物理世界的更多相关文章
- iOS cocos2d 2游戏开发实战(第3版)书评
2013是游戏爆发的一年,手游用户也是飞速暴增.虽然自己不做游戏,但也是时刻了解手机应用开发的新动向.看到CSDN的"写书评得技术图书赢下载分"活动,就申请了一本<iOS c ...
- cocos2d-x游戏开发 跑酷(四) 关联与物理世界
原创.转载注明出处http://blog.csdn.net/dawn_moon/article/details/21451077 前面一节尽管实现了一个跑动的人物,可是他只不过一个精灵在运行一个跑动的 ...
- cocos2d-x游戏开发 跑酷(三) 人物跑动
原创.转载请注明出处:http://blog.csdn.net/dawn_moon/article/details/21245881 好吧.最终要跑起来了. 要实现跑酷须要用到帧动画,什么是帧动画,不 ...
- cocos2d-x游戏开发 跑酷(八) 对象管理 碰撞检測
对象管理类的原理是这种: ObjectManager类是一个单例类,全局仅仅有一个对象实例存在.初始化的时候创建两个数组CCArray来保存金币和岩石.为什么要保存,由于在地图重载的时候.要销毁看不见 ...
- 学习手机游戏开发的两个方向 Cocos2d-x 和 Unity 3D/2D,哪个前景更好?
如题! 首先说一说学习手机游戏(移动游戏)这件事. 眼下移动互联网行业的在以井喷状态发展.全球几十亿人都持有智能终端设备(ios android),造就了非常多移动互联网创业机会: 一.移动社交 微信 ...
- HTML5 2D平台游戏开发#11斜坡物理
在游戏中会经常遇到斜坡地形,比如众所周知的魂斗罗,角色可以在坡上移动和跳跃: 斜坡在2D游戏中很常见,处理起来也较为棘手.最初我打算用分离轴定律来实现,在建立了一个物理模型之后: 发现上坡时没什么问题 ...
- cocos2d-x游戏开发 跑酷(九) 源代码下载及小结
这个东西零零碎碎写了一个礼拜吧. 事实上也没多少东西在里面.文章后附下载地址 博客地址:http://blog.csdn.net/dawn_moon 由于我没用过chipmunk,并且它是面向过程的东 ...
- Unity3D小游戏开发之两个我踩过的坑
最近在开发一个植物大战僵尸小游戏,今天写了一早上的代码,踩了两个坑,这两个坑的位置分别位于触发器和数据转换,写这篇博文以此来让其他程序员不要再去踩这两个坑. 1.我在做简易僵尸模型的时候,这个僵尸模型 ...
- (转载)如何学好iphone游戏开发
转自:http://www.cnblogs.com/zilongshanren/archive/2011/09/19/2181558.html 自从发布<如何学习iphone游戏开发>到 ...
随机推荐
- c语言 ,回调函数[个人理解]
回调函数:把需要调用的方法的指针pCallBackFuncX作为参数传递给一个函数UsrFunction,以便该UsrFunction函数在处理相似事件的时候可以灵活的使用不同的方法. 以在fla ...
- MYSQL 备份用户权限
MYSQL 备份用户权限 datadbblack 192.168.1.10 是 SELECT, RELOAD, SHOW DATABASES, LOCK TABLES 否 权限列表 1.Select ...
- (Problem 9)Special Pythagorean triplet
A Pythagorean triplet is a set of three natural numbers, a b c, for which, a2 + b2 = c2 For exampl ...
- 读书笔记:javascript高级程序设计
> 变量.作用域和内存问题js为弱类型的语言 变量的值和数据类型可以在脚本的生命周期内改变.5种基本类型:string, number, undefined, null, boolean,基本数 ...
- 17.1.1.3 Creating a User for Replication
17.1.1.3 Creating a User for Replication 创建一个用户用于复制: 每个slave 连接到master 使用一个MySQL 用户名和密码, 因此必须有一个user ...
- Android编程心得-设计一个可重用的自定义Dialog
我们在实际开发过程中,会遇到一个问题,我们的Dialog如果使用一般的方法进行设置调用出来,会有很多的重复代码,如何将Dialog按照自己的思路设计呢,并让其可重用呢,下面我来介绍一下 ...
- Linux内核中的宏:__init and __exit
ZZ FROM: http://blog.csdn.net/musein/article/details/742609 ======================================== ...
- [置顶] 图书推荐:SQL Server 2012 T-SQL基础 Itzik Ben-Gan
经过近三个月的不懈努力,终于翻译完毕了.图书虽然是基础知识,但是,即使你已经使用T-SQL几年,很多地方还是能够弥补你的知识空白.大师级的人物写基础知识,或许你想知道这基础中还有哪些深奥,敬请期待吧. ...
- 配置免安装版JAVA1.7的环境变量
我用的是免安装版JAVA1.7,假设想获取JDK能够联系问我要. 1.開始配置环境变量,右击[我的电脑]---[属性]-----[高级]---[环境变量],如图: 2.选择[新建系统变量]--弹出&q ...
- 合并k个已排序的链表 分类: leetcode 算法 2015-07-09 17:43 3人阅读 评论(0) 收藏
最先想到的是把两个linked lists 合并成一个. 这样从第一个开始一个一个吞并,直到所有list都被合并. class ListNode:# Definition for singly-lin ...
