Libgdx光没有box2d

时间:2014-01-22 08:54:47

标签: java libgdx box2d lighting box2dlights

我刚开始使用libgdx创建游戏。这是一个使用scene2d ui的自上而下的2D射击游戏。现在我想,我可以在一定程度上添加黑暗和光明,但我不想用box2d重写所有内容。我不需要真实的阴影只是某种环境光和我的角色周围的光环,它不受墙壁和其他障碍物的影响。所以我想知道libgdx中是否有任何一种灯光系统?或者我可以使用box2dlights而不使用box2d body / world ......?感谢

2 个答案:

答案 0 :(得分:23)

在我看来,明确的答案是错误的。

如果你不想要任何阴影,使用box2dLights而不使用box2d实际上非常简单。问题是,如果可以在角色周围添加某种圆形光。

我使用了两种不同的方法,只使用了box2dlights。

标记答案中的文章描述了使用FBO的方法。如果你只是想减轻一个区域,你真的不需要它。你只需要一个精灵,比如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 = 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创建一个pointlight,并描述光线数量,灯光颜色,半径和位置。

我们现在要做的就是在render()方法中绘制我们的舞台或精灵并调用

rayHandler.updateAndRender();
之后在render方法中

。很简单。

答案 1 :(得分:8)

不幸的是,LibGDX已经提供了类似的内容。

但如果你不想要阴影,你可以轻松自己做。

Here是一个通过LibGDX完成此操作的人的视频。 Here是此视频的文章,包含代码和说明以及所提供的所有内容。 您可以使用着色器以这种方式执行此操作,但您也可以通过将光照贴图渲染到FBO(在给定的链接中可以看到如何执行此操作)来执行相同的操作,然后只需在顶部激活混合的情况下渲染它你的屏幕。标准SpriteBatch可以做到这一点,您不需要任何自定义着色器。

如果你仍然希望有障碍的真实阴影,你可能会发现this文章非常有用。但这要慢很多,需要特殊的着色器。

如果没有Box2D btw,也无法使用Box2dLights。