Пожар при достижении определенного угла в вращающемся суставе

Мне нужно разработать пушечную игру, используя 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, и я нашел Это решение который вычисляет угол каждого шага, это может быть использовано, но мне нужно больше вычислений, что я чувствую себя ленивым, чтобы сделать.

Существует ли метод обратного вызова для уведомления о скорости двигателя или достижении определенного угла?

0

Решение

Запланируйте функцию, чтобы проверить ваши условия на каждом кадре. Если вам больше не нужны чеки — отмените планирование селектора, а затем перенесите его снова, когда это необходимо.
Насколько я знаю, нет никаких обратных вызовов для вашей конкретной задачи.

0

Другие решения

Все, что обратный вызов будет делать за кулисами, это проверять угол каждого кадра, а затем вызывать функцию обратного вызова, когда угол соединения находится в определенном диапазоне.

Там нет встроенных обратных вызовов для этого варианта использования. Вы можете сделать свой собственный, чтобы скрыть, что происходит, или вы можете просто вставить оператор if в функцию обновления. Производительность этого будет в порядке.

0

По вопросам рекламы [email protected]