Мне нужно разработать пушечную игру, используя 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, и я нашел Это решение который вычисляет угол каждого шага, это может быть использовано, но мне нужно больше вычислений, что я чувствую себя ленивым, чтобы сделать.
Существует ли метод обратного вызова для уведомления о скорости двигателя или достижении определенного угла?
Запланируйте функцию, чтобы проверить ваши условия на каждом кадре. Если вам больше не нужны чеки — отмените планирование селектора, а затем перенесите его снова, когда это необходимо.
Насколько я знаю, нет никаких обратных вызовов для вашей конкретной задачи.
Все, что обратный вызов будет делать за кулисами, это проверять угол каждого кадра, а затем вызывать функцию обратного вызова, когда угол соединения находится в определенном диапазоне.
Там нет встроенных обратных вызовов для этого варианта использования. Вы можете сделать свой собственный, чтобы скрыть, что происходит, или вы можете просто вставить оператор if в функцию обновления. Производительность этого будет в порядке.