Box2d - проблема "монстров" и столкновения игроков - PullRequest
0 голосов
/ 29 мая 2011

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

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

Спасибо.

1 Ответ

2 голосов
/ 16 июня 2011

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

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

Также, когда вы создаете тела, вам нужно установить экземпляр игрока и врага как body.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());


      }
      }
}

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

...