C# 迎面碰撞玩家与任何物体碰撞

C# 迎面碰撞玩家与任何物体碰撞,c#,xna,C#,Xna,我正在使用farseer物理引擎创建一个2D平台,我正在经历最艰难的时刻,试图找出如何使用OnCollision,尽管我看到了,但我仍在努力掌握这个概念。这就是我的工作。我想知道球员什么时候触地,这样我就可以有一个叫isJumping的球。当玩家跳跃时,“isJumping”为真,因此玩家不会一直跳跃。 (我还想有一个地面布袋,上面写着“干草,你在地上”。) 这段代码的问题是我将得到一个空引用。我也只是在检测地板物体,我是否需要了解如何检测我放在屏幕上的其他项目以及地板物体 public boo

我正在使用farseer物理引擎创建一个2D平台,我正在经历最艰难的时刻,试图找出如何使用OnCollision,尽管我看到了,但我仍在努力掌握这个概念。这就是我的工作。我想知道球员什么时候触地,这样我就可以有一个叫isJumping的球。当玩家跳跃时,“isJumping”为真,因此玩家不会一直跳跃。 (我还想有一个地面布袋,上面写着“干草,你在地上”。)

这段代码的问题是我将得到一个空引用。我也只是在检测地板物体,我是否需要了解如何检测我放在屏幕上的其他项目以及地板物体

public bool OnCollision(Fixture fixtureA, Fixture fixtureB,  FarseerPhysics.Dynamics.Contacts.Contact contact)
    {
        if (contact.IsTouching())
        {
            if (fixtureA.Body.GetType() == Person.GetType() & fixtureB.Body.GetType() == game1.floor.GetType())
            {
                ground = true;
                isJumping = false;
            }
        }
        return false;
    }
  • 我试图用这个代码做的是,首先,找出玩家是否在触地,而不是撞到它的头,或者撞到物体的左墙或右墙。(同时检查玩家是否可以跳跃)

  • 如果我在游戏中添加更多的对象,我是否需要在这个函数中添加更多的代码,即使我只想让它检测玩家的底部是否与对象发生碰撞,让玩家停止

  • 我应该能够检测到玩家是否也在碰撞其顶部或侧面,对吗


  • 确定玩家是否在空中的更好方法是使用光线投射

    例如,我使用这样的方法来确定光线与哪个对象发生碰撞(注意:RayCastResult只是一个保存结果的类):

        public static RayCastResult FindClosest(this World world, Vector2 startPoint, Vector2 endPoint, Func<Fixture, bool> filter)
        {
            var result = new RayCastResult ();
    
            world.RayCast((f, p, n, fr) =>
            {
                if (filter(f)) {
                    return -1.0f;
                }
    
                result.Fixture = f;
                result.HitPoint = p;
                result.HitPointSurfaceNormal = n;
                return fr;
            }, startPoint, endPoint);
    
            return result;
        }
    
        private bool RunInAirHitTest(Vector2 start, Vector2 end)
        {
            var hitTest = _world.FindClosest (start, end, f => IsHit(f.Body));
            var hitDistance = (hitTest.HitPoint - start).Length ();
            return !hitTest.HitOccurred || hitDistance > _wheelRadius * 1.2f;
        }