XNA Farseer。 Raycast正在经历各种形状

时间:2013-05-21 22:58:44

标签: xna farseer raycasting

我在XNA制作游戏。 enter image description here

我正在做一个从敌人到玩家的光线投射,以确定敌人是否可以看到该玩家。 继承人代码..

 private float RayCallBack(Fixture fixture, Vector2 point, Vector2 normal, float fraction)
    {
        rayhit = fixture.Body.UserData.ToString();
        if (fixture.Body.UserData == "player")
        {
            //AIawake = true;
        }
        return 0f;
    }


     _world.RayCast(RayCallBack, _blocklist[0]._floor.Position , ConvertUnits.ToSimUnits(playerpos));

我的问题是,在图片的情况下,我在程序上生成了由块组成的洞穴,光线似乎穿过了块,所以敌人可以透过墙壁看到。

-

更新

好以下代码有效!但是......我不明白为什么!! :/

 private float RayCallBack(Fixture fixture, Vector2 point, Vector2 normal, float fraction)
    {
        rayhit = fixture.Body.UserData.ToString();
        if (fixture.Body.UserData == "player")
        {
            return fraction;
        }
        else
        {
            return 0f;
        }
    }

然后在这个类的单独更新语句中有代码来唤醒敌人。

    if (rayhit == "player") AIawake = true;

我显然不明白raycast和回调是如何工作的。如果有人能解释为什么这种方法有效,那就太好了。我打算做更多的光线投射来阻止敌人撞到东西等等。

1 个答案:

答案 0 :(得分:0)

有4种情况。如果你:

  1. 在你的回调夹具中返回-1,然后将忽略夹具并且光线将继续
  2. 返回0光线将终止
  3. 返回分数然后光线将在此时停止
  4. 返回1然后光线将继续直到它结束
  5. 当您想忽略某些灯具时,会使用第一个场景。 当您想知道光线是否击中任何物体(不一定是最近的物体)时,会使用第二种情况。 第三种情况用于查找最近的对象。 当您希望了解光线路径中的所有对象时,将使用第四种方案。

    通常,回调逻辑会有一个部分检查应该被忽略的对象,如果应该忽略它们则返回-1,然后返回0,分数或1的代码块。

    第二种和第三种情景之间的差异可能是最难理解的。我理解的方式是,如果你返回0,将不会评估任何其他潜在命中。但是如果你返回一个分数(它会剪切光线)将会评估新的(剪裁的)光线长度内的其他潜在命中 - 换句话说,你的回调将被执行,并且光线可能会被进一步削减最终将返回最近的对象。

    请参阅Box2D documentation about Ray Casting here

    文档确实说的一件事是评估的顺序不能得到保证。在你的情况下,可能是在墙块之前对玩家进行了评估。

    TL;博士;像在第二个代码示例中那样返回分数。