【问题标题】:XNA Farseer. Raycast is going through shapesXNA 先知。 Raycast 正在处理形状
【发布时间】:2013-11-02 18:44:33
【问题描述】:

我正在 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;

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

【问题讨论】:

    标签: xna farseer raycasting


    【解决方案1】:

    有 4 种情况。如果你:

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

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

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

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

    Box2D documentation about Ray Casting here

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多