Libgdx свет без box2d

Я только начал создавать игру с помощью libgdx. Это сверху вниз 2d шутер с использованием scene2d ui. Теперь я думал, что могу добавить темноту и свет на некоторые уровни, но я не хочу переписывать все с помощью box2d. Мне не нужны реалистичные тени, просто какой-то рассеянный свет и световой круг вокруг моего персонажа, на который не влияют стены и другие препятствия. Поэтому я хотел знать, есть ли какая-либо система освещения в libgdx? Или я могу использовать box2dlights без использования тела Box2D в/мира...? Спасибо

2 ответов


к сожалению, LibGDX не предоставляет ничего подобного.

но вы можете легко сделать это сами, если вам не нужны тени.

здесь это небольшое видео кого-то, кто сделал это через LibGDX. здесь статья к этому видео, с кодом и описания и все. Вы можете сделать это таким образом с шейдерами, но вы также можете сделать то же самое, просто визуализируя lightmap в FBO (в приведенных ссылках вы можете увидеть, как для этого), а затем просто визуализируйте его обычным способом с активированным смешиванием в верхней части экрана. Стандарт SpriteBatch может это сделать, и вам не нужны пользовательские шейдеры.

Если вы все еще хотите иметь реальные тени с препятствиями, вы, вероятно, найти этой статья очень полезная. Но это намного медленнее и требует специальных шейдеров.

также нет способа использовать Box2dLights без Box2D btw.


на мой взгляд, отмеченный ответ неверен.

его на самом деле довольно просто использовать box2dLights без использования box2d, если вы не хотите никаких теней. Вопрос был в том, можно ли добавить какой-то Круг света вокруг персонажа.

я использовал два разных подхода, только один с использованием box2dlights.

статьи помеченные ответ discripes метод, используя ФБО. U действительно не нужно, если вы просто хотите облегчить область. U просто нужен спрайт, как этой. Теперь поместите его где-нибудь на экране ur, и при рендеринге сделайте следующее:

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);

сначала функция blend изменяется, поэтому мы не просто визуализируем спрайт, но смешиваем его в освещении на заднем плане. После его рисования сбросьте функцию blend до нормального, чтобы все остальное после этого снова отображалось нормально. Вот и все.

второй подход использует box2dlights. Да, нам нужен объект box2d world, но нам не нужно что-то делать с он. Итак, что мы делаем:

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, который вычисляет наши огни. В третьем утверждении мы устанавливаем матрицу райхандлера. В этом случае я использую scene2d и, таким образом, использую для него комбинированную матрицу stages camera. При использовании другой камеры вот его сводный матрицы. Последнее утверждение создает точечный свет с помощью rayHandler и записывает число лучи, цвет огней, их радиус и положение.

все, что нам нужно сделать сейчас, это нарисовать нашу сцену или спрайты в нашем методе render () и вызвать

rayHandler.updateAndRender();

после этого в методе render. Довольно легкий.