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