原创。转载请注明出处: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左右

  1. #define RATIO 32

看下PlayScene.h

  1. //
  2. //  PlayScene.h
  3. //  Parkour
  4. //
  5. //  Created by lerry on 14-3-14.
  6. //  Copyright (c) 2014年 Goonear Co.,Ltd. All rights reserved.
  7. //
  8. #ifndef __Parkour__PlayScene__
  9. #define __Parkour__PlayScene__
  10. #include "cocos2d.h"
  11. #include "Box2D.h"
  12. #include "GLES-Render.h"
  13. #define RATIO 32
  14. #define GROUND_HEIGHT 57
  15. #define RUUNER_STARTX 80
  16. class PlayScene : public cocos2d::CCLayer
  17. {
  18. b2World* mWorld;
  19. GLESDebugDraw* mDebugDraw;
  20. private:
  21. // 初始化物理世界
  22. void initPhysics();
  23. // 绘制物理世界debug区域
  24. void draw();
  25. // 开启物理世界debug
  26. void setDebug(bool isDebug);
  27. public:
  28. virtual bool init();
  29. virtual void update(float dt);
  30. CREATE_FUNC(PlayScene);
  31. static cocos2d::CCScene* scene();
  32. };
  33. #endif /* defined(__Parkour__PlayScene__) */

如今主要有一个初始化物理世界的函数initPhysics()函数,在这里创建了一个地板。

  1. void PlayScene::initPhysics()
  2. {
  3. mWorld = new b2World(b2Vec2(0, -10));
  4. mWorld->SetAllowSleeping(true);
  5. mWorld->SetContinuousPhysics(true);
  6. //    mWorld->SetContactListener(this);
  7. // 地板body
  8. b2Body* ground = NULL;
  9. b2BodyDef bd;
  10. ground = mWorld->CreateBody(&bd);
  11. // 地板
  12. b2EdgeShape shape;
  13. shape.Set(b2Vec2(0, GROUND_HEIGHT / RATIO), b2Vec2(INT_MAX, GROUND_HEIGHT / RATIO));
  14. ground->CreateFixture(&shape, 0.0f);
  15. setDebug(true);
  16. }

这里创建了一个边缘形状。边缘形状类似静态物体。可是它没有体积。box2d里面的碰撞算法要求碰撞的两个物体至少一个要有体积。所以边缘形状不能和边缘形状碰撞。能够和其它形状类物体碰撞。

box2d的物理世界有自己的世界循环函数。跟cocos2d-x的update函数类似,所以在update函数里面调用box2d的迭代函数

Step函数的參数解释一下,第一个时间參数,单步迭代步长,第二个參数单步时间内速度迭代次数。第三个參数但不是件内位置迭代次数。

这几个參数有建议值。我这里就取这几个值。

然后在MainScene.cpp的onPlay函数里面填上回调的实现:

  1. // startbutton回调
  2. void MainScene::onPay()
  3. {
  4. CCLog("onPlay click");
  5. // 创建带过渡的场景
  6. CCScene* s = CCTransitionFade::create(1, PlayScene::scene());
  7. CCDirector::sharedDirector()->replaceScene(s);
  8. }

这里加了一个过渡场景,跑起来看到一条线。初步完毕。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGF3bl9tb29u/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" style="border:none; max-width:100%">

