gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:25:13 28 4
gpt4 key购买 nike

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

我已经开始学习 libgdx 并完成了几个教程。现在我尝试使用我所学的一切来创建一个简单的横向卷轴游戏。现在,我知道有 libgdx 示例,但我还没有找到将 Box2d 与 scene2d 和 Actor 以及平铺 map 结合在一起的示例。

我的主要问题是相机。

你需要一个舞台相机(据我所知,它用于传递给 Actor 方法 draw() 的 SpriteBatch 的投影矩阵,如果这是错误的,请纠正我)并且你需要一个相机用于调用 render() 方法的 TileMapRender。此外,在一些教程中,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 中看到平铺 map 和轮廓(我也使用 debugRender,但我认为它不会干扰相机),但是 Actor 的 Sprite 不可见(可能在屏幕外)<
  • 我可以看到我应该看到的一切,但是当我尝试移动 Actor 和应该跟随他的摄像机时, Sprite 移动得比 body 快(绿色调试方 block )。

所以我的主要问题是:

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

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

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

最佳答案

您实际上同时看穿了所有这些。虽然他们可能会看到一个完全不同的世界,但他们都会将自己的观点呈现在屏幕上。您可以使用多个摄像头,也可以只使用一个。如果您只使用一个,则需要确保在绘制 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) 处呈现。所以你需要使用相机在 map 上四处移动。它可能会跟随 body ,因此您可以通过以下方式更新它:

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

或者如果它跟随一个 Actor:

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

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

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

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

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

关于java - libgdx 中的多个摄像头(在其他框架中可能类似),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18345783/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com