Java 视线的多重光线投射

Java 视线的多重光线投射,java,libgdx,box2d,raycasting,Java,Libgdx,Box2d,Raycasting,我正试图找到我在box2d周围的方法,我不确定我使用raycast回调进行视线检测的方法 private RayCastCallback callback = new RayCastCallback() { @Override public float reportRayFixture(Fixture fixture, Vector2 point, Vector2 Normal, float fraction) { collision.s

我正试图找到我在box2d周围的方法,我不确定我使用raycast回调进行视线检测的方法

 private RayCastCallback callback = new RayCastCallback() {
        @Override
        public float reportRayFixture(Fixture fixture, Vector2 point, Vector2 Normal, float fraction) {
            collision.set(point);

            lineOfSight.addLast(fixture);

            if (fixture.getFilterData().categoryBits != BIT_PLAYER) {
                System.out.println("ray hit wall");
                return fraction;}
            else if (fixture.getFilterData().categoryBits == BIT_PLAYER) {
                System.out.println("player found");

                return fraction;
            }

            return 0;
        }
上面是我的回调方法,通过以下方式调用:

       world.rayCast(callback, startp, endp);
上面的一行在update方法中,并被连续调用

现在的问题是,我有多个对象执行此光线投射,因此发生的情况是,在contact上将装置添加到队列中,并且在update方法中有一些代码,用于检查队列中的第一个项目是否为player。如果是玩家,则发射射弹

  if (lineOfSight.first().getFilterData().categoryBits == BIT_PLAYER) {
                   lineOfSight = new Queue<Fixture>();
                   createBullet();
               } else {
                   lineOfSight.clear();
               }
if(lineOfSight.first().getFilterData().categoryBits==BIT\u播放器){
lineOfSight=新队列();
createBullet();
}否则{
视线。清晰();
}
所有这些看起来都有点混乱,而且也不能完全正常工作,因为我使用了多体光线投射和回调方法

是否有一种更有效的方法来执行此操作,或者可能以某种方式编辑reportRayFixtue方法?我想不出编辑参数的方法:(
谢谢你的时间。

你可能要考虑的一件事(你可能已经知道这一点)是<代码> RealTrayItgult是“强”>不是按任意顺序调用。< /强>所以,即使玩家是视线中的第一个,它也不是第一个被称为方法的固定器。


要获得正确的顺序,您可以使用
分数
参数来测量哪一个是第一个出现的。分数越小,它离起点越近,反之亦然。要获得第一个夹具,您需要跟踪回调调用的最小分数。希望这能解决您的问题。

非常感谢。。帮助解决了这个问题。在RayCastCallback实现中使用一个全局变量来跟踪最小分数和与之相关的fixture。