我正在学习libgdx,其中一件让我对它的光线投射感到困惑的事情。我阅读了如何使用它的教程,我理解它,但我真的想知道后面是什么。我搜索了这个方法的源代码。
public void rayCast (final RayCastCallback callback, float point1X, float point1Y, float point2X, float point2Y) { // FIXME pool RayCastCallback?
world.raycast(new org.jbox2d.callbacks.RayCastCallback() {
@Override
public float reportFixture (org.jbox2d.dynamics.Fixture f, Vec2 p, Vec2 n, float fraction) {
return callback.reportRayFixture(fixtures.get(f), point.set(p.x, p.y), normal.set(n.x, n.y), fraction);
}
}, this.point1.set(point1X, point1Y), this.point2.set(point2X, point2Y));
} 我们如何看待这个方法以递归方式调用自身并返回对回调变量的reportRayFixture的调用。真正让我困惑的是代码选择夹具的位置,以及它如何检查每个夹具。有人能解释我的确如何运作。
我会很感激的!
答案 0 :(得分:0)
Raycasting是当我们在空间中绘制一条不可见的线并看到它与之相交时。一个常见的用途是弄清楚玩家点击的是什么 - 我们从玩家的方向画一条线,玩家点击的方向,我们的线接触的第一个对象是玩家点击的线。
在Box2D中,RayCastCallback界面用于允许您编写在光线到达灯具时执行的代码(例如,您可能想要忽略某些灯具)。我没有亲自使用过这个,但我想你可以在射击游戏中使用这样的东西,看看穿墙的武器是否可以击中墙后面的物体(或类似的东西)。
从较高的层面来看,这段可爱的代码正在做的事情有点轻微 - 如果你仔细观察它,它正在做的是接受< strong> libGDX RayCastCallback并将其包装在 JBox2D RayCastCallback中,它具有稍微不同的API。它更像是重载方法而不是递归调用它。
我 知道作者选择创建Point1和Point2实例变量的原因。我想如果你有多个灯具他们会被覆盖,所以也许他们应该包含最后一个光线击中的灯具?即便如此,看起来多个光线投射会覆盖它们。