Пакет libgdx рисует за пределами FitViewport

Я пытался решить эту проблему в течение 3 недель. Я начал с областей просмотра с вики libgdx и просмотрел на этом форуме много вопросов о окнах просмотра, виртуальных окнах просмотра и т.п., и нашел лучшее решение для моей игры - иметь 2 окна просмотра: 1 Fitviewport для рендеринга моей игры (не используя stage), и еще один Screenviewport для моего пользовательского интерфейса (используя Stage). Пользовательский интерфейс прорисован отлично, хотя у меня есть особая проблема с тем, что, как мне кажется, связано с DPI, потому что элементы управления на Samsung S4 отображаются очень маленькими, и их практически невозможно использовать, но я сделаю отдельный вопрос по этому поводу. Моя проблема с рендерингом игры и FitViewport на libgdx. Я настраиваю игровую камеру и ее окно просмотра таким образом на конструкторе PlayScreen, который реализует Screen:

gameCamera = new OrthographicCamera();
gameCamera.setToOrtho(false);
gameViewport = new FitViewport(800, 480,gameCamera);

Затем на метод рендеринга я применяю это так:

input(Gdx.graphics.getDeltaTime());

update(Gdx.graphics.getDeltaTime());

Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

gameCamera.update();
uiCamera.update();
MyGame.batch.setProjectionMatrix(gameCamera.combined);
gameViewport.apply();
MyGame.batch.begin();   
//DRAW CODE AFTER THIS
MyGame.batch.end();

//apply stage ScreenViewport and draw:
game.stage.getViewport().apply();
game.stage.draw();

Тогда в методе изменения размера у меня есть только эти 2 строки:

game.stage.getViewport().update(width,height,true);
gameViewport.update(width,height);
gameCamera.position.set(Gdx.graphics.getWidth()/2,Gdx.graphics.getHeight()/2,0);

Методы рисования основаны на координатах Gdx.graphics.getHeight() и Gdx.graphics.getWidth(). Мой игровой мир - это шутер сверху вниз, который использует Gdx.graphics.getWidth() и getHeight () для порождения существ и ограничения движения игрока.

Опять же, проблема у меня заключается в следующем: - FitViewport, кажется, не работает должным образом. Когда я пытаюсь сделать это на своем устройстве, окно просмотра подходит, создает линии желоба, но я не вижу игрока, нарисованного относительно координат Gdx.graphics. - Когда я делаю тест-драйв на рабочем столе со странными разрешениями, я вижу, как пули вытягиваются за пределы области просмотра в линии желоба. Я не знаю, почему это происходит.

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

1 ответ

Решение

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

Давайте принимать FitViewportкогда вы инициализируете это new FitViewport(float worldWidth, float worldHeight, camera) вы указываете мировые координаты. Это означает, что область просмотра будет рисовать эту заданную часть мира, несмотря ни на что.

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

Мы еще не установили границы экрана, поэтому давайте сделаем это:

vp.setScreenBounds(Gdx.graphics.getWidth() / 2, 0, Gdx.graphics.getWidth() / 2, Gdx.graphics.getHeight());

Здесь это спрашивает screenWidth а также screenHeight которые представляют координаты экрана. Поскольку все используют разные экраны, мы получаем их от самой графики. Вы можете иметь одно предположение, где он рисует область просмотра;).

В любом случае это окно просмотра new FitViewport(1920 / 2, 1080) всегда будет оказывать 960 X 1080 моего мира на правой половине экрана.

Если мой мир .9f x 1.6f большой, то я мог бы начать VP, как это new FitViewport(.9f, 1.6f, camera),

PS: не забудьте применить ПО в render() прежде чем начать рисовать.

Другие вопросы по тегам