Старлинг - карта с квадратни плочки и позициониране

Създавам игра с плочки в Action Script 3 / Starling.

Да предположим, че имам сценарий като този:

+----+----+----+----+----+
|    |    |    |    |    | 0th row - highest
+----+----+----+----+----+
|    |    |    |    |    |
+----+----+----+----+----+
|    |    |    |    |    |
+----+----+----+----+----+
|    |    |    |    |    | 3rd row - lowest
+----+----+----+----+----+ 

В този пример имам сценарий с плочки 5x4. В реален геймплей ще имам сценарий с плочки 100x100.

Тази квадратна карта е за RPG игра, където всеки квадрат може да бъде зает от обект или герой. Обектите могат да бъдат като дървета, които са високи и биха скрили предметите зад себе си.

Ключовата концепция тук е „скриване на обекти отзад“ и колкото по-голям е номерът на реда, толкова „най-близо“ до екрана ще бъде той, а ако номерът на реда е 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

И, както споменахте преди, ако играчът тръгне на север или юг, просто добавете Child към Sprite на играча, така че Sprite на десния ред.

person SleepingMole    schedule 10.06.2015