2016-12-26 113 views
0

我在学习libgdx和其中一件让我真正困惑它的光线投射的东西。我阅读了一篇关于如何使用它的教程,并且我理解它,但我真的很想知道背后是什么。我搜索了这个方法的源代码。有人能解释我rayCast的工作原理吗?

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通话。这让我很困惑,它是从代码选择Fixture的地方,以及它如何检查每个灯具。有人能真正解释我的工作吗?

这其源代码页https://github.com/libgdx/libgdx/blob/master/extensions/gdx-box2d/gdx-box2d-gwt/src/com/badlogic/gdx/physics/box2d/gwt/emu/com/badlogic/gdx/physics/box2d/World.java

,我将不胜感激!

+0

您正在查看错误的代码(除非您使用的是gwt)。你所指的代码是gwt后端,这是一个使用jbox2d的特例。所有其他后端只使用普通(本机)box2d库。 – Xoppa

回答

0

Raycasting是当我们通过空间画一条看不见的线并看看它与什么相交。一个常用的方法是找出玩家点击的是什么 - 我们沿着玩家点击的方向从相机中划出一条线,我们线触及的第一个对象是玩家点击的线。

在Box2D中,RayCastCallback接口用于允许您编写在射线遇到Fixture时执行的代码(例如,您可能需要忽略某些固定装置)。我没有亲自用过这个,但我想你可以在射击游戏中使用类似的东西来看看穿墙的武器是否可以击中墙后的物体(或类似的东西)。

在较高的水平,这是什么可爱一段代码做的是一点点轻微的手工的,如果你看它真的很密切,它在做什么走在libGDX RayCastCallback,并在其包装JBox2D RayCastCallback具有略微不同的API。它更像是重载方法而不是递归地调用它。

什么我不要知道是为什么作者选择创建Point1和Point2实例变量。我想如果你有多个装置,他们会被覆盖,所以也许他们应该包含射线最后一个装置。即使如此,它看起来像多个raycasts会覆盖它们。

相关问题