libgdx中的多个摄像头(可能与其他框架类似)

时间:2013-08-20 22:10:11

标签: java android camera opengl-es-2.0 libgdx

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

我已经开始学习libgdx并完成了几个教程。现在我已经尝试使用我学到的所有内容并创建一个简单的侧滚动游戏。现在,我知道有libgdx的例子,但我没有找到一个将Box2d与scene2d和actor以及平铺地图结合起来的。

我的主要问题是相机。

你需要一个相机用于舞台(据我所知,它用于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和相机时,它应该跟随他,精灵比身体(绿色调试方块)更快。

所以我的主要问题是:

  • 我不明白当您有多台相机时会发生什么。 “通过”你真正看到哪一个在montior?
  • 我应该使用多台摄像机吗?

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

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

1 个答案:

答案 0 :(得分:16)

你实际上是在同一时间看到所有这些。他们可能会看到一个完全不同的世界,但所有这些都将他们的观点呈现在屏幕上。 您可以使用多个摄像头,也可以只使用一个。如果您只使用一个,则需要确保正确更新投影矩阵,在绘制TiledMap,舞台上的演员和可选的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())

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

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

完成所有设置后,您只需使用正确的相机渲染所有内容,并将每个“图层”/“视图”渲染到彼此之上。首先是ParallaxBackground,然后是你的Tiledmap,然后是你的Entity-Stage,然后是你的Box2DDebugging视图,然后是你的UI阶段。

一般情况下,在更改相机的任何内容后,请务必致电spriteBatch.setProjectionMatrix(cam.combined);并使用cam.update()