我需要使用box2d和cocos2dx开发大炮游戏。大炮分为两部分
-
底座固定在地面上,不会移动。
b2WeldJointDef basePlatformWeldJointDef; basePlatformWeldJointDef.Initialize(base->getBody(), weaponPlatform->getBody(),weaponPlatform->getBody()->GetWorldCenter()); basePlatformWeldJointDef.collideConnected = false; basePlatformWeldJoint = m_world->CreateJoint(&basePlatformWeldJointDef);
-
手臂,用旋转关节固定在底座上。
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)
,我使用较低角度和较高角度 -
然后我需要移动手臂,而不仅仅是改变它的角度,所以我用旧的角度和所需的角度设置了较低的角度和较高的角度,取决于哪个角度较低,哪个角度较高,并改变了旋转关节的电机速度
-
问题是,我需要一个回调方法,该方法在旋转关节达到某个角度或电机速度达到零时启动,假设当臂达到极限角度时将停止,电机速度为零。
我在SO中搜索过,我找到了这个解决方案,它计算每一步的角度,这可以使用,但它需要更多的计算,我觉得懒得做。
是否存在通知电机速度或达到某个角度的回调方法?
安排一个函数来检查每个帧上的条件。当你不再需要检查时,取消对选择器的安排,然后在需要时再次重新安排。据我所知,你的确切任务没有回电。
回调在幕后所要做的就是检查每帧的角度,然后在关节角度在一定范围内时调用回调函数。
此用例没有内置回调。你可以自己制作来隐藏正在发生的事情,也可以把if语句放在update函数中。这个性能会很好。