Быстрый доступ к местоположению врагов в 2D-игре

Быстрый доступ к местоположению врагов в 2D-игре
Быстрый доступ к местоположению врагов в 2D-игре

У меня есть простая 2D игра, в которой есть квадраты, игрок (сиреневый) и враги (красный).

class Game {
  List<List<Square>> map;
  Player player;
  List<Enemy> enemies; ...

Моя проблема в том, что я не знаю, как лучше всего хранить координаты (int x, int y) врагов. Сейчас каждый враг содержит свои координаты.

class Enemy {
  int x;
  int y; ...

Если я хочу проверить, содержит ли квадрат (map[x][y]) врага, мне придется перебрать всех врагов в списке. Это не очень хорошо, потому что проверка наличия врага в квадрате выполняется в игре часто. Я мог бы попытаться использовать Map<Coordinate, Enemy> enemies, где ключом является координата врага, но тогда координата будет храниться в двух местах, и это может создать некоторые раздражающие ошибки.

Как мне организовать код, чтобы я мог легко и быстро получить доступ к координатам врага и проверить, есть ли в квадрате враг? Плохая ли это идея - хранить местоположение врага в классе врага? Какие-нибудь архитектурные/дизайнерские паттерны, которые могли бы мне помочь?

Для доменов такого типа нередко требуется двунаправленный поиск:

  • быстрый доступ к координатам врага (или вообще любой фигуры)

  • быстро определить, какая часть находится на заданной координате.

Следовательно, ваша идея использовать дополнительную карту (вместе с хранением пары координат внутри врага) хороша. Вам нужно убедиться, что в вашем коде будет только одно место, которому разрешено изменять координаты фрагмента, и этот код всегда синхронно обновляет как координаты фрагмента, так и содержимое карты. Это поможет держать под контролем избыточность и избежать упомянутых вами «раздражающих ошибок».

Конечно, то, что писали другие о переносе координат из класса enemy, тоже возможно. Хотя это и не решает описанную проблему напрямую, но может помочь сделать реализацию замены координат в одном месте более жесткой.


LetsCodeIt, 18 января 2023 г., 17:40