libGDX Рисовать видовой экран только частично, обрезая остальные - PullRequest
0 голосов
/ 04 марта 2020

Эта проблема казалась мне очевидной, но что бы я ни пытался, она не работает. То, что я пытаюсь сделать, это включить мини-версию моего PlayScreen в ScrollPane в качестве учебного пособия, где вы можете прочитать текст и сразу попробовать его.

Поскольку я не нашел лучшего решения, чтобы добавить это к Table внутри ScrollPane, я отредактировал метод draw() PlayScreen, чтобы взять ScrollPane.getScrollPercentY() и сместить камеру соответственно, PlayScreen.

Теперь я хочу визуализировать только часть области просмотра, которая обычно видна в реальной игре. Впоследствии я хочу иметь возможность контролировать размер и положение этого «окна».

libGdx Problem visualised

Я также хочу иметь возможность изменять размер и перемещать содержимое, обрезая края, которые не видны камере. Вот что я попробовал в PlayScreenDraw:

public void draw(final float yOffset,
                 final int xTiles,
                 final int yTiles) {
    view.getCamera().position.y = yTiles / 2f - yOffset * yTiles / HEIGHT; // HEIGHT = 800
    view.getCamera().position.x = xTiles / 2f;
    view.setWorldSize(xTiles, yTiles); //Do i even need to change the world size?
    b.setProjectionMatrix(view.getCamera().combined);

    b.begin();
    ...
    b.end();

    view.update(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
}

Что дает мне, с точки зрения картинки выше, это

libGDX Problem visualised 2

Как мне нужно изменить видовой экран и / или камеру? Кстати, вот как я настроил два:

cam = new OrthographicCamera();
cam.setToOrtho(false, WIDTH, HEIGHT); // WIDTH = 8, HEIGHT = 16
batch.setProjectionMatrix(cam.combined);
view = new FitViewport(WIDTH, HEIGHT, cam);

1 Ответ

1 голос
/ 04 марта 2020

Класс Pixmap может помочь вам достичь того, что вы хотите, так как вы заявили, что хотите «отрезать» части за пределами зеленого поля выбора.

Вам необходимо визуализировать то, что видит камера, в FBO, а затем получить растровое изображение от самого FBO.

Объекты Framebuffer являются объектами OpenGL, которые позволяют создавать пользовательские Framebuffers. С их помощью можно выполнять рендеринг в местоположения кадрового буфера, отличного от заданного по умолчанию, и, следовательно, выполнять рендеринг без нарушения основного экрана.

- OpenGL wiki

// Construct an FBO and keep a reference to it. Remember to dispose of it.
FrameBuffer fbo = new FrameBuffer(Format.RGBA8888, width, height, false);

public void render() {
//Start rendering to the fbo.
fbo.begin();
//From the camera's perspective.
batch.setProjectionMatrix(camera.combined);
batch.begin();

//Draw whatever you want to draw with the camera.

batch.end();
// Finished drawing, get pixmap.
Pixmap pixmap = ScreenUtils.getFrameBufferPixmap(0, 0, width, height);
//Stop drawing to your fbo.
fbo.end();
}

После получения растрового изображения вы можете перебирать пиксели и устанавливать альфа пикселей за пределами зеленого окна выбора на 0, делая их невидимыми или «обрезая их»

...