10

我已经尝试解决这个问题两天了,我已经放弃尝试找到现有的解决方案。

我已经开始学习 libgdx 并完成了一些教程。现在我已经尝试使用我所学到的一切,创建一个简单的横向滚动游戏。现在,我知道有这方面的 libgdx 示例,但我还没有找到一个将 Box2d 与 scene2d 和演员以及平铺地图结合在一起的示例。

我的主要问题是相机。

您需要一个用于舞台的相机(据我所知,它用于 SpriteBatch 的投影矩阵传递给演员的方法 draw(),如果这是错误的,请纠正我)并且您需要一个用于 TileMapRender 的相机调用 render() 方法。此外,在某些教程中,GameScreen 中有一个 OrthographicCamera,可在需要时使用。

我尝试将 OrthographicCamera 对象传递给方法,我尝试在任何地方使用舞台上的相机和 TileMapRenderer 中的相机。前任。

OrthographicCamera ocam  = new OrthographicCamera(FRUSTUM_WIDTH, FRUSTUM_HEIGHT);
stage.setCamera(ocam); // In the other cases i replace ocam with stage.getCamera() or the one i use for the tileMap Render
tileMapRenderer.render(ocam);
stage.getSpriteBatch().setProjectionMatrix(ocam.combined); // I am not sure if this is needed

我还尝试在任何地方使用不同的相机。

在尝试了所有这些之后,我没有注意到确切发生了什么,但我会列出发生了什么:

  • 屏幕上什么都没有(可能相机远离绘制的东西)
  • 我可以从 debugRenderer 看到平铺地图和轮廓(我也使用 debugRender,但我不认为它会干扰相机),但演员的精灵不可见(可能在屏幕外)
  • 我可以看到我应该看到的所有内容,但是当我尝试移动应该跟随他的 Actor 和相机时,精灵的速度比身体快(绿色的调试方块)。

所以我的主要问题是:

  • 我不明白当你有多个相机时会发生什么。“通过”您实际上在显示器上看到的是哪一个?
  • 我应该使用多台相机吗?如何使用?

另外,我认为我应该提到我正在使用 OpenGL ES 2.0。

对于这个冗长的问题,我很抱歉,但我认为我应该详细描述一下,因为这对我来说有点复杂。

4

1 回答 1

18

你实际上同时看透了所有这些。虽然他们可能会看到一个完全不同的世界,但他们都将他们的观点呈现在屏幕上。您可以使用多台相机,也可以只使用一台。如果您只使用一个,则需要确保在绘制 TiledMap、使用 Actors 的舞台以及可能用于可选的 Box2DDebugRenderer 之间正确更新投影矩阵。

我会为 Box2DDebugRenderer 使用额外的摄像头,因为您以后可以轻松地将其丢弃。我假设您使用转换因子将米转换为像素,反之亦然。1:1的比例不会很好。我总是使用介于 1m=16px 和 1m=128px 之间的东西。

因此,您以这种方式对其进行初始化,并将其用于调试渲染器:

OrthographicCamera physicsDebugCam = new OrthographicCamera(Gdx.graphics.getWidth() / Constants.PIXEL_PER_METER, Gdx.graphics.getHeight() / Constants.PIXEL_PER_METER);

对于您的 TiledMapRenderer,您也可以使用额外的摄像头,但该摄像头仅适用于屏幕坐标,因此无需转换:

OrthographicCamera tiledMapCam = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());

TiledMap 将始终在 (0, 0) 处呈现。所以你需要使用相机在地图上四处走动。它可能会跟随一个主体,因此您可以通过以下方式对其进行更新:

tiledMapCam.position.set(body.getPosition().x * Constants.PIXELS_PER_METER, body.getPosition().y * Constants.PIXELS_PER_METER)

或者如果它跟随一个演员:

tiledMapCam.position.set(actor.getX(), actor.getY())

实际上我还没有将scene2d 和Box2D 一起使用,因为我不需要与我的游戏对象进行太多交互。您需要在这里实现一个自定义的 PhysicsActor,它扩展了 Actor 并通过将 body 作为属性来构建从 scene2d 到 Box2D 的桥梁。它必须在每个更新步骤中基于 Body 设置 Actor 的位置、旋转等。但在这里你有几个选择。您可以重复使用 tiledMapCam 并在屏幕坐标中工作。在这种情况下,您需要始终记住在更新 actor 时与 Constants.PIXELS_PER_METER 相乘。或者您将使用具有相同视口的另一个摄像头,例如physicsDebugCam。在这种情况下,不需要转换,但我不确定这是否会干扰某些特定于场景的东西。

对于 ParallaxBackground,您也可以使用另一个摄像头,对于 UI,您可以再次使用另一个舞台和另一个摄像头......或者通过正确重置它们来重用其他摄像头。这是您的选择,但我认为几个相机不会对性能产生太大影响。更少的重置和转换甚至可能会改善它。

一切都设置好后,您只需要渲染所有内容,使用正确的相机并将每个“层”/“视图”渲染在彼此之上。首先是 ParallaxBackground,然后是 Tiledmap,然后是 Entity-Stage,然后是 Box2DDebugging 视图,然后是 UI-stage。

一般来说,请记住在更改相机的任何内容后调用spriteBatch.setProjectionMatrix(cam.combined);和使用。cam.update()

于 2013-08-21T06:35:58.667 回答