Box2d - проблема столкновения монстров и игрока

Хорошо, это общий вопрос, как должна работать система моей игры. Так что врагов и игрока много. Когда враг касается игрока, игрок получает удар и «толчок» от монстра, а затем моргает до 1,5 секунды. Во время «пуша» (действительно очень быстрого) игрок ничего не может сделать. Кроме того, все монстры всегда будут двигаться одинаково. Движение монстров никогда не будет зависеть от игрока. Я не могу сделать это кинематически, потому что они ДЕЙСТВИТЕЛЬНО влияют на гравитацию. Итак, как я могу это сделать? Все такое, включить "толчок", что делать?

Есть также хороший пример того, что я имею в виду, в этом видео YT с 0:27: http://www.youtube.com/watch?v=tVr8S6WXdog

Спасибо.


person Eli    schedule 28.05.2011    source источник


Ответы (1)


В вашем примере я предполагаю, что вы не планируете, чтобы монстр и люди реагировали друг на друга.

В любом случае, добавьте в мир пользовательского прослушивателя контактов и в нем проверьте, создают ли игрок и фигура врага точку контакта. Если это так, примените linearimpulse() к телу игрока с нужным вам эффектом и отключите все вводимые пользователем клавиши, чтобы предотвратить любые изменения в движении. Затем просто добавьте свойство к игроку, запрещающее ему применять импульс, если его только что ударил монстр.

Кроме того, когда вы создаете тела, вам нужно установить экземпляр игрока и врага в качестве тела.UserData()

public class Player extends MovieClip
{
     public const MAX_EFFECT_TIME = 1.5 * framerate;

     public var effectTime:int = 0;
     public var body:b2Body;

 public function step():void
 {
       if (effectTime > 0)
       {
              effectTime--;
              //do awesome animation
       }
       else 
       {  
              //move normally
       }

 }

 public function Hit(enemy:Enemy)
 {
       if (effectTime == 0)
       {
              //apply linear impulse to object
              if (enemy.body.GetPosition().x < this.body.GetPosition().x)
              {
                    //apply impulse left in left direction
                    b2Vec2 force = b2Vec2(-8, 10);

                    body.ApplyLinearImpulse(force, body.GetWorldCenter());
              }
              else
              {
                    //apply impulse in right direction
                    b2Vec2 force = b2Vec2(8, 10);

                    body.ApplyLinearImpulse(force, body.GetWorldCenter());
              } 

              //reset effect time
              effectTime = MAX_EFFECT_TIME;
       }
 }

}

public class Game extends MovieClip
{
      public var world:b2World;
      public var player:Player;

      public Game()
      {
            world = initWorld();
            player = initPlayer();

            var cl = new CustomContactListener();
            world.SetContactListener(cl);

            this.addEventListener(Event.ENTER_FRAME, step);
      }

      private void step(e:Event)
      {
            world.step();
            player.step();
      }

}

public class CustomContactListener extends b2ContactListener
{
      //Called when a contact point is added.
      public override function Add(point:b2ContactPoint):void 
      {
            //checks if the first shape is a player and second is an enemy if true call Hit
            if (point.shape1.GetBody().GetUserData().isPlayer && point.shape2.GetBody().GetUserData().isEnemy)
            {
                 point.shape1.GetBody().GetUserData().Hit(point.shape2.GetBody().GetUserData());
            }
            else if (point.shape2.GetBody().GetUserData().isPlayer && point.shape1.GetBody().GetUserData().isEnemy)
            {
                 point.shape2.GetBody().GetUserData().Hit(point.shape1.GetBody().GetUserData());


      }
      }
}

Затем вы можете просто отредактировать значения по мере необходимости. Надеюсь, что это помогает и удачи!

person Shannon    schedule 16.06.2011
comment
Хммм, но это применит импульс к монстру, когда игрок бьет монстра. Монстр похож на фон, но это не так. На него действует только гравитация. Как я могу это сделать? Динамические типы оба! - person Eli; 07.07.2011
comment
когда вы вызываете удар по игроку, вызовите метод у врага, который изменит его скорость на (0, 0), что означает, что импульс не будет иметь никакого эффекта. - person Shannon; 30.07.2011