Я только начал создавать игру, используя libgdx. Это 2D-шутер с видом сверху, использующий пользовательский интерфейс scene2d. Теперь я подумал, что могу добавить тьму и свет на некоторые уровни, но я не хочу переписывать все с помощью box2d. Мне не нужны реалистичные тени, просто какой-нибудь окружающий свет и световой круг вокруг моего персонажа, на который не влияют стены и другие препятствия вокруг него. Итак, я хотел знать, есть ли какая-либо система освещения в libgdx? Или я могу использовать box2dlights без использования box2d bodys/world...? Спасибо
Легкий libgdx без box2d
Ответы (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();
после этого в методе рендеринга. Довольно легко.