Легкий libgdx без box2d

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


person Springrbua    schedule 22.01.2014    source источник


Ответы (2)


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

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

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

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

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

person noone    schedule 22.01.2014
comment
Спасибо за этот действительно быстрый ответ. Я пройду через эту статью как можно скорее. Спасибо! - person Springrbua; 22.01.2014
comment
Кажется, я понял, как это в основном работает. В libgdx я мог бы использовать метод рисования моей сцены и перерисовать все темно-синим прозрачным (альфа = 0,7f или что-то в этом роде) цветом, чтобы добавить окружающий свет? Но как мне тогда добавить яркий свет персонажу? Спасибо - person Springrbua; 22.01.2014
comment
Сначала вы визуализируете свою сцену обычным способом. Затем вы создаете FBO размером с ваш экран, но вы устанавливаете свой (фоновый) цвет на что-то вроде (0,7, 0,7, 0,7, 1,0), например (окружающая молния). После этого вы рисуете все источники света на этом FBO, точно так же, как вы рисуете что-то в своей обычной сцене. Это будут белые пятна поверх более темного фона. Когда вы закончите с этим, вы визуализируете этот FBO с включенным смешиванием поверх вашей обычной сцены. Все места без света станут темнее из-за темного окружающего цвета fbo. Все остальные станут ярче (огоньки). - person noone; 22.01.2014
comment
Таким образом, фон (0,7, 0,7, 0,7, 1,0) и белые пятна (света) имеют альфа-канал 1, а прозрачность затем устанавливается на весь FBO, а затем рисуется поверх моей визуализированной сцены? - person Springrbua; 22.01.2014
comment
Да, перед тем, как вы нарисуете FBO на своей сцене, вы должны установить цвет пакета на что-то вроде (1, 1, 1, 0,7f), что применяет глобальную альфу к вашей карте освещения. - person noone; 22.01.2014
comment
Звучит просто в использовании (: Надеюсь, я не ошибаюсь xD Я посмотрел на этот github.com/ mattdesl/lwjgl-basics/wiki/FrameBufferObjects и заметил, что в FBO изменяется размер партии. Я использую камеру в своей игре, что позволяет использовать мой собственный Worldunit вместо размера пикселей. нужно изменить размер FBO, только если я просто хочу добавить рассеянный свет в часть экрана?И если я это сделаю, могу ли я изменить его размер, используя мои Worldunits? - person Springrbua; 22.01.2014
comment
Я не понимаю вашего вопроса на самом деле. Ваш FBO (если вы не используете шейдер/смешивание) должен быть того же размера, что и ваше окно/экран. Если вы используете камеру, вы также должны передавать свет на FBO с помощью этой камеры. В противном случае они не появятся там, где должны быть. Возможно, вам стоит попробовать, и если у вас возникнут проблемы, опубликуйте новый вопрос и добавьте в него свой код. - person noone; 22.01.2014
comment
Итак, FBO использует тот же пакет спрайтов и ту же камеру (я установил для проекции пакетов спрайтов значение camera.combined)? Так что мне не нужно изменить его размер правильно? - person Springrbua; 22.01.2014
comment
Я только что заметил, что FBO работает только с OpenGL ES 2.0. Моя игра будет настольной только на данный момент. Какую версию OpenGL (не ES) мне тогда использовать? И есть ли что-то, что я должен изменить тогда? - person Springrbua; 27.01.2014
comment
opengl.org/wiki/Framebuffer_Object говорит, что начиная с версии 3.0. Я не думаю, что вам нужно что-то менять. Поскольку LibGDX все равно абстрагируется от этого. - person noone; 27.01.2014
comment
Замечательно! Я просто беспокоюсь, потому что читал, что некоторые устройства Android имеют проблемы с OpenGl ES 2.0, а FBO поддерживается только с OpenGl Es 2.0. Поэтому я подумал, что это может вызвать некоторые проблемы на рабочем столе. Спасибо - person Springrbua; 27.01.2014
comment
ммм, да... на некоторых устройствах есть проблемы с OpenGL ES 2... около 0,1% (developer.android.com/about/dashboards/index.html#OpenGL) - person noone; 27.01.2014
comment
О, так много... Я читал об этом много раз, поэтому 0,1% меня немного шокирует :P - person Springrbua; 27.01.2014
comment
У меня есть сцена libgdx с собственной камерой шириной 50 и высотой 31. Я установил проекционную матрицу spritebatchs на camera.combined. Если я использую тот же пакет спрайтов для FBO, должен ли я установить его ширину на 50 и высоту на 31 и установить положение света в мировых единицах (P (50/0) внизу справа)? Или я делаю это в пикселях? - person Springrbua; 04.02.2014
comment
@Springrbua Пожалуйста, прекратите задавать все больше и больше вопросов в комментариях. Откройте новый вопрос и добавьте в него необходимую информацию (код). Таким образом, может быть и кто-то еще, кто ответит. - person noone; 04.02.2014
comment
я открыл новый вопрос. Просто подумал, что мелочь не стоит нового вопроса. Но еще раз спасибо! - person Springrbua; 04.02.2014

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

На самом деле довольно просто использовать 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();

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

person Kedu    schedule 30.09.2014
comment
Привет. Кто-нибудь может дать новую ссылку? Ссылка не работает. - person Jay N; 05.12.2019