【发布时间】:2014-09-25 11:51:28
【问题描述】:
我需要使用box2d和cocos2dx开发大炮游戏。大炮分为两部分
-
底座固定在地上,不会移动。
b2WeldJointDef basePlatformWeldJointDef; basePlatformWeldJointDef.Initialize(base->getBody(), weaponPlatform->getBody(),weaponPlatform->getBody()->GetWorldCenter()); basePlatformWeldJointDef.collideConnected = false; basePlatformWeldJoint = m_world->CreateJoint(&basePlatformWeldJointDef); -
Arm用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 两者都是所需的角度,因此手臂直接移动到所需的角度而无需运动。然后我需要移动手臂而不仅仅是改变它的角度,所以我用旧角度和所需角度设置了 lowerAngle 和 highAngle,这取决于哪个更低哪个更高,并改变了电机RevoluteJoint
的速度
问题是我需要一个 回调 方法,该方法在旋转关节达到某个角度或电机速度达到零时触发,假设当手臂达到极限角度时停止,电机速度为零。
我在 SO 中搜索,发现This Solution 计算每一步的角度,可以使用,但需要更多计算,我懒得做。
是否存在通知电机转速或到达某个角度的回调方法?
【问题讨论】:
标签: c++ cocos2d-x box2d revolute-joints