最近正在学习cocos,过程中偶尔会遇到令人不解的bug。因为我是跟着视频学习的,代码也和视频中书写的一样(他使用的是mac平台),
我在VS2015中复写了一遍,大部分是没问题的,但有两个地方无论如何也无法实现:一个是(引力)传感器,另一个就是本文要阐述的问题。
视频中用到了一个绘图类:DrawHelper,这个类是用来绘制图形的。
static b2Body * createBox(b2World* world, float posX, float posY, float width, float height, bool isStatic=false, void * userData = nullptr);
static b2Body * createCircle(b2World* world, float posX, float posY, float radius, bool isStatic = false, void * userData = nullptr);用到了以上两个方法。这个类的绘制是没问题的。 然后我自己写了个专门测试关节的JointKit,这个类封装了几个关节创建的过程。 <pre class="brush:cpp; toolbar: true; auto-links: false;">void createRevoluteJoint(b2World* world, b2Body * bodyA, b2Body * bodyB, bool isEnableMotor = false, float _motorSpeed = 0, float _maxMotorToque = 0);用到了上面一个方法。这个过程只是简单封装,也是没问题的。
在视频写的Scene中:
//创建第一个body,十字形,模拟旋桨
auto windMill = DrawHelper::createBox(_world, _size.width / 2, _size.height*0.75, 200, 25);
//从这↓
b2PolygonShape box2;
box2.SetAsBox(25 / 2 / PTM_RATIO, 200 / 2 / PTM_RATIO);
b2FixtureDef box2Def;
box2Def.shape = &box2;
//到这↑ 这不就是添了个b2FixtureDef吗
//然后用body创建一个夹具
windMill->CreateFixture(&box2Def);//创建第二个body,圆形,用作旋转轴 auto axis = DrawHelper::createCircle(_world, _size.width / 2, _size.height*0.75, 25 / 2, true); //利用工具类 JointKit * jointKit = new JointKit(); jointKit.createRevoluteJoint(axis, windMill, true, 10, 100); delete jointKit; jointKit=nullptr;这个是没问题的,运行后会有一个旋桨加速旋转。 但是我想,既然是个夹具,直接在DrawHelper中直接写一个方法里不就完了? 然后我就在DrawHelper中写了下面这个方法: <pre class="brush:cpp; toolbar: true; auto-links: false;">//绘制风车 static b2Body * createWindMill(b2World* world, float posX, float posY, float width, float height, bool isStatic = false, void * userData = nullptr); //实现过程很简单, //就是创建了一个b2Body对象, //两个b2FixtureDef对象(存放了两个矩形) //然后通过body->CreateFixture()创建两个夹具。 b2Body * DrawHelper::createWindMill(b2World * world, float posX, float posY, float width, float height, bool isStatic, void * userData) { //声明b2BodyDef b2BodyDef bodyDef = DrawHelper::generalProcess(world, posX, posY, isStatic, userData); //创建风车 b2FixtureDef jointA, jointB; b2PolygonShape fanPaddleA, fanPaddleB; fanPaddleA.SetAsBox(width / PTM_RATIO / 2, height / PTM_RATIO / 2); fanPaddleB.SetAsBox(height / 2 / PTM_RATIO, width / 2 / PTM_RATIO); jointA.shape = &fanPaddleA; jointB.shape = &fanPaddleB; auto body = world->CreateBody(&bodyDef); body->CreateFixture(&jointA); body->CreateFixture(&jointB); return body; }我觉得和上面方法的得到的旋桨(b2Body)对象一样啊!
可是我通过这方法创建的body,利用jointKit.createRevoluteJoint(axis, windMill, true, 10, 100);传进去后竟然不旋转!卧槽,为何?这是什么原理?只不过把分两次创建的夹具放在一起创建,为什么就不旋转了呢?