В двухмерной игре на основе плиток, как NPC и плитки должны ссылаться друг на друга?

9

Я делаю движок плиток для 2D-игр сверху вниз. В основном мир состоит из сетки плиток.

Теперь я хочу поставить, например, NPC, которые могут двигаться на карте.

Что вы считаете лучшим:

  1. каждая плитка имеет указатель на NPC, который находится на ее плитке, или NULL-указатель
  2. иметь список NPC, и у них есть координаты плитки, на которой они находятся.
  3. что-то другое?

Я думаю

  1. быстрее для обнаружения столкновений, но он будет использовать гораздо больше места в памяти и медленнее, чтобы найти всех NPC на карте.
  2. это наоборот.
lezebulon
источник

Ответы:

11

Почему не оба? Бывают моменты, когда вы захотите посмотреть, есть ли какой-нибудь NPC на конкретной плитке (например, для обнаружения столкновений, как вы упомянули), и в других случаях, когда вы захотите перебрать всех NPC в мире ( например, для запуска их методов AI каждый кадр).

Указатель на плитку - это не так много памяти, если вы не работаете на платформе с ограниченным объемом памяти или у вас действительно огромная карта.

Натан Рид
источник
5
+1 Я склонен согласиться с этим, однако @lezebulon, я предлагаю вам инкапсулировать любую логику, которая должна обновлять оба вместе, как можно раньше. То есть, когда игрок покидает тайл, должна быть одна атомарная операция (вызов функции) для одновременного удаления указателей, игрока на тайл и тайл-игрока. И то же самое, когда игрок приходит на тайл, делайте два указателя вместе. Это спасет вас от потенциального хаоса, когда ссылки не согласуются друг с другом, то есть одна существует, а другая нет.
Инженер
0

Как вы справляетесь со столкновениями с картой? Если у вас есть слой столкновения, очень простым способом было бы сначала создать список NPC с координатами, указывающими, на каком плитке они находятся, а затем выполнить итерацию по этому списку и пометить плитку слоя столкновения под NPC как плитку столкновения. Таким образом, столкновения с неигровыми персонажами будут обрабатываться одновременно с остальной частью карты. Это, конечно, если неигровые персонажи не двигаются ...

Joona
источник