Я пишу 2D-платформерную игру, использующую Java для Android.Структура данных, используемая для платформы-платформы.
В настоящее время у меня есть все игровые объекты (за исключением аватара, хранится в массиве массива «Entity»
Entity[][]
Всякий раз, когда мне нужно кое-что проверить - например, что я буду рисовать на экран или для обнаружения столкновений - я просто захватываю небольшой радиус предметов вокруг аватара и делаю все, используя систему наследования и полиморфизма.
Проблема заключается в том, что это означает, что я могу поместить только одну сущность в определенную координату сетки. В большинстве случаев это было нормально, но теперь у меня есть движущиеся предметы (например, враги или движущиеся блоки), которые когда они сталкиваются, в конечном итоге удаляя друг друга, в основном они переписываются.
Какую структуру данных следует использовать? Я думал о чем-то вроде
ArrayList<Entity>[][]
Но это будет очень дорого, и трата памяти, так как повторяющиеся элементы являются исключением из правила.
Я также рассматривал возможность разделения движущихся объектов на свои собственные ArrayList
и прокручивание их всех, но это уродливое решение.
Значит, любые идеи о том, что я мог бы использовать? Я хочу что-то довольно быстро, но не слишком интенсивно с памятью.
Я использовал квадрат один раз (создавал симулятор силы тяжести N), но я понятия не имею, как использовать квадтри в этом контексте. В игре нет маленьких «экранов», а скорее большой непрерывный - или он просто загрузит более одного квадранта автоматически, а затем разрешит мне делать пространственный запрос для меньшего набора? Я понимаю это неправильно? – Haedrian
Для каждого объекта вы должны искать прямоугольник вокруг этого объекта для проверки на наличие конфликтов: http://gamedevelopment.tutsplus.com/tutorials/quick-tip-use-quadtrees-to-detect-licious-collisions-in-2d -space - gamedev-374. В качестве оптимизации вы можете сначала проверить, полностью ли ограничены границы в квадранте сущности в квадратном дереве (в этом случае вы просто используете этот квадрант как возможные сущности для столкновения). – creichen
Чтобы разработать: в отличие от того, что говорится в статье, вы можете использовать квадровое дерево в качестве своего эксклюзивного хранилища и удалять и повторно добавлять объекты, когда они пропускают границы квадранта. Или вы можете основываться на глобальном ArrayList и работать как предлагаемая статья. Но единственной точкой квадрового дерева является ускорение обнаружения столкновений, что также, вероятно, является единственной причиной того, почему вы использовали Entity [] [] в начале. –
creichen