Итак, у вас длинный уровень с множеством объектов, и вы не хотите проверять линейно все из них, чтобы увидеть, что должно быть на экране. Вам нужно разбить ваши данные на куски и составить список этих кусков. Это напоминает мне 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);
}
}
Сначала вам нужно создать узлы, связанные в дереве, выбирая количество регионов в зависимости от вашего уровня. Затем вы записываете свои объекты в структуру и тщательно продумываете, как получить их позже:)