【问题标题】:Box2d - "monsters" and player collided problemBox2d - “怪物”和玩家碰撞问题
【发布时间】:2011-06-21 21:06:14
【问题描述】:

好的,这是一个普遍的问题,我的游戏系统应该如何工作。 所以有很多敌人和一个玩家。当敌人接触玩家时,玩家会受到怪物的打击和“推”,然后闪烁到 1.5 秒。狡猾的“推”(真的真的很快),玩家什么也做不了。 此外,所有的怪物总是会移动相同的。怪物的移动永远不会受到玩家的影响。我不能做运动,因为它们确实会受到重力的影响。那么我该怎么做呢?所有这些,包括“推”,我该怎么办?

还有一个很好的例子来说明我在 0:27 开始的这段 YT 视频中的意思:http://www.youtube.com/watch?v=tVr8S6WXdog

谢谢。

【问题讨论】:

    标签: box2d collision


    【解决方案1】:

    以你的例子,我假设你并不打算让怪物和人类对彼此做出反应。

    无论哪种方式,向世界添加自定义接触侦听器,并在接触侦听器中检查玩家和敌人形状是否创建了接触点。如果是这样,对 playerbody 应用linearimpulse() 以达到您想要的效果并禁用用户的所有键输入以防止运动发生任何变化。然后在 player 上设置一个属性,防止它在被怪物击中时应用冲动。

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

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

    【讨论】:

    • 嗯,但这会在玩家击中怪物时对怪物施加内爆。怪物就像背景,但它不是。它仅受重力影响。我怎样才能做到这一点?两种都是动态类型!
    • 当你对玩家调用 hit 时,对敌人调用一个方法,将其速度变为 (0, 0),这意味着脉冲不会产生任何影响。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-21
    相关资源
    最近更新 更多