Лучший метод заказа Z для на основе плитки, Cocos2D-iPhone игры?

StackOverflow https://stackoverflow.com/questions/8979369

Вопрос

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

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

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

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

Это параметры, о которых я думал:

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

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

Это было полезно?

Решение

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

Чтобы доказать это:

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

-IF B теперь впереди, некоторые объекты за B будут перед собой из-за только вращения C., и это дорого, чтобы знать, какие объекты в обратной стороне как a и b ранее станут передПосле вращения С.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top