Разрешение Независимости в libGDX

22

Как сделать независимым разрешение / плотность игры libGDX? Есть ли способ указать размеры изображения как «абсолютные» независимо от базовой плотности?

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

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

То, что я сейчас делаю, что кажется очень неправильным, - это просто создавать изображения, подходящие для больших разрешений, а затем уменьшать (или редко), чтобы соответствовать размеру экрана. Кажется, это работает нормально (в настольной версии), даже с линейным отображением на моих текстурах, но меньшие разрешения выглядят ужасно.

Кроме того, это, кажется, идет вразрез с «независимыми от устройства пикселями» Android (DP). Или, может быть, я что-то упускаю и libGDX уже как-то об этом заботится?

Какой лучший способ справиться с этим? Я нашел эту ссылку; это хороший способ решения проблемы ?: http://www.dandeliongamestudio.com/2011/09/12/android-fragmentation-density-independent-pixel-dip/

В нем упоминается, как управлять изображениями, но не упоминается, как указывать размеры шрифта / изображения независимо от плотности.

ashes999
источник
Возможно связано? gamedev.stackexchange.com/questions/34/…
thedaian
@thedaian не совсем. Это о разрешении; Меня больше беспокоит взаимодействие между плотностью и разрешением.
ashes999

Ответы:

12

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

float densityIndependentSize = origFontSize * Gdx.graphics.getDensity();
int fontSize = Math.round(densityIndependentSize );
BitmapFont font = generator.generateFont(fontSize );
Pascalius
источник
Моя дискуссия касается как изображений, так и шрифтов. +1 для динамического рендеринга шрифта, хотя (я делаю это уже).
ashes999
10

Чтобы добиться этого в libgdx, вы можете использовать «orthographicCamera» там, где вы назначаете размер, который вы хотите использовать, и в каждом разрешении вы можете видеть все ваши изображения, масштабированные до этого размера (я использую 800X480, потому что это больший экран в Android ) и это хорошо работает :)

public class GameStage extends Stage 
{ 
     public GameStage(float width, float height, boolean stretch) 
     { 
          this.camera = new OrthographicCamera(800, 480);
          this.camera.position.set(800/2, 480/2, 0f); 
     } 
}
Rudy_TM
источник
Могу ли я получить пример кода, пожалуйста?
ashes999
Это код, и вы создаете класс, который реализует интерфейс Screen, в конструкторе, который вы строите свой этап, и в методе рендеринга вы помещаете stage.draw (). Если вы не хотите использовать этапы, вы можете объявить переменную в реализованном в Screen классе класса Camera и сделать то же самое, что и в этапе, но в методе рендеринга вы применяете обновление к камере.
Rudy_TM
Это на самом деле работает довольно хорошо.
you786 26.09.13
4

Я считаю, что Android-«пиксели, не зависящие от устройства» - это всего лишь измерительная палочка для классификации устройств, и на самом деле они недоступны в качестве визуализируемых пикселей. Таким образом, вы не пропустите ни одной волшебной инфраструктуры, решающей DPI. Насколько я понимаю современное состояние, вы обнаружили все варианты. Существует два основных подхода к работе с разными устройствами:

  1. Масштабирование уже существующих изображений в соответствии с фактическим DPI устройства.
  2. Выберите из множества предварительно масштабированных изображений во время выполнения на основе DPI.

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

То, что пытается сделать ваша конкретная игра, действительно может изменить то, какой подход имеет больше смысла. Например, если у вас есть экранное меню, вам нужно убедиться, что кнопки несколько кратны размеру кончика пальца (поэтому кнопку всегда легко нажимать, но она не больше, чем необходимо для большие устройства, такие как планшеты). В качестве альтернативы, если вы пытаетесь создать игру-головоломку, в которой вы хотите убедиться, что вся головоломка видна сразу, вам нужно масштабировать элементы так, чтобы они помещались на экране (например, с крестиками-ноликами) Возможно, вы захотите, чтобы каждый элемент занимал примерно 1/3 экрана).

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

Посетите Mario Zerchner's Beginning для Android для обсуждения проблем и некоторых решений. Обратите внимание, что Марио является автором libGDX, поэтому подход к книге отражает библиотеку libGDX (обратите внимание, что они не один к одному, книга посвящена написанию библиотеки, похожей на libGDX, но не самой libGDX).

PT
источник
Даже если я выберу из готовых коллекций изображений на основе DPI, я не понимаю, как я могу гарантировать, что «этот спрайт ДОЛЖЕН отображаться как 64x64».
ashes999
1
Я предполагал, что вы установили свою камеру OpenGL в соответствии с физическим дисплеем, поэтому 1 пиксель OpenGL соответствует 1 пикселю дисплея. В этот момент изображение 64x64 будет отображаться на экране как 64x64. Как указывает Rudy_TM, вы можете связываться с отображением камеры, чтобы получить масштабирование всего экрана.
PT
Хорошо, это похоже на "секретный соус", который я выбрал. Я проверю и дам вам знать, спасибо.
ashes999
0

Один из способов сделать это - определить минимальное соотношение сторон и максимальное соотношение сторон для вашей игры. Это будут соотношения, которые вы хотите поддерживать. Затем вам нужно использовать Viewport, который теперь предоставляется в libGdx. Окно просмотра будет масштабировать ваш мир в соответствии с вашими настройками.

Существует несколько типов видовых экранов, и вам нужно выбрать тот, который наиболее подходит для вашей игры.

Например, вы можете использовать ExtendViewport и фиксировать свою высоту или ширину и вычислять другое. Затем вам нужно убедиться, что вся графика видна с минимальным соотношением сторон. Расширенный видовой экран будет масштабировать вашу графику до правильного соотношения сторон без искажения графики. Однако ExtendViewport работает, добавляя дополнительное пространство в ваш мир, поэтому вы также должны предоставить графику для фонов, например, охватывающую весь ваш охват охватываемых соотношений сторон, когда мир меньше вашего максимального соотношения сторон, дополнительная часть графики не будет быть показано.

дил
источник