Starling - карта тайлов в квадрате и позиционирование

Делаю тайловую игру в 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, а количество спрайтов).


person Luis Masuelli    schedule 22.06.2014    source источник


Ответы (1)


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

Я бы сделал это так:

Базовый объект Sprite содержит все плитки земли, потому что они всегда находятся под всем остальным. Кроме того, я бы сделал спрайт, заполненный всеми объектами этой строки.

Clouds
Row 0 objects
Row 1 objects
Row 2 objects <-- player is here at the moment
Row 3 objects
BaseLayer - ground tiles

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

person SleepingMole    schedule 10.06.2015