Я использовал эту стратегию для пиксельной графики с низким разрешением. Я рисую в небольшой FrameBuffer с разрешением 1:1, а затем рисую его на экране. Это должно позаботиться о дрожании.
Если ваша сцена также имеет такое же разрешение, вам придется использовать небольшой хак, чтобы обеспечить правильную обработку ввода. Тот, который я использовал для использования StretchViewport, но я вручную вычисляю ширину и высоту мира, чтобы не растягивать мир, поэтому я в основном делаю те же вычисления, что и ExtendViewport за кулисами. Вы также должны округлить до целого числа ширину и высоту. Вы должны сделать это в resize
и применить ширину и высоту, используя viewport.setWorldWidth()
и setWorldHeight()
. Таким образом, в этом случае не имеет значения, какой размер мира вы задаете конструктору, поскольку он будет изменен в update()
.
Когда вы вызываете update
в окне просмотра в resize
, вам нужно делать это в контексте FrameBuffer, в который вы рисуете. В противном случае это испортит размеры буфера кадров экрана.
public void resize(int width, int height) {
int worldWidth = Math.round((float)WORLD_HEIGHT / (float)height * (float)width);
viewport.setWorldWidth(worldWidth);
viewport.setWorldHeight(worldHeight);
frameBuffer.begin();
viewport.update(width, height, true); // the actual screen dimensions
frameBuffer.end();
}
Вы можете посмотреть примеры использования FrameBuffer в LibGDX. Вы должны делать все отрисовки в игре между frameBuffer.begin()
и end()
, а затем отрисовывать цветовой буфер frameBuffer на экран следующим образом:
stage.act();
frameBuffer.begin();
//Draw game
stage.draw();
frameBuffer.end();
spriteBatch.setProjectionMatrix(spriteBatch.getProjectionMatrix().idt());
spriteBatch.begin();
spriteBatch.draw(frameBuffer.getColorBufferTexture(), -1, 1, 2, -2);
spriteBatch.end();
В моем случае я делаю более сложный расчет ширины и высоты мира, чтобы они представляли собой целочисленный множитель фактических размеров экрана. Это предотвращает разный размер больших пикселей на экране, что может плохо выглядеть. Кроме того, вы можете изменить фильтрацию текстуры FrameBuffer на линейную и использовать масштабирующий шейдер при ее рисовании.
person
Tenfour04
schedule
28.01.2020