Libgdx - разделение экрана и невозможность изменить положение области просмотра - PullRequest
0 голосов
/ 14 марта 2020

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

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

  • игровой процесс, который занимал бы около 70% пространства экрана,
  • оборудование персонажей,
  • чат.

Но я все еще не могу установить положение области просмотра. Давайте скажем, как я понимаю концепцию области просмотра и камеры. Если я ошибаюсь, пожалуйста, передумайте.

Камера решает, какую часть мира следует увидеть в данный момент. Например, у меня есть изображение размером 500x500px, если размер мира зафиксирован на 200x200px, тогда я вижу только часть изображения размером 200x200px.

Окно просмотра - это элемент, отвечающий за перевод изображения с камеры для фиксированного «окна». Например, если в настоящее время камера показывает часть 200x200px, то область просмотра может масштабироваться до фиксированного размера (например, во весь экран).

Если я правильно понимаю эти концепции, я пытаюсь установить размер области просмотра игрового процесса равным 70% от ширина экрана и высота, и он работает нормально. Благодаря этому я вижу свой мир выше указанного размера. Проблема начинается, когда я хочу переместить окно просмотра игрового процесса в левый верхний угол, используя метод ViewPort.setScreenPosition . Вызов функции не влияет на позицию просмотра игрового процесса.

Ниже приведен код моего прототипа.

public class MyGdxGame extends ApplicationAdapter {
    private static final int WORLD_WIDTH = 250;
    private static final int WORLD_HEIGHT = 250;
    private SpriteBatch spriteBatch;
    private Texture texture;
    private OrthographicCamera gameplayCamera;
    private Viewport gameplayViewPort;

    @Override
    public void create() {
        spriteBatch = new SpriteBatch();
        texture = new Texture("life.png");

        gameplayCamera = new OrthographicCamera();
        gameplayCamera.translate(gameplayCamera.viewportWidth / 2.0f, gameplayCamera.viewportHeight / 2.0f);

        gameplayViewPort = new ExtendViewport(WORLD_WIDTH, WORLD_HEIGHT, gameplayCamera);
        gameplayViewPort.setScreenPosition(0, Gdx.graphics.getHeight() / 4);
        gameplayViewPort.apply();

        gameplayCamera.position.set(WORLD_WIDTH / 2.0f, WORLD_HEIGHT / 2.0f, 0);
    }


    @Override
    public void render() {
        Gdx.gl.glClearColor(1, 0, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        gameplayCamera.update();
        spriteBatch.setProjectionMatrix(gameplayCamera.combined);

        spriteBatch.begin();
        spriteBatch.draw(texture, 0, 0);
        spriteBatch.end();
    }

    @Override
    public void resize(int width, int height) {
        gameplayViewPort.update(width * 3 / 4, height * 3 / 4);
        gameplayCamera.position.set(width / 2.0f, height / 2.0f, 0);
    }

    @Override
    public void dispose() {
        texture.dispose();
    }
}

Надеюсь, вы знаете какое-либо правильное решение для моей проблемы и, возможно, оно вообще не связано с манипулированием областями просмотра. ;)

Ожидаемый эффект

1 Ответ

0 голосов
/ 14 марта 2020

Я прошелся по документации libgdx и нашел раздел о множественных окнах просмотра. https://github.com/libgdx/libgdx/wiki/Viewports

После добавления строки

viewport.apply().

в методе рендеринга вместо метода create все начинает работать правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...