Объркан с мащабирането и позиционирането на изображението в libgdx

Имам доста трудности да обхвана реалната страна на дисплея на нещата с libgdx. Тоест, просто изглежда доста объркано по отношение на това какво трябва да се направи, за да се постави нещо на екрана. Предполагам, че объркването ми може да бъде разделено на две части:

  1. Какво точно трябва да се направи по отношение на създаването на изображение? Има Texture, TextureRegion, TextureAtlas, Sprite, Batch и вероятно няколко други актива, свързани с изкуството, които ми липсват. Как всички те се свързват и свързват едно с друго? Каква е "производствената верига" сред тях, предполагам, че би било начинът да се изрази.

  2. По отношение на поставянето на каквото и да е създадено от нещата по-горе върху монитора или дисплея, как различните мерки за координати и оразмеряване се свързват и превеждат един към и от друг? Да кажем, че има някакво изображение X, което искам да поставя на екрана. ИТ има свой собствен набор от размери и координати, но има и размер на прозореца за изглед (има ли позиция на прозореца за изглед?) и позиция на камерата (има ли размер на камерата?). На всичкото отгоре има и общия размер на дисплея, който е от Gdx.graphics. Няколко примера за неща, които може да искам да направя, са следните:

    • X is my "global map" that is bigger than my screen size. I want to be able to scroll/pan across it. What are the coordinates/positions I should use when displaying it?
    • Y е по-голям от моя екран. Искам да го намаля и винаги да е в центъра на екрана/дисплея. Какъв коефициент на мащабиране използвам тук и кои координати/позиции?
    • Z е по-малък от моя екран. Искам да го залепя в горния ляв ъгъл на моя екран и да го накарам да се „залепи“ към глобалната карта, която споменах по-рано. Коя система за позициониране използвам?

Съжалявам, ако това са били куп неща... Предполагам, че tl;dr на тази втора част е просто кой набор от позиции/координати, размери и мащаби трябва да направя всичко по отношение на?

Знам, че това може да е много, за да попитам наведнъж, и също така знам, че повечето от тези неща могат да бъдат намерени онлайн, но след като преглеждах урок след урок, изглежда не мога да получа точен отговор как всички тези неща се отнасят един към друг. Всяка помощ ще бъде оценена.


person GoldenGateGeek    schedule 05.07.2015    source източник


Отговори (2)


  • Текстурата е по същество необработените данни за изображението.
  • TextureRegion ви позволява да вземете по-малки области от по-голяма текстура. Например обичайна практика е да опаковате всички изображения за вашата игра/приложение в една голяма текстура (LibGDX „TexturePacker“ е отделна програма, която прави това) и след това да използвате региони от по-голямата текстура за вашата индивидуална графика. Това се прави, защото превключването на текстури е тежка и бавна операция и искате да сведете до минимум този процес.
  • Когато опаковате изображенията си в едно голямо изображение с TexturePacker, той създава файл „.atlas“, който съхранява имената и местоположенията на отделните ви изображения. TextureAtlas ви позволява да заредите файла .atlas и след това да извлечете оригиналните си изображения, които да използвате във вашата програма.
  • Sprite добавя възможности за позиция и цвят към текстурата. Забележете, че API за текстура няма методи за настройка/получаване на позиция или цвят. Спрайтовете ще бъдат вашите герои и други обекти, които всъщност можете да местите и позиционирате на екрана.
  • Batch/SpriteBatch е ефективен начин за рисуване на множество спрайтове на екрана. Вместо да прави извиквания за рисуване за всеки спрайт един по един, пакетът прави няколко извиквания за рисуване наведнъж.

И се надяваме, че не добавям към объркването, но друга опция, която наистина харесвам, е използването на класовете „Actor“ и „Stage“ над класовете „Sprite“ и „SpriteBatch“. Actor е подобен на Sprite, но добавя допълнителна функционалност за преместване/анимиране чрез метода act. Stage замества SpriteBatch, тъй като използва свой собствен вътрешен SpriteBatch, така че не е необходимо да използвате изрично SpriteBatch.

Има и цял набор от компоненти на потребителския интерфейс (таблица, бутон, текстово поле, плъзгач, лента за прогрес и т.н.), които са базирани на Actor и работят със Stage.

Не мога наистина да помогна с въпрос 2. Придържам се към базирани на потребителски интерфейс приложения, така че не знам най-добрите практики за работа с големи светове на игри. Но се надяваме, че някой по-запознат в тази област може да ви помогне с това.

person Tekkerue    schedule 05.07.2015
comment
Така че като цяло Actor + Stage е по-мощен от Sprite + SpriteBatch? Тъй като актьорите могат да имат свои собствени методи за актуализиране и други подобни? Да речем, че имам необработен .png файл, който бих искал да използвам в играта. Какъв точно би бил газопроводът? Атлас -› Регион -›Текстура -› Спрайт/Актор? - person GoldenGateGeek; 06.07.2015

Това беше твърде дълго за отговор като коментар, така че отговарям като друг отговор...

Мисля, че както Sprite/SpriteBatch, така и Actor/Stage са еднакво мощни, тъй като все още можете да анимирате и да се движите със Sprite/SpriteBatch, но с Actor/Stage се работи по-лесно. Сцената има два метода, наречени „действай“ и „рисувай“, което позволява на сцената да актуализира и рисува много лесно всеки актьор, който съдържа. Вие отменяте метода act за всеки от вашите актьори, за да посочите какъв вид действие искате да извърши. Потърсете няколко различни урока за сцена/актьор с примерен код и трябва да стане ясно как да го използвате.

Също така бях малко неправилен преди, че „Actor“ е еквивалентен на Sprite, защото Sprite включва текстура, но Actor сам по себе си няма никакъв вид графичен компонент. Има разширение на Actor, наречено „Image“, което включва Drawable, така че класът Image всъщност е еквивалентът на Sprite. Actor е основният клас, който предоставя методите за действие (или „актуализиране“), но не е необходимо да е графичен. Използвал съм Actors за други цели, като задействане на аудио звуци в определени моменти.

Atlas създава голямата текстура, съдържаща всички ваши png файлове и след това ви позволява да получите региони от нея за отделни png. Така че конвейерът за получаване на конкретна png графика ще бъде Atlas > Region > Sprite/Image. И двата класа Image и Sprite имат конструктори, които вземат регион.

person Tekkerue    schedule 10.07.2015