Лучший метод Z-заказа для игр на основе плиток, cocos2D-iPhone? - PullRequest
0 голосов
/ 24 января 2012

Я хочу делать изометрические игры для iPhone на основе плиток с cocos2D.

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

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

Алгоритм Z-буфера поддерживается графическим процессором и cocos2D, так что это то, что я хотел бы использовать, но есть проблема. Некоторые спрайты, например здания, занимают несколько тайлов. Присвоить значение Z таким спрайтам сложно.

Вот варианты, о которых я подумал:

  1. Сравнение двух зданий и определение того, какое из них "впереди", легко. Таким образом, здания могут быть отсортированы, а затем присвоить значение Z на основе порядок сортировки. Это ничем не отличается от картины художника. алгоритм. Буфер OpenGl ES Z не понадобится.
  2. Назначьте значение Z каждому зданию, основываясь исключительно на его расположении на карта (без знания того, где находятся другие здания). я найти это трудно. Я думаю, что это возможно, но я не был в состоянии придумать формулу еще.
  3. Используйте несколько спрайтов для изображений, которые занимают более одного тайла, поэтому все спрайты будут одинакового размера. Z заказов может быть легко назначается в зависимости от того, какую плитку занимает спрайт. Проблема с этим решением состоит в том, что это делает игровую логику намного более сложно. Все операции на одном здании должны быть повторяется для каждого спрайта, из которого состоит здание. Я бы хотел рассматривать каждый объект как единый объект.
  4. Изменить код cocos2D, чтобы спрайты имели несколько значений Z в разных точках. Если спрайт может иметь несколько значений Z на основе на какую плитку падает конкретная часть спрайта, затем вычисляется значение Z для этого раздела легко. Мне не нужно будет сравнивать спрайт на любые другие спрайты. Я считаю, что это возможно с помощью несколько квадов для каждого спрайта. Проблема в том, что это немного сложнее для меня, так как я новичок в OpenGL ES и cocos2D. я не совсем понимаю, как все внутренние структуры данных Работа. Хотя это кажется самым элегантным решением, если формула не может быть найден.

Я буду голосовать за любые предложения или ссылки на полезные ресурсы.

1 Ответ

1 голос
/ 07 декабря 2012

Для # 2 вы можете вычислить манхэттенское расстояние от центра объекта и использовать это значение в качестве значения z этого объекта.Это будет работать до тех пор, пока вы избегаете очень длинных объектов на вашей карте, таких как объект 5x1 или хуже.Но если вам действительно нужно поместить длинный объект на мозаичную карту, управление z-порядком объектов на карте путем установки z-значения с помощью формулы невозможно.

Чтобы доказать это:
1.) Поместите два объекта 2x2 на карту горизонтально и оставьте плитку между ними.
2.) Поместите объект 3х1 между ними.Давайте назовем объекты 2x2 для A и B, а объект 3x1 для C.
3.) Если вы просто вращаете C (не меняя свою позицию), z-порядок обмена A и B.

-Если B теперь впереди, некоторые объекты позади B будут находиться перед A из-за вращения C. И дорого знать, какие объекты позади A и B ранее стали перед Aпосле вращения С.

...