Свет Libgdx без box2d
Я только начал создавать игру, используя libgdx. Это 2d шутер сверху вниз с использованием scene2d ui. Теперь я подумал, что могу добавить тьму и свет на некоторые уровни, но я не хочу переписывать все, используя box2d. Мне не нужны реалистичные тени, только какое-то окружающее освещение и круг вокруг моего персонажа, на который не влияют стены и другие препятствия, окружающие его. Так что я хотел знать, есть ли какая-нибудь система освещения в libgdx? Или я могу использовать box2dlights без использования box2d body /world...? Спасибо
2 ответа
К сожалению, ничего подобного уже не предоставлено LibGDX.
Но вы можете легко сделать это сами, если не хотите теней.
Вот небольшое видео того, кто сделал это через LibGDX. Вот статья к этому видео, с кодом и описаниями и всем предоставленным. Вы можете сделать это таким образом с шейдерами, но вы также можете сделать то же самое, просто отрисовав карту освещения в FBO (в указанных ссылках вы можете увидеть, как это сделать), а затем просто отрендерите ее обычным способом с активированным смешиванием сверху. вашего экрана. Стандарт SpriteBatch
можете сделать это, и вам не нужно никаких пользовательских шейдеров.
Если вы все еще хотите иметь настоящие тени с препятствиями, вы, вероятно, найдете эту статью очень полезной. Но это намного медленнее и требует специальных шейдеров.
Также нет способа использовать Box2dLights без Box2D, кстати.
На мой взгляд, отмеченный ответ неверен.
На самом деле довольно просто использовать box2dLights без использования box2d, если вам не нужны тени. Вопрос был в том, можно ли добавить какой-то круговой свет вокруг персонажа.
Я использовал два разных подхода, только один с использованием box2dlights.
Статья в помеченном ответе различает метод с использованием FBO. Вам действительно не нужно это, если вы просто хотите осветить область. Тебе просто нужен спрайт, вот так. Теперь разместите его где-нибудь на экране, и при рендеринге сделайте следующее:
batch.setBlendFunction(GL20.GL_DST_COLOR, GL20.GL_SRC_ALPHA);
theLightSprite.draw(batch, parentAlpha);
batch.setBlendFunction(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
Сначала изменяется функция смешивания, поэтому мы не просто визуализируем спрайт, а смешиваем его осветительным способом на фоне. После отрисовки восстановите функцию смешивания до нормальной, так что все остальное после этого снова будет отображаться как обычно. Это оно.
Второй подход использует box2dlights. Да, нам нужен объект мира box2d, но нам не нужно что-то с ним делать. Итак, что мы делаем:
world = new World(new Vector2(0,0),false);
rayHandler = new RayHandler(world);
rayHandler.setCombinedMatrix(stage.getCamera().combined);
new PointLight(rayHandler,1000, Color.BLUE,radius,x_position,y_position);
Сначала мы создаем наш мир, который просто ничего не делает. Нам это нужно только для второго оператора, где мы создаем наш RayHandler, который вычисляет наши источники света. В третьем утверждении мы устанавливаем матрицу rayHandler. В этом случае я использую scene2d и, таким образом, использую для него комбинированную матрицу сцены. Если вы используете другую камеру, просто используйте ее комбинированную матрицу здесь. Последнее утверждение создает точечный свет с помощью rayHandler и описывает количество лучей, цвет источника света, его радиус и положение.
Все, что мы должны сделать сейчас, это нарисовать наш этап или спрайты в нашем методе render() и вызвать
rayHandler.updateAndRender();
после этого в методе рендеринга. Довольно легко.