Box2d - “怪物”和玩家相撞问题

时间:2011-05-28 22:09:52

标签: box2d collision

好的,这是一个普遍的问题,我的游戏系统应该如何运作。 所以有很多敌人和玩家。当敌人触碰一名玩家时,该玩家获得一击并从该怪物中“推”,然后眨眼至1.5秒。诡计“推”(真的很快),玩家无能为力。 此外,所有怪物将始终移动相同。怪物的移动永远不会受到玩家的影响。我无法做运动,因为它们会受到重力的影响。那我该怎么办呢?所有这一切,包括“推”,我该怎么办?

在0:27的YT视频中,我的意思也是一个很好的例子:http://www.youtube.com/watch?v=tVr8S6WXdog

感谢。

1 个答案:

答案 0 :(得分:2)

以你的榜样为例,我假设你没有计划让怪物和人类相互作出反应。

无论哪种方式,向世界添加自定义联系人侦听器,并在联系人侦听器中检查玩家和敌人形状是否创建联系点。如果是这样,则对玩家身体使用applylinearimpulse(),以达到您想要的效果,并禁用用户的所有键输入,以防止任何动作变化。然后在玩家身上有一个属性,防止它被怪物击中时施加冲动。

此外,当您创建实体时,您需要将玩家和敌人实例设置为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());


      }
      }
}

然后您可以根据需要编辑值。希望这有帮助,祝你好运!