【cocos3.9+box2d+tileMap】踩过的那些坑

【cocos3.9+box2d+tileMap】踩过的那些坑,第1张

概述——记念初学box2d踩过的好多坑 1.调试Box2d,一定要开启DebugDraw        Box2d物理引擎中的世界是不可见的,所有刚体只会在一个看不见的世界中,遵循设定好的规则自行演变,想要对外部世界产生作用,需要外部世界也就是cocos自己将精灵等的位置、角度与Box2d世界中的刚体做绑定。        所以Box2d的开发者提供了一个DebugDraw的功能,用来显示物理引擎中物

——记念初学Box2d踩过的好多坑

1.调试Box2d,一定要开启DeBUGDraw

Box2d物理引擎中的世界是不可见的,所有刚体只会在一个看不见的世界中,遵循设定好的规则自行演变,想要对外部世界产生作用,需要外部世界也就是cocos自己将精灵等的位置、角度与Box2d世界中的刚体做绑定。

所以Box2d的开发者提供了一个DeBUGDraw的功能,用来显示物理引擎中物体的位置、大小等,方便进行调试。

开启方法:直接从官方cpp-tests中找的

@H_301_23@注意:

@H_301_23@@H_301_23@draw出来的线条zorder都是0,会被其他添加的Sprite覆盖掉,需要将其他Sprite的zorder设为负值 @H_301_23@@H_301_23@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,flags);    _customCmd.func = CC_CALLBACK_0(MarioScene::onDraw,this,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),以便保持一致。

@H_301_23@注意:

@H_301_23@@H_301_23@cocos中有父节点的,注意留神锚点的设置

3.单位变换

Box2d中使用的单位是米、千克、秒等实际单位,而cocos中是以像素为单位,默认情况下,cocos中1像素 = 1米。但是Box2d对0.1米-10米内的物体有特殊优化,性能最高,所以我们最好是将cocos中最常用的大小设为1米,所以就有了PTM_RATIO这个宏,用于单位转换:

#define PTM_RATIO 32

也就是说,将cocos中的32像素设置为Box2d中的1米。注意在位置和大小设置时进行转换。

@H_301_23@注意:

@H_301_23@@H_301_23@这个转换不强制,也就是不转也能用,但性能会低。而且Box2d中的一些限制,会让你的游戏看起来不真实。比如:Box2d中限制刚体最大速度120米/秒,如果不转换则cocos中120像素/秒就会达到上限,到时候想要的加速运动就会变成匀速运动。 @H_301_23@@H_301_23@留神转换时的数据类型,如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】踩过的那些坑所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1077024.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存