我在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;
我显然不明白raycast和回调是如何工作的。如果有人能解释为什么这种方法有效,那就太好了。我打算做更多的光线投射来阻止敌人撞到东西等等。
答案 0 :(得分:0)
有4种情况。如果你:
当您想忽略某些灯具时,会使用第一个场景。 当您想知道光线是否击中任何物体(不一定是最近的物体)时,会使用第二种情况。 第三种情况用于查找最近的对象。 当您希望了解光线路径中的所有对象时,将使用第四种方案。
通常,回调逻辑会有一个部分检查应该被忽略的对象,如果应该忽略它们则返回-1,然后返回0,分数或1的代码块。
第二种和第三种情景之间的差异可能是最难理解的。我理解的方式是,如果你返回0,将不会评估任何其他潜在命中。但是如果你返回一个分数(它会剪切光线)将会评估新的(剪裁的)光线长度内的其他潜在命中 - 换句话说,你的回调将被执行,并且光线可能会被进一步削减最终将返回最近的对象。
请参阅Box2D documentation about Ray Casting here。
文档确实说的一件事是评估的顺序不能得到保证。在你的情况下,可能是在墙块之前对玩家进行了评估。
TL;博士;像在第二个代码示例中那样返回分数。