Незалежність роздільної здатності в libGDX


22

Як зробити свою роздільну здатність / щільність гри libGDX незалежною? Чи є спосіб визначити розміри зображення як "абсолютні" незалежно від основної щільності?

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

Оскільки це проста дитяча гра, мені не потрібно турбуватися про "граючу область" гри; Я хочу використовувати якомога більше простору екрану.

Що я зараз роблю, що здається супер некоректним, - це просто створити зображення, придатні для великих роздільних можливостей, а потім змінити масштаб вниз (або рідко вгору), щоб відповідати розміру екрана. Це, здається, працює нормально (у настільній версії), навіть при лінійному зіставленні моїх текстур, але менші роздільні здатності виглядають некрасиво.

Крім того, це, здається, летить перед обличчям Android "незалежних пікселів" (DP). А може, мені чогось не вистачає, і libGDX вже якось опікується цим?

Який найкращий спосіб вирішити це? Я знайшов це посилання; це хороший спосіб вирішення проблеми ?: http://www.dandeliongamestudio.com/2011/09/12/android-fragmentation-density-independent-pixel-dip/

Він згадує, як керувати зображеннями, але не згадує, як вказати розміри шрифту / зображення незалежно від щільності.


Можливо, пов’язані? 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 );

Моя дискусія стосується зображень, а також шрифтів. +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); 
     } 
}

Чи можу я отримати зразок коду, будь ласка?
ashes999

Це код, і ви створюєте клас, який реалізує інтерфейс Screen, в конструкторі ви будуєте свій етап, а в методі візуалізації ви ставите stage.draw (). Якщо ви не хочете використовувати Етапи, ви можете оголосити змінну в класі, реалізованій на екрані типу Camera, і зробити те саме, що і в Stage, але в методі візуалізації ви застосуєте оновлення до камери.
Rudy_TM

Це насправді працює досить добре.
you786

4

Я вважаю, що "незалежні пікселі" від Android - це лише вимірювальна палиця для класифікаційних пристроїв, і насправді вони не доступні як пікселі, що роздаються. Тож ви не пропустите жодної магічної інфраструктури вирішення DPI. Наскільки я розумію тут сучасний стан, ви відкрили всі варіанти. Існує два основних підходи для роботи з різними пристроями:

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

Звичайно, ви можете виконати деяку суміш цих двох (вибравши приблизно точне зображення, а потім змінити його масштаб), або використовувати різні підходи для різних елементів вашого інтерфейсу (наприклад, попередні зображення для шрифтів / тексту та динамічне масштабування для ігрового процесу спрайт).

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

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

Ознайомтеся з початковими Android-іграми Mario Zerchner, щоб ознайомитись із проблемами та деякими рішеннями. Зауважте, що Маріо є автором libGDX, тому підхід до книги відображає лібGDX (зауважте, що вони не один-до-одного; книга охоплює написання бібліотеки, подібної до libGDX, але не libGDX сама).


Навіть якщо я вибираю з готових колекцій зображень на основі DPI, я не бачу, як я можу гарантувати, що "цей спрайт ОБОВ'ЯЗКОВО відображатиметься як 64x64".
ashes999

1
Я припускав, що ви встановите свою камеру OpenGL відповідно до фізичного дисплея, тому 1 піксель OpenGL відображається на 1 піксельний дисплей. У цей момент на екрані відображатиметься зображення 64х64 як 64х64. Як вказує Rudy_TM, ви можете зіпсуватись із картою карти, щоб отримати масштаб на весь екран.
PT

Гаразд, це схоже на "секретний соус", який я був після. Я перевірю і повідомлю вас, дякую.
ashes999

0

Один із способів зробити це - визначити мінімальне співвідношення сторін і максимальне співвідношення сторін для вашої гри. Це будуть співвідношення, які ви хочете підтримати. Тоді вам потрібно використовувати Viewport, який зараз надається у libGdx. Вікно перегляду буде масштабувати ваш світ відповідно до наданих вами налаштувань.

Існує кілька типів вікон перегляду, і вам потрібно вибрати той, який найбільш підходить для вашої гри.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.