структура данных для игры с боковой прокруткой - PullRequest
3 голосов
/ 27 марта 2011

Мне было просто интересно, какую наилучшую структуру данных можно использовать для представления объектов данных в игре с боковой прокруткой, в основном то, что пользователь не видит, отсутствует на сцене, поэтому я обычно создаю собственный класс дляопределите его свойства (x, y, вес, тип, сумасшедший и т. д.), а затем вставьте его в массив, и по мере продвижения пользователя я проецирую информацию из массива, проверяя, подходит ли их позиция x.* Проблема, которая может возникнуть, заключается в том, что пользователь может перемещаться влево и вправо, так как лучше всего отслеживать индексы?

Спасибо

Ответы [ 2 ]

1 голос
/ 29 марта 2011

Итак, у вас длинный уровень с множеством объектов, и вы не хотите проверять линейно все из них, чтобы увидеть, что должно быть на экране. Вам нужно разбить ваши данные на куски и составить список этих кусков. Это напоминает мне Quadtrees , если ваш стрелок является линейным, ваше дерево становится одномерным и его проще реализовать.

Структуры, которые вы можете использовать:

Узел - содержит диапазон (xmin, xmax) и список дочерних узлов или листьев. Все узлы подключены к иерархической структуре, где корневым является весь игровой мир / уровень, корневыми потомками являются регионы, затем субрегионы и так далее. Количество уровней в дереве зависит от количества объектов.

Лист - также имеет диапазон, содержит объекты данных, соответствующие этому региону.

Когда вы построите это дерево, поиск объекта из заданного диапазона должен занять O (log N) времени.

РЕДАКТИРОВАТЬ: Я постараюсь проиллюстрировать это, чтобы сделать более ясным.

Если ваш уровень 1D, вам не нужно полное квадродерево, только линейное дерево:

                  root node, xmin = 0, xmax = 1000
                   contains list of regions:
                  /   |   \
                 /    |    \
    region 1,         |     \
xmin = 0, xmax = 300  |      \
                      |       \
                region 2,      \
              xmin = 301,       \
              xmax = 650         region 3, xmin = 651, xmax = 1000
                                  |                   |
                   Leaf, xmin = 652, xmax = 850       |
                   list of objects                 Leaf, xmin = 851, xmax = 1000
                   in that range                   list of objects

public class GameObject
{
    public var x:Number;
    //other stuff
}

public class Node {
    public var xmin, xmax:Number;
    public var children:Vector.<Node>;

    public function writeObject(object:GameObject):void
    {
        for each (var node:Node in children)
        {
            //find node with corresponding range
            if (node.xmin > object.x && node.xmax <= object.x)
            {
                node.writeObject(object);
                return;
            }
        }
        throw new Error("Children not found!");
    }

    public function findObjects(xmin:Number, xmax:Number):Vector.<GameObject>
    {
        //there comes the tricky part
        //1. build list of leaves in that range
        //2. filter first and last leaf (they may be only partially in the range)
        //3. copy objects from leaves between first and last as is
        //4. return list of objects
    }
}

public class Leaf extends Node {
    private var objects:Vector.<GameObject>;

    public function writeObject(object:GameObject):void
    {
        objects.push(object);
    }
}

Сначала вам нужно создать узлы, связанные в дереве, выбирая количество регионов в зависимости от вашего уровня. Затем вы записываете свои объекты в структуру и тщательно продумываете, как получить их позже:)

0 голосов
/ 27 марта 2011

Когда вы говорите «информация о проекте из массива», что вы имеете в виду? Вы хотите показать эту информацию игроку или вы просто хотите, чтобы она была доступна для использования? Если вы просто хотите, чтобы это было доступно:

Если вам нужно было отслеживать индексы массива, вы могли бы выполнить какое-либо сопоставление элементов - проработайте массив, чтобы найти первый элемент, отображаемый на экране, а затем добавьте к нему число объектов на экране. номер, чтобы найти последний элемент. Однако для этого потребуется отслеживать отображаемые элементы, возможно, с помощью логического значения внутри вашего пользовательского класса.

Однако, подумав, нужно ли вам следить за индексами? Если игрок может двигаться вперед или назад, и на экране может быть переменное число объектов, может быть лучше перебрать весь массив в каждом кадре и проверить допустимые значения x / y; если x / y находятся в пределах границ сцены, отобразить объект. Используя этот метод, вы можете легко отобразить элемент [2] и элемент [89] на экране, даже если промежуточные значения пропали. (Например, если они прокручиваются за пределами экрана, но элемент [2] следовал за персонажем игрока, таким образом, оставаясь на экране.) Таким образом, вам не нужно беспокоиться о клавишах массива и перемещении влево / вправо. В принципе ...

//psuedocode.
for each in Array {
   if {x/y aren't valid) don't display;
   else display;
}

Использование вектора для хранения ваших объектов сделает это еще быстрее, если все ваши объекты относятся к одному типу (или наследуются от одного типа).

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

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