Избили управление игровым пространством? - PullRequest
2 голосов
/ 02 ноября 2009

Я нахожусь в процессе создания своего 2D движка для игры Beat'em Up (Castle Crashers - это то, что я называю игрой типа Beat'em Up или Brawler).

Я буду поддерживать 2D-спрайты и 2D-эмиттеры частиц. Это все сделано в двигателе сейчас. Но я пришел к вопросу, к которому хотел бы обратиться за советом:

Речь идет о «космическом» управлении. Я подумал, что нужно что-то сделать, как показано на этом изображении:

альтернативный текст http://img337.imageshack.us/img337/9162/spacingprototype1.png

Моя идея состоит в том, чтобы создать сетку (Пространственный хэш или сетку) из земли, где будут жить мои спрайтеры частиц / 2D-спрайты. На моей картинке я перечислил эти слоты от 1 до N (не должно быть 35, это просто для демонстрации целей). Моя идея состоит в том, чтобы нарисовать «GameElements» (спрайты / эмиттеры) в порядке от 0 до N (переходя от сегмента 0 к сегменту N), поэтому я заставлю их правильно отображаться на экране (обратно). 1010 *

Я знаю, что это можно сделать, просто сравнив нижнюю ось Y каждого элемента и выполнив "быструю сортировку", но наличие сетки может позволить мне лучше выполнять обнаружение столкновений, и если я сделаю что-то вроде A * чтобы реализовать какой-то ИИ, это тоже может мне помочь.

Ответы [ 3 ]

5 голосов
/ 02 ноября 2009

Если вы хотите провести некоторую оптимизацию для количества объектов, которые вы хотите проверить друг против друга, вы можете подумать об использовании Quadtree http://en.wikipedia.org/wiki/Quadtree

Идея состоит в том, чтобы разделить экран на 4 узла, разместив все элементы в узле, которому они принадлежат, а затем разделить узлы, которые вы только что создали, еще на 4, если там есть спрайты / элементы / все, что нужно проверить , Продолжайте делать это, пока не будет достигнут определенный размер или количество элементов в узле.

Затем вы можете спросить верхний узел, содержит ли он элемент, который вы хотите проверить. Затем этот узел спросит дочерние узлы, содержит ли он элемент, который, в свою очередь, спросит своих детей. Таким образом, большая часть экрана уже может быть пропущена (если она находится в дочернем элементе 00, вы можете пропустить дочерний элемент 01, 10 и 11). Затем вы получите список элементов, для которых вы выполняете более конкретное обнаружение столкновений, когда это необходимо.

Если бы вы сделали это визуально, это выглядело бы примерно так:

альтернативный текст http://geodata.ethz.ch/geovite/tutorials/L2GeodataStructuresAndDataModels/en/images/quadtree.gif

1 голос
/ 02 ноября 2009

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

Гораздо более простой метод - иметь одну коллекцию всех спрайтов. В нем должны храниться все спрайты, отсортированные по их координатам z (от задней части экрана в начале списка до передней части экрана сзади). Переберите коллекцию и нарисуйте каждый спрайт так, как он выглядит. Когда спрайт перемещается в экран или выходит из него (т. Е. Изменяется его координата z), вы можете выполнить очень простую сортировку, чтобы переместить этот отдельный спрайт в коллекцию. Обменивайте его следующим спрайтом в списке, пока координата z следующего спрайта не станет больше / меньше (в зависимости от ситуации) координаты измененного спрайта.

1 голос
/ 02 ноября 2009

Запустите их в Z-буфер и позвольте этому беспокоиться.

Если вы обнаружите, что в будущем он слишком медленный (очевидно, с помощью профилирования), тогда посмотрите на его оптимизацию.

Возьмите самое простое решение и двигайтесь дальше.

...