【cocos3.9+box2d+tileMap】踩过的那些坑
来源:互联网 发布:下载淘宝软件并安装 编辑:程序博客网 时间:2024/06/05 23:45
——记念初学box2d踩过的好多坑
1.调试Box2d,一定要开启DebugDraw
Box2d物理引擎中的世界是不可见的,所有刚体只会在一个看不见的世界中,遵循设定好的规则自行演变,想要对外部世界产生作用,需要外部世界也就是cocos自己将精灵等的位置、角度与Box2d世界中的刚体做绑定。
所以Box2d的开发者提供了一个DebugDraw的功能,用来显示物理引擎中物体的位置、大小等,方便进行调试。
开启方法:直接从官方cpp-tests中找的
注意:
- draw出来的线条zorder都是0,会被其他添加的Sprite覆盖掉,需要将其他Sprite的zorder设为负值
- GLESDebugDraw相关头文件和实现也是从官方的例子工程中找到,添加到工程目录中
具体代码:
//初始化world时auto debugDraw = new GLESDebugDraw(PTM_RATIO); //这里新建一个 debug渲染模块uint32 flags = 0;flags += b2Draw::e_shapeBit;// flags += b2Draw::e_jointBit;// flags += b2Draw::e_aabbBit;// flags += b2Draw::e_pairBit;// flags += b2Draw::e_centerOfMassBit;debugDraw->SetFlags(flags); //需要显示那些东西_b2World->SetDebugDraw(debugDraw); //设置void MarioScene::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags){ Scene::draw(renderer, transform, flags);#ifdef COCOS2D_DEBUG _customCmd.init(_globalZOrder, transform, flags); _customCmd.func = CC_CALLBACK_0(MarioScene::onDraw, this, transform, flags); renderer->addCommand(&_customCmd);#endif}void MarioScene::onDraw(const Mat4 &transform, uint32_t flags){#ifdef COCOS2D_DEBUG Director* director = Director::getInstance(); CCASSERT(nullptr != director, "Director is null when seting matrix stack"); director->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW); director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW, transform); GL::enableVertexAttribs( cocos2d::GL::VERTEX_ATTRIB_FLAG_POSITION ); _b2World->DrawDebugData(); CHECK_GL_ERROR_DEBUG(); director->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);#endif}
2.注意锚点AnchorPoint
Box2d中,没有锚点的概念,所有位置都是按中心点来的。其实就相当于cocos中的锚点(0.5,0.5),而cocos中,Sprite的默认锚点是(0.5,0.5),其他是(0,0)。一般来说,需要和Box2d中刚体做关联的,会将锚点设置为(0.5,0.5),以便保持一致。
注意:
- cocos中有父节点的,注意留神锚点的设置
3.单位变换
Box2d中使用的单位是米、千克、秒等实际单位,而cocos中是以像素为单位,默认情况下,cocos中1像素 = 1米。但是Box2d对0.1米-10米内的物体有特殊优化,性能最高,所以我们最好是将cocos中最常用的大小设为1米,所以就有了PTM_RATIO这个宏,用于单位转换:
#define PTM_RATIO 32
也就是说,将cocos中的32像素设置为Box2d中的1米。注意在位置和大小设置时进行转换。
注意:
- 这个转换不强制,也就是不转也能用,但性能会低。而且box2d中的一些限制,会让你的游戏看起来不真实。比如:box2d中限制刚体最大速度120米/秒,如果不转换则cocos中120像素/秒就会达到上限,到时候想要的加速运动就会变成匀速运动。
- 留神转换时的数据类型,如100 / PTM_RATIO,结果是个整数,就会丢数据了!!
4.SetAsBox
使用SetAsBox方法生成的box是其接受的参数大小的两倍,所以提供给这个方法的参数坐标值要除以2,或者乘以0.5f。
5.SetFriction
/// Set the coefficient of friction. This will _not_ change the friction of/// existing contacts.//设置摩擦系数时,对当前已经发生的碰撞不会产生效果
6.不定时更新
- 【cocos3.9+box2d+tileMap】踩过的那些坑
- 【cocos3.9+box2d+tileMap】制作马里奥游戏(一)
- 【cocos3.x+box2d+tileMap】制作马里奥游戏(三)创世纪
- 【cocos3.x+box2d+tileMap】制作马里奥游戏(二) 制作地图
- 【cocos3.x+box2d+tileMap】制作马里奥游戏(四)碰撞检测
- cocos3.0 box2d物理引擎的使用
- 我踩过的听过的那些坑
- 那些年我踩过的坑
- Google支付 踩过的那些坑
- Xcode打包踩过的那些坑
- 那些曾经踩过的坑
- angularjs踩过的那些坑
- 那些年Dialog踩过的坑
- 那些年踩过的坑
- 学习java踩过的那些坑
- 那些年踩过的坑
- Matlab coder 踩过的那些坑
- React-Native踩过的那些坑
- 剑指offer面试题八:旋转数组的最小数字
- 无可奈何数据库——无法连接到(local)
- hdu 2594 Simpsons’ Hidden Talents(KMP)
- GCC 下 tranform 调用 toupper, tolower 出错原因及解决
- leetcode之 Factorial Trailing Zeroes
- 【cocos3.9+box2d+tileMap】踩过的那些坑
- 重头来过-只为不遗憾,提高班半年学习总结!
- iOS中内存管理基本概念
- 【两道不会写的题】
- [原创]《穷人的小孩难成功-走出人生负面循环》视野的继承与影
- JS中的prototype
- 深入了解Java之三(集合方面)
- 把WebService发布到IIS网站下(IIS 7)
- leetcode之Binary Tree Level Order Traversal