视线的多次光线投射

时间:2016-04-13 15:30:46

标签: java libgdx box2d raycasting

我试图找到我在box2d附近的路,我不确定我使用光线投射回调进行视线检测的方法。

 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方法中有一些代码检查队列中的第一项是否是播放器。如果它是一名玩家,射弹会被射击。

  if (lineOfSight.first().getFilterData().categoryBits == BIT_PLAYER) {
                   lineOfSight = new Queue<Fixture>();
                   createBullet();
               } else {
                   lineOfSight.clear();
               }

所有这些看起来都有点混乱,并且还没有完全发挥作用,因为我有多个物体光线投射和使用回调方法。

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

1 个答案:

答案 0 :(得分:0)

您可能想要考虑的一件事(您可能已经知道这一点)是reportRayFixture 未按任何顺序调用。因此,即使玩家是第一个视线,它可能不是第一个被称为该方法的夹具。

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