Когда в libGDX игре вы имеете дело с различными экранами, то часто для определенной стратегии необходимо решить, как будут обрабатываться эти экраны.
Camera и Stage поддерживают разные стратегии для окна просмотра, например, когда используется метод Camera.project(vec, viewportX, viewportY, viewportWidth, viewportHeight).
libGDX предоставляет более удобный способ решения этой проблемы, а именно с помощью разных окон просмотров – Viewport.
StretchViewport
StretchViewport поддерживает работу с виртуальным размером экрана. Это означает предположение о том, что размер экрана всегда virtualWidth и
virtualHeight. Виртуальное окно просмотра будет всегда растягиваться до размеров экрана. Черных полос не будет, но соотношение сторон может быть не
одинаковыми после масштабирования.
FitViewport
FitViewport тоже поддерживает виртуальный размер экрана. В отличие от StretchViewport, будет всегда сохранять соотношение размера виртуального экрана
(виртуального окна просмотра), при масштабировании стремится к максимально возможному соответствию экрана. Одним из недостатков такой стратегии является
возможное появление черных полос.
FillViewport
FillViewport сохраняет соотношение сторон виртуального размера экрана, но в отличие от FitViewport, будет всегда заполнять весь экран, что в результате
может приводить к тому, что некоторые части окна просмотра будет обрезаны.
ScreenViewport
ScreenViewport не имеет постоянного виртуального размера экрана. Окно просмотра всегда будет соответствовать размеру экрана, что означает отсутствие
масштабирование и черных полос. Недостатком является возможное изменение игрового процесса, так как игрок с большим экраном может видеть в игре больше,
чем игрок с меньшим размером экрана.
ExtendViewport
ExtendViewport сохраняет соотношение сторон игрового мира без черных полос, расширяя мир в одном направлении. Сначала масштабируется мир по размеру окна
просмотра, затем короткий размер удлиняется до заполнения окна просмотра.
Максимальное значение размерностей может подаваться в ExtendViewport, в этом случае, черные полосы будут видны, когда соотношение сторон выходит из-за
поддерживаемого диапазона.
CustomViewport
Различные стратегии могут быть реализованы с помощью наследования CustomViewport extends Viewport и реализации calculateViewport(width, height) метода.
Другой подход заключается в использовании ScalingViewport и применении масштабирования, которого нет в других окнах просмотра. Одним из примеров может
быть использование Scaling.none, что приведет к "StaticViewport", которое всегда сохраняет тот же размер. Это может выглядеть следующим образом:
Использование
В libGDX окно просмотра всегда управляет viewportWidth и viewportHeight камеры. Таким образом, камера должна передаваться в конструктор окна просмотра.
private Viewport viewport;
private Camera camera;
public void create() {
camera = new PerspectiveCamera();
viewport = new FitViewport(800, 480, camera);
}
Всякий раз, когда в libGDX происходит событие изменения размера, окно просмотра должно быть проинформировано об этом и обновлено. Параметры окна просмотра будут автоматически пересчитаны, а камера обновлена:
public void resize(int width, int height) {
viewport.update(width, height);
}
Кроме того, изменится окно просмотра OpenGL через glViewport() и будут добавлены черные полосы, если это необходимо, делая невозможным визуализацию в
области черных полос. В случае появления черных полос для определенной стратегии, окно просмотра OpenGL может быть установлено в стандартный размер и
окно просмотра может запросить размер черных полос с помощью методов Viewport.getLeftGutterWidth() и Viewport.getRightGutterWidth(). Для примера того, как это
сделать, смотрите тест. Это может выглядеть следующим образом (с соответствующим приграничным изображением)
Класс Viewport предоставляет удобные project(), unproject() и getPickRay() методы, которые используются текущим окном просмотра для корректного выбора, как вам
конвертировать координаты игрового мира и экрана.
Когда используется Stage, его окно просмотра необходимо обновлять при сообщении об изменении размеров.
private Stage stage;
public void create() {
stage = new Stage(new StretchViewport(width, height));
}
public void resize(int width, int height) {
// используйте true для центровки камеры
stage.getViewport().update(width, height, false);
}
Чтобы увидите разные libGDX окна просмотра в действии, посмотрите тесты: ViewportTest1, ViewportTest2 и ViewportTest3.
Комментариев нет:
Отправить комментарий