Несколько камер в libgdx (возможно, аналогичные в других средах)

Я пытался решить эту проблему в течение двух дней, и я отказался от поиска существующего решения.

Я начал изучать libgdx и закончил пару учебников. И теперь я попытался использовать все, что я узнал, и создать простую прокрутку игры. Теперь я знаю, что есть примеры libgdx, но я не нашел тот, который включает Box2d с scene2d и актерами, а также с черепичными картами.

Моя основная проблема связана с камерами.

Вам нужна камера для сцены (которая, насколько мне известно, используется для матрицы проекции SpriteBatch, переданной методу draw () у актеров, если это неправильно, пожалуйста, исправьте меня), и вам нужна камера для TileMapRender для Вызов метода render (). Кроме того, в некоторых учебных пособиях есть приложение OrthographicCamera в GameScreen, которое используется там, где это необходимо.

Я попытался передать объект OrthographicCamera методам, я пытался использовать камеру со сцены и камеры из TileMapRenderer всюду. Ex.

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, но я не думаю, что это мешает камерам), но спрайт актера не виден (возможно, вне экрана)
  • Я могу видеть все, что должен, но когда я пытаюсь переместить Актера и Камера, которые должны следовать за ним, спрайт идет быстрее, чем тело (зеленый квадрат отладки).

Поэтому мои основные вопросы:

  • Я не понимаю, что происходит, когда у вас несколько камер. «Через», который вы на самом деле видите на montior?
  • Должен ли я использовать несколько камер и как?

Кроме того, я думал, что должен упомянуть, что я использую OpenGL ES 2.0.

Прошу прощения за длинный вопрос, но я подумал, что должен подробно описать, поскольку для меня это немного сложно.

Вы фактически просматриваете их все одновременно. Однако они могут смотреть на совершенно другой мир, но все они отображают свою точку зрения на экран. Вы можете использовать несколько камер или только один. Если вы используете только один, вам нужно убедиться, что вы правильно обновляете матрицу проекций, между рисованием 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()) 

На самом деле я еще не использовал scene2d вместе с Box2D, потому что мне не нужно было очень сильно взаимодействовать с моими игровыми объектами. Вам нужно реализовать пользовательский PhysActor, который расширяет Actor и строит мост от scene2d до Box2D, имея тело как свойство. Он должен будет установить положение Актера, поворот и т. Д. На основе Тела на каждом этапе обновления. Но здесь у вас есть несколько вариантов. Вы можете повторно использовать tiledMapCam и работать в экранных координатах. В этом случае вам нужно всегда помнить о том, чтобы размножаться с Constants.PIXELS_PER_METER при обновлении вашего актера. Или вы будете использовать другую камеру с тем же окном просмотра, что и физический диск. В этом случае преобразование не требуется, но я не уверен, что это может помешать некоторым вещам, связанным с scene2d.

Для ParallaxBackground вы можете использовать другую камеру, а для пользовательского интерфейса вы можете снова использовать другую сцену и другую камеру … или повторно использовать других, вернув их правильно. Это ваш выбор, но я думаю, что несколько камер не сильно влияют на производительность. Меньше сброса и преобразования могут даже улучшить его.

После того, как все настроено, вам просто нужно сделать все, используя правильные камеры и визуализировать каждый «слой» / «вид» друг над другом. Сначала ParallaxBackground, затем ваш Tiledmap, затем ваш Entity-Stage, затем ваш Box2DDebugging, а затем ваш UI-этап.

В общем, не забудьте вызвать spriteBatch.setProjectionMatrix(cam.combined); И с помощью cam.update() после того, как вы изменили что-либо из своей камеры.

Intereting Posts