Як у 2D грі на основі плитки, як NPC та плитки повинні посилатися один на одного?


9

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

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

Що ви вважаєте найкращим:

  1. кожна плитка має вказівник на NPC, який знаходиться на її плитці, або на NULL
  2. мають список NPC, і вони мають координати плитки, на якій вони знаходяться.
  3. щось ще?

я думаю

  1. швидше для виявлення зіткнень, але він би зайняв набагато більше місця в пам'яті і повільніше знайти всі NPC на карті.
  2. - навпаки.

Відповіді:


11

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

Вказівник на плитку - це не так багато пам’яті, якщо ви не працюєте на платформі, обмеженій пам’яттю, або у вас дійсно величезна карта.


5
+1 Я схильний з цим погоджуватися, однак @lezebulon, я пропоную вам інкапсулювати будь-яку логіку, яка потребує оновлення обох разом, як можна раніше. Тобто, коли гравець залишає плитку, повинна бути одна атомна операція (виклик функції), щоб одночасно видалити і покажчики, ігравач на плитку, і плитку до гравця. І те саме, коли гравець потрапляє на плитку, виконайте два завдання вказівника разом. Це дозволить вам заощадити деякий потенційний хаос, коли посилання не узгоджуються між собою, тобто один існує, а інший - ні.
Інженер

0

Як ви поводите зіткнення з картою? Якщо у вас є шар зіткнення, дуже простим способом було б спершу створити список НПС з координатами, що вказують, на якій плитці вони знаходяться, а потім повторити цей список і позначити плитку шару зіткнення під NPC як плитку зіткнення. Таким чином, зіткнення проти НПС будуть оброблятися одночасно з рештою карти. Це, звичайно, якщо NPC не рухатимуться ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.