【问题标题】:Multiple Raycasting for line of sight视线的多重光线投射
【发布时间】:2016-04-13 15:30:46
【问题描述】:

我正在尝试在 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方法中,不断调用。

现在的问题是我有多个对象在执行此光线投射,所以发生的情况是固定装置被添加到接触队列中,并且更新方法中有一些代码检查队列中的第一项是否是播放器。如果是玩家,则发射弹丸。

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

所有这些看起来有点乱,也没有完全工作,因为我有多个身体光线投射并使用回调方法。

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

【问题讨论】:

    标签: java libgdx box2d raycasting


    【解决方案1】:

    您可能需要考虑的一件事(您可能已经知道这一点)是reportRayFixture没有按任何顺序调用。因此,即使玩家是第一个在看来,它可能不是该方法调用的第一个夹具。

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

    【讨论】:

    • 非常感谢..帮助解决了问题。在 RayCastCallback 实现中使用全局变量来跟踪最小分数和与之关联的夹具。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    相关资源
    最近更新 更多