cocos2d-x游戏开发 跑酷(两) 物理世界的更多相关文章

  1. iOS cocos2d 2游戏开发实战(第3版)书评

    2013是游戏爆发的一年,手游用户也是飞速暴增.虽然自己不做游戏,但也是时刻了解手机应用开发的新动向.看到CSDN的"写书评得技术图书赢下载分"活动,就申请了一本<iOS c ...

  2. cocos2d-x游戏开发 跑酷(四) 关联与物理世界

    原创.转载注明出处http://blog.csdn.net/dawn_moon/article/details/21451077 前面一节尽管实现了一个跑动的人物,可是他只不过一个精灵在运行一个跑动的 ...

  3. cocos2d-x游戏开发 跑酷(三) 人物跑动

    原创.转载请注明出处:http://blog.csdn.net/dawn_moon/article/details/21245881 好吧.最终要跑起来了. 要实现跑酷须要用到帧动画,什么是帧动画,不 ...

  4. cocos2d-x游戏开发 跑酷(八) 对象管理 碰撞检測

    对象管理类的原理是这种: ObjectManager类是一个单例类,全局仅仅有一个对象实例存在.初始化的时候创建两个数组CCArray来保存金币和岩石.为什么要保存,由于在地图重载的时候.要销毁看不见 ...

  5. 学习手机游戏开发的两个方向 Cocos2d-x 和 Unity 3D/2D,哪个前景更好?

    如题! 首先说一说学习手机游戏(移动游戏)这件事. 眼下移动互联网行业的在以井喷状态发展.全球几十亿人都持有智能终端设备(ios android),造就了非常多移动互联网创业机会: 一.移动社交 微信 ...

  6. HTML5 2D平台游戏开发#11斜坡物理

    在游戏中会经常遇到斜坡地形,比如众所周知的魂斗罗,角色可以在坡上移动和跳跃: 斜坡在2D游戏中很常见,处理起来也较为棘手.最初我打算用分离轴定律来实现,在建立了一个物理模型之后: 发现上坡时没什么问题 ...

  7. cocos2d-x游戏开发 跑酷(九) 源代码下载及小结

    这个东西零零碎碎写了一个礼拜吧. 事实上也没多少东西在里面.文章后附下载地址 博客地址:http://blog.csdn.net/dawn_moon 由于我没用过chipmunk,并且它是面向过程的东 ...

  8. Unity3D小游戏开发之两个我踩过的坑

    最近在开发一个植物大战僵尸小游戏,今天写了一早上的代码,踩了两个坑,这两个坑的位置分别位于触发器和数据转换,写这篇博文以此来让其他程序员不要再去踩这两个坑. 1.我在做简易僵尸模型的时候,这个僵尸模型 ...

  9. (转载)如何学好iphone游戏开发

    转自:http://www.cnblogs.com/zilongshanren/archive/2011/09/19/2181558.html 自从发布<如何学习iphone游戏开发>到 ...

随机推荐

  1. 在主函数中提示用户输入用户名和密码。另写一方法来判断用户输入是否正确。该方法分别返回一个bool类型的登录结果和和一个string类型的登录信息。如登录成功,返回true及“登录成功”,若登录失败则返回false及“用户名错误”或“密码错误”(使用out参数)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  2. VS 2013上Python的配置

    最近有点不务正业,去看了下Python (主要是学校OJ有这个语言,然后可以轻松解决大数据问题,不要说我太坑~~~) 目前感觉python和matlab有些类似,缺少了变量类型声明,总感觉自己写出来的 ...

  3. OpenSSL命令---req

    用途: 本指令用来创建和处理PKCS#10格式的证书.它还能够建立自签名证书,做Root CA. 用法: openssl req [-inform PEM|DER] [-outform PEM|DER ...

  4. POJ 2449 求第K短路

    第一道第K短路的题目 QAQ 拿裸的DIJKSTRA + 不断扩展的A* 给2000MS过了 题意:大意是 有N个station 要求从s点到t点 的第k短路 (不过我看题意说的好像是从t到s 可能是 ...

  5. 在DE1-SOC上运行Linux

    1,设定串口终端 安装驱动 :使用mini-USB线将计算机与DE1-SoC的UART转USB接口.drivers\USB2UART_driver文件夹内放置有驱动程序 设定串口终端规格 : 设定串口 ...

  6. 利用cmake来搭建开发环境

    对于经常在终端下写程序的non-windows程序员,Makefile绝对是最常用的工具,小到一个文件的简单的测试程序,大到数百个文件的商业软件,只需要有shell,一个make命令就可得到可运行的程 ...

  7. VC多线程编程

    一.问题的提出 编写一个耗时的单线程程序: 新建一个基于对话框的应用程序SingleThread,在主对话框IDD_SINGLETHREAD_DIALOG添加一个按钮,ID为IDC_SLEEP_SIX ...

  8. 测试DOM0级事件和DOM2级事件的堆叠

    1. 问题 如果大家看过北风网CJ讲师的Javascript视频教程,就可以看到其封装了一个很强的事件添加和删除函数,如下所示 function addEvent(obj, evtype, fn) { ...

  9. iframe,window,滚动栏的一些问题

    1.Iframe不显示边框:frameborder=0 2.Iframe不显示横向滚动栏:在iframe所指向的页面增加: <style> html{overflow-x:hidden;} ...

  10. 高级特性(8)- JavaBean构件

    8.1 为何使用Bean8.2 编写Bean的过程8.3 使用Bean构造应用程序 8.3.1 将Bean打包成JAR文件 8.3.2 在开发环境中组合Bean8.4 Bean属性与事件的命名模式8. ...