Box2d + CoCos2d: автоматическое перемещение объекта для имитации движения компьютера в игре.

Я работаю над хоккейной игрой и внедряю режим одиночной игры. Я пытаюсь двигать ракетку "компьютера" в режиме нападения (двигаться к мячу). Я использую CoCos2d и Box2d. Я перемещаю весло с помощью MouseJoints. Проблема в том, что весло вообще не двигается!

тик вызывается в методе инициализации

[self schedule:@selector(tick:)];

...

  - (void)tick:(ccTime) dt 
 {
  _world->Step(dt, 10, 10);    

  CCSprite *computer_paddle;
  CCSprite *ball;
  b2Body *computer_paddle_b2Body;
  float32 direction;
  b2Vec2 velocity;


  for(b2Body *b = _world->GetBodyList(); b; b=b->GetNext()) {    
   if (b->GetUserData() != NULL) {
    CCSprite *sprite = (CCSprite *)b->GetUserData();      

    if (sprite.tag == 1) { //ball
     ball = sprite;
     static int maxSpeed = 10;
      velocity = b->GetLinearVelocity();
     float32 speed = velocity.Length();
      direction = velocity.y;

     if (speed > maxSpeed) {     
      b->SetLinearDamping(0.5);
     } else if (speed < maxSpeed) {
      b->SetLinearDamping(0.0);
     }

    } 

    if (sprite.tag == 3){ // paddle
     computer_paddle  = sprite;
     computer_paddle_b2Body = b; 


    }


  // update sprite position
  sprite.position = ccp(b->GetPosition().x * PTM_RATIO,b->GetPosition().y * PTM_RATIO);
  sprite.rotation = -1 * CC_RADIANS_TO_DEGREES(b->GetAngle()); 


  } 


 }


 // update the computer paddle in single player moving it towards the ball using MouseJoint


 //move towards the ball
 b2Vec2 b2Position = b2Vec2(ball.position.x/PTM_RATIO,ball.position.y/PTM_RATIO);

 b2MouseJointDef md1;


md1.bodyA = _groundBody;

md1.bodyB = computer_paddle_b2Body;

md1.target = b2Position;

md1.collideConnected = true;

md1.maxForce = 9999.0 * computer_paddle_b2Body->GetMass();

_mouseJoint = (b2MouseJoint *)_world->CreateJoint(&md1);

computer_paddle_b2Body->SetAwake(true);

person user82383    schedule 27.04.2010    source источник
comment
Я бы попытался ответить, но ваш код действительно трудно читать. Вы должны следовать соглашениям об именах методов и переменных любого языка, который вы используете. Кроме того, есть способ вставить код в вопрос, чтобы он правильно отформатировался.   -  person Chris Garrett    schedule 30.04.2010


Ответы (1)


Проверьте:

а) тело спит

b) тело является статическим телом

Если он спит и у вас нет других тел, полностью отключите сон. В противном случае отключите спящий режим тела: body->SetSleepingAllowed(NO)

Примечание: это соответствует Box2D 2.2.1 API Reference, который еще не используется по умолчанию в cocos2d 1.0, поэтому функция может отличаться в вашей версии Box2D.

Также убедитесь, что ваше тело является динамическим, найдя элемент типа b2BodyDef и, если необходимо, установите его как динамический (см. перечисление b2BodyType). Я не уверен, что такое значение по умолчанию, оно должно быть динамическим, но это может зависеть от версии Box2D.

person LearnCocos2D    schedule 06.10.2011