2014-01-22 2 views
6

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

ответ

6

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

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

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

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

Существует также нет возможности использовать Box2dLights без Box2D кстати.

+0

Спасибо за этот быстрый ответ. Я рассмотрю эту статью как можно скорее. Благодаря! – Springrbua

+0

Думаю, я понял, как это работает. В libgdx я мог бы использовать метод draw на моей сцене и перегружать все с помощью darkblue, прозрачным (Alpha = 0.7f или что-то в этом роде). Цвет для добавления окружающего света? Но как я могу добавить яркий свет к персонажу? Спасибо – Springrbua

+0

Сначала вы делаете свою сцену обычным способом. Затем вы создаете FBO размера вашего экрана, но вы устанавливаете свой (фоновый) цвет на что-то вроде (0,7, 0,7, 0,7, 1,0), например (окружающая молния). После этого вы нарисуете все свои огни на этом FBO, точно так же, как вы нарисуете что-то в своей обычной сцене. Они будут белыми пятнами поверх более темного фона. Когда вы закончите с этим, вы окажете это FBO с включенным смешением поверх вашей обычной сцены. Все места без света станут темнее из-за темного окружающего цвета fbo. Все остальные станут ярче (огни). – noone

20

По-моему, отмеченный ответ неверен.

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

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

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

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, но нам не нужно что-то делать с ним. Итак, что мы делаем:

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, и, таким образом, используя для этого каскадную комбинированную матрицу. Если вы используете другую камеру, просто используйте ее комбинированную матрицу. Последнее утверждение создает pointlight с rayHandler и описывает количество лучей, цвет фона, его радиус и его положение.

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

rayHandler.updateAndRender(); 

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

+0

Спасибо за ваш ответ, это верно и понятно! +1 – Springrbua

 Смежные вопросы

  • Нет связанных вопросов^_^