2

我正在 XNA 中制作游戏。 在此处输入图像描述

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

 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;

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

4

1 回答 1

0

有4个场景。如果你:

  1. 在您的回调夹具中返回 -1 然后该夹具将被忽略并且光线将继续
  2. 返回 0 射线将终止
  3. 返回分数然后射线将在这一点停止
  4. return 1 然后射线将继续直到它结束

当您想忽略某些固定装置时,使用第一种情况。当您想知道您的光线是否击中任何东西(不一定是最近的物体)时,使用第二种情况。第三种情况用于查找最近的对象。当您希望了解光线路径中的所有对象时,使用第四种情况。

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

第二种和第三种情况之间的区别可能是最难理解的。我理解的方式是,如果您返回 0,则不会评估任何其他潜在命中。但是,如果您返回一个分数(这将剪切光线),则将评估新的(剪切的)光线长度内的其他潜在命中 - 换句话说,您的回调将为所有它们执行并且光线可能会被剪切得更远最终将返回最近的对象。

在此处查看有关 Ray Casting 的 Box2D 文档

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

tl; 博士;像您在第二个代码示例中所做的那样返回分数。

于 2013-11-02T10:44:33.427 回答