Порядок рендеринга текстур в LibGDX

Я портирую игру с iOS и Windows Phone на Android. Большая часть кода, которым я следую для порта, взята из версии для Windows Phone, просто потому, что она больше всего похожа на Java. Мой вопрос относится к классу OrthographicCamera в LibGDX.

Я использую метод контейнера Game Object as Component для этой игры. Об этом можно прочитать здесь: http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/ просто чтобы вы поняли, о чем я говорю. Таким образом, почти все в игре расширяет класс компонентов Component. И каждый игровой объект, то есть мяч, представляет собой GameObject, который состоит из компонентов, то есть Sprite, RigidBody (для физики), Transform2 (положение, вращение и т. д.). Сюда входит класс Camera2, который просто обертывает член OrthographicCamera.

У меня есть две проблемы, и я исследую их без конца. Я не могу понять, как сделать слои. В игре есть ящик, который пользователь может открыть, проведя пальцем вниз. Это должно быть поверх всего остального в игре. Парень, разработавший версию XNA, добился этого, имея несколько пакетов SpriteBatch и рассматривая каждый пакет SpriteBatch как слой. Это не работает в LibGDX, и использование нескольких SpriteBatches является плохой практикой. Проблема в том, что игровые объекты организованы в виде дерева и отображаются в соответствии с обходом дерева, поэтому порядок в конечном итоге зависит от того, когда объект был вставлен в дерево. Я изучил DecalBatch, чтобы использовать порядок Z, но это потребовало бы значительного рефакторинга, так как игра почти готова. Как я уже сказал, я пытался использовать несколько SpriteBatches, но по какой-то причине это тоже не работает.

Поскольку это уже длинный пост, я задам свой второй вопрос в отдельном посте.


person weaverx9x9    schedule 06.08.2012    source источник
comment
Вы используете Stage? Затем вы можете создать еще одну сцену или добавить что-то в окно вашей сцены.   -  person Matsemann    schedule 07.08.2012
comment
На самом деле я связался с Марио (одним из ведущих разработчиков LibGDX) по поводу материала Scene2D (на котором построена сцена), и он сказал, что я не должен использовать его ни для чего, кроме элементов пользовательского интерфейса или очень простой игры. Но это может быть идея, может быть, просто использовать Stage для ящика. Я посмотрю на это.   -  person weaverx9x9    schedule 07.08.2012
comment
Я думаю, что добавление Stage на этом этапе было бы слишком сложным. Я думаю, что это сработает, но потребует рефакторинга. Я нашел список дел для LibGDX в коде Google, и они добавили z-порядок к спрайтам. Он входит в список MUSTS for 0.9. Хотя не думаю, что это уже сделано.   -  person weaverx9x9    schedule 07.08.2012
comment
Да, не добавляйте этапы сейчас, если вы их еще не используете. Мое предложение было просто «если» вы использовали этапы.   -  person Matsemann    schedule 07.08.2012
comment
Да, я думал об этом, это звучало как то, что мне нужно, но Марио сказал, что этого недостаточно для полноценной игры.   -  person weaverx9x9    schedule 07.08.2012


Ответы (1)


Я понял это. Я отправил Марио из LibGDX сообщение, и он предложил мне отсортировать объекты непосредственно перед их рендерингом. Я не совсем понял, как это сделать, так как это в дереве, я знаю, как сортировать дерево, но порядка там нет. Я добавил поле для слоя и сделал класс GameObject реализацией Comparable, затем в методе приема шаблонов посетителей я сортирую все эти дочерние узлы в соответствии с их слоем. Теперь он работает отлично.

person weaverx9x9    schedule 09.08.2012
comment
Остерегайтесь, это может иметь огромные последствия для производительности, если у вас есть множество мелких объектов. - person Oliver Dixon; 30.12.2014