Запутался с масштабированием и позиционированием изображения в 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 добавляет к текстуре возможности положения и цвета. Обратите внимание, что у Texture API нет методов для установки/получения положения или цвета. Спрайты будут вашими персонажами и другими объектами, которые вы сможете перемещать и размещать на экране.
  • Batch/SpriteBatch — это эффективный способ рисования нескольких спрайтов на экране. Вместо того, чтобы выполнять вызовы отрисовки для каждого спрайта по одному, пакет выполняет несколько вызовов отрисовки одновременно.

И, надеюсь, я не усугубляю путаницу, но еще один вариант, который мне очень нравится, — это использование классов «Актер» и «Сцена» вместо классов «Спрайт» и «СпрайтБатч». Актер похож на Sprite, но добавляет дополнительные функции для перемещения/анимации с помощью метода акта. Сцена заменяет SpriteBatch, так как использует собственный внутренний SpriteBatch, поэтому вам не нужно явно использовать SpriteBatch.

Существует также целый набор компонентов пользовательского интерфейса (таблица, кнопка, текстовое поле, ползунок, индикатор выполнения и т. д.), которые основаны на Актере и работают со сценой.

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

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

Это было слишком долго, чтобы ответить в качестве комментария, поэтому я отвечаю в качестве другого ответа ...

Я думаю, что и Sprite/SpriteBatch, и Actor/Stage одинаково эффективны, так как вы все еще можете анимировать и перемещать с помощью Sprite/SpriteBatch, но с Actor/Stage легче работать. Сцена имеет два метода, называемые «действовать» и «рисовать», которые позволяют сцене очень легко обновлять и рисовать всех содержащихся в ней актеров. Вы переопределяете метод действия для каждого из ваших актеров, чтобы указать, какое действие вы хотите, чтобы он выполнял. Посмотрите несколько разных туториалов для Stage/Actor с примерами кода, и должно стать понятно, как его использовать.

Также я был немного неправ до того, что «Актер» эквивалентен Спрайту, потому что Спрайт включает в себя текстуру, а Актор сам по себе не имеет какой-либо графической составляющей. Существует расширение Актера под названием «Изображение», которое включает в себя Drawable, поэтому класс Image на самом деле эквивалентен Sprite. Актер — это базовый класс, предоставляющий методы для действия (или «обновления»), но он не обязательно должен быть графическим. Я использовал Актеров для других целей, таких как запуск звуковых сигналов в определенное время.

Atlas создает большую текстуру, содержащую все ваши png-файлы, а затем позволяет вам получать из нее области для отдельных png-файлов. Таким образом, конвейер для получения конкретной графики PNG будет Atlas > Region > Sprite/Image. Оба класса Image и Sprite имеют конструкторы, принимающие область.

person Tekkerue    schedule 10.07.2015