2014-09-25 2 views
0

Мне нужно разработать пушечную игру, используя box2d и cocos2dx. Cannon делится на две частиПожаротушение при достижении определенного угла в револьверном суставе

  • Base, которая фиксируется в земле и не движется.

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

  • Затем мне нужно было переместить руку, чтобы не менять ее угол, поэтому я устанавливаю нижний угол и верхний угол со старым углом и желаемым углом в зависимости от того, что будет ниже, а тем, что будет выше, и изменит скорость двигателя из RevoluteJoint

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

Я в поисках SO и я нашел This Solution, который вычисляет угол каждый шаг, это может быть использован, но он нуждается в большем количестве вычислений, что я чувствую лень делать.

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

ответ

0

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

+0

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

+1

Просто не жертвуйте дизайном до преждевременной оптимизации, в противном случае - все работает. –

0

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

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

Смежные вопросы