Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java libgdx中的多个摄像头(在其他框架中可能类似)_Java_Android_Camera_Opengl Es 2.0_Libgdx - Fatal编程技术网

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

Java libgdx中的多个摄像头(在其他框架中可能类似),java,android,camera,opengl-es-2.0,libgdx,Java,Android,Camera,Opengl Es 2.0,Libgdx,我已经尝试解决这个问题两天了,我已经放弃了寻找现有的解决方案 我已经开始学习libgdx并完成了一些教程。现在我试着利用我所学的知识,创建一个简单的侧滚游戏。现在,我知道有libgdx这样的例子,但我还没有找到一个将Box2d与scene2d、演员以及平铺贴图结合在一起的例子 我的主要问题是照相机 您需要一个用于舞台的摄影机(据我所知,它用于传递给actors的方法draw()的SpriteBatch的投影矩阵,如果这是错误的,请更正我),并且您需要一个用于TileMapender的摄影机来调用

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

我已经开始学习libgdx并完成了一些教程。现在我试着利用我所学的知识,创建一个简单的侧滚游戏。现在,我知道有libgdx这样的例子,但我还没有找到一个将Box2d与scene2d、演员以及平铺贴图结合在一起的例子

我的主要问题是照相机

您需要一个用于舞台的摄影机(据我所知,它用于传递给actors的方法draw()的SpriteBatch的投影矩阵,如果这是错误的,请更正我),并且您需要一个用于TileMapender的摄影机来调用render()方法。此外,在一些教程中,游戏屏幕中有一个正交摄影机,可在需要时使用

我尝试过将正交摄影机对象传递给方法,我尝试过在任何地方使用舞台上的摄影机和TileMapender上的摄影机。 前

我也尝试在任何地方使用不同的摄像机

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

  • 屏幕上没有任何内容(可能相机远离所画的东西)
  • 我可以从debugRender中看到平铺贴图和轮廓(我也使用debugRender,但我认为它不会干扰摄影机),但演员的精灵不可见(可能在屏幕外)
  • 我可以看到我应该看到的一切,但当我试图移动演员和应该跟随他的相机时,精灵的速度比身体(绿色的调试方块)快
因此,我的主要问题是:

  • 我不明白当你有多个摄像头时会发生什么。“通过”你在montior上看到了哪一个
  • 我应该使用多个摄像头吗?如何使用
另外,我想我应该提到我正在使用OpenGLES2.0


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

你实际上可以同时看穿所有的问题。尽管他们可能会看到一个完全不同的世界,但他们都会将自己的观点呈现在屏幕上。 您可以使用多个摄像头,也可以仅使用一个。如果只使用一个,则需要确保在绘制平铺贴图、使用演员的舞台以及可选的Box2Debugger渲染器之间正确更新投影矩阵

我会为Box2Debugger使用一个额外的相机,因为你可以很容易地在以后扔掉它。我假设您使用转换因子将米转换为像素,反之亦然。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());
平铺贴图将始终在(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并构建从scene2d到Box2D的桥梁。它必须在每个更新步骤中根据身体设置演员的位置、旋转等。但这里你有几个选择。您可以重复使用tiledMapCam并在屏幕坐标中工作。在这种情况下,在更新actor时,您需要始终记住使用常量.PIXELS\u PER\u METER进行乘法。或者您将使用另一个具有相同视口的cam,如physicsDebugCam。在这种情况下,不需要进行转换,但我不确定这是否会干扰某些特定于场景2D的事情

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

设置完所有内容后,您只需使用正确的摄影机渲染所有内容,并在每个“层”/“视图”的顶部渲染。首先是视差背景,然后是平铺贴图,然后是实体阶段,然后是Box2Debugging视图,然后是UI阶段


通常记得调用
spriteBatch.setProjectionMatrix(cam.combined)并在更改相机的任何内容后使用
cam.update()

是否调用stage.act()&stage.draw()来渲染stage?我也有类似的问题;我正在使用自定义单位和投影(作为阶段的一部分)渲染平铺贴图,并且我希望在上面渲染一个调试UI,其中包含类似FPS的文本。但是,即使我为调试UI使用单独的
正交摄影机
,并将其拉伸到w/h屏幕,并将其设置在用于渲染文本的精灵批处理上,它也将根据贴图边界而不是我的屏幕边界进行渲染。我是否必须在调用stage.draw()之后和debugUi.render()之前重置某些内容才能防止这种情况发生?我一定是遗漏了什么。@Matthias请创建一个新问题,包括相关代码。确定:
tiledMapCam.position.set(actor.getX(), actor.getY())