Делаю тайловую игру в Action Script 3/Starling.
Предположим, у меня есть такой сценарий:
+----+----+----+----+----+
| | | | | | 0th row - highest
+----+----+----+----+----+
| | | | | |
+----+----+----+----+----+
| | | | | |
+----+----+----+----+----+
| | | | | | 3rd row - lowest
+----+----+----+----+----+
В этом примере у меня есть сценарий плитки 5x4. В реальном игровом процессе у меня будет сценарий размером 100x100 плиток.
Эта квадратная карта предназначена для ролевой игры, где каждый квадрат может быть занят объектом или персонажем. Объекты могут быть похожи на деревья, которые высоки и могут скрывать объекты за собой.
Ключевым понятием здесь является "скрытие объектов сзади", и чем больше номер строки, тем "ближайшей" к экрану она будет, а если номер строки N, то будут скрыты строки от 0 до N-1 (на самом деле "перекрываются") объектами слоя N (пример: если персонаж стоит на позиции (x=1,y=2) с высотой 2, а дерево стоит на позиции (x=1,y=3) ), дерево будет полностью перекрывать символ «выше».
Я подумал о возможной альтернативе:
Если у меня есть текущий спрайт Starling (который был создан самим Starling, передающим свой класс конструктору Starling), и создаю один спрайт (подспрайт) для каждой строки, присоединяя его к родительскому спрайту:
private var rows:Vector.<Sprite> = null;
public function createMapRows(nRows:int) {
this.rows = new Vector.<Sprite>();
for(var r:int = 0; r < nRows; r++) {
this.addChild(new Sprite());
}
}
Если персонаж перемещается влево или вправо, он останется на том же слое. Если персонаж движется вверх, я мог бы переместить игрока из N-го созданного спрайта в (N-1)-й созданный спрайт, сохраняя его (X, Y) координаты И выполняя анимацию «движения вверх». Если персонаж движется вниз, я мог бы переместить игрока из N-го созданного спрайта в (N-1)-й созданный спрайт, сохраняя его (X, Y) координаты И выполняя анимацию «движение вниз».
Я считаю, что это сработает, но меня беспокоит один аспект: производительность.
Мой Вопрос: это лучший способ добиться этого в отношении производительности памяти? Или может быть лучшее решение, не связанное с проблемой N+1*? (На самом деле, если на первый вопрос есть ответ «НЕТ», я бы хотел альтернативу).
(* Нет, это не проблема N+1 с записями в базе данных :p, а количество спрайтов).