我需要使用 box2d 和 cocos2dx 开发大炮游戏。加农炮分为两部分
基地,固定在地面上,不会移动。
b2WeldJointDef basePlatformWeldJointDef;
basePlatformWeldJointDef.Initialize(base->getBody(), weaponPlatform->getBody(),weaponPlatform->getBody()->GetWorldCenter());
basePlatformWeldJointDef.collideConnected = false;
basePlatformWeldJoint = m_world->CreateJoint(&basePlatformWeldJointDef);
手臂,使用 RevoluteJoint 固定在基座中。
b2RevoluteJointDef armJointDef;
armJointDef.Initialize(base->getBody(), arm->getBody(), m_loader->pointsToMeters(ccp(armPosition.x-(arm->getContentSize().width*WeaponScale/4),armPosition.y)));
armJointDef.enableMotor = true;
armJointDef.enableLimit = true;
armJointDef.motorSpeed = 0;
armJointDef.lowerAngle = CC_DEGREES_TO_RADIANS(0);
armJointDef.upperAngle = CC_DEGREES_TO_RADIANS(0);
armJointDef.maxMotorTorque = 2;
armJointDef.collideConnected = false;
cannonRevoluteJoint = (b2RevoluteJoint*)m_world->CreateJoint(&armJointDef);
大炮应该计算将要射击的角度,并且这是正确计算的。在这里使用revolutJointObject->setLimits(lowerAngle, higherAngle)
我使用 lowerAngle 和 higherAngle 两者都是所需的角度,因此手臂可以直接移动到所需的角度而不会运动。
然后我需要移动手臂而不仅仅是改变它的角度,所以我设置了较低的角度和较高的角度,使用较旧的角度和所需的角度,这取决于哪个更低,哪个更高,并改变了电机 RevoluteJoint的速度
问题是我需要一个回调方法,当旋转关节达到一定角度或当电机速度达到零时触发,假设当手臂达到极限角度时停止,电机速度为零。
我在SO中搜索,我发现This Solution计算每一步的角度,这可以使用,但它需要更多我觉得懒惰的计算。
是否存在用于通知电机速度或某个角度的回调方法?
答案 0 :(得分:0)
安排一项功能来检查每一帧的条件。当您不再需要检查时 - 取消计划选择器,然后在需要时重新安排。 据我所知,你的确切任务没有回调。
答案 1 :(得分:0)
在幕后进行的所有回调都是检查每帧的角度,然后在关节角度在一定范围内时调用回调函数。
此用例没有内置回调功能。您可以自己隐藏正在进行的操作,也可以将if语句放在更新功能中。这样做的表现会很好。