Я пытаюсь найти свой путь вокруг box2d, и я не уверен в своем подходе к обнаружению прямой видимости с использованием обратных вызовов raycast.Несколько Raycasting для линии видимости
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);
выше строка в методе обновления и называется непрерывно.
Теперь проблема в том, что у меня есть несколько объектов, выполняющих этот raycast, поэтому происходит то, что светильники добавляются в очередь при контакте, и есть некоторый код в методе обновления, который проверяет, является ли первый элемент в очереди игроком. Если это игрок, выстреливается снаряд.
if (lineOfSight.first().getFilterData().categoryBits == BIT_PLAYER) {
lineOfSight = new Queue<Fixture>();
createBullet();
} else {
lineOfSight.clear();
}
Все это, кажется, немного грязный и не полностью функционален, либо потому, что у меня есть несколько тел лучей литье и с помощью метода обратного вызова.
Есть ли более эффективный способ сделать это или, возможно, каким-то образом изменить метод reportRayFixtue? Я не могу придумать способ для редактирования параметров :( Благодарим Вас за ваше время.
Спасибо большое .. Помогло решить проблему. Использование глобальной переменной в реализации RayCastCallback для отслеживания минимальной доли и связанного с ней инструментария. – Littleone
Можете ли вы показать мне, как вы это сделали? – ROSA