на даний момент я працюю над власною грою на основі плитки (думаю, Terraria, але менш фантастично (я думаю, це слово? Вибачте, якщо це не так)).
У будь-якому випадку, в даний час у мене працює система виявлення зіткнень (навіть для кутових випадків!), Що було для мене великим кроком. Є щось надзвичайно втішне в тому, як бачити спрайт не проходить через блок. Але тоді у мене виникла ідея зробити орієнтир. Погана ідея.
1000 квадратів, без проблем. 10 000 квадратів, на 3 символи, було на кшталт відсталим. 100 000 квадратів (дійсно величезна карта), для 3 символів було неможливо.
У мене виникає проблема, коли я не хочу навіть розглядати блоки, які знаходяться занадто далеко від програвача, персонажів, предметів тощо, але я не хочу постійно завантажувати ці вхідні пам'яті.
Ось мій алгоритм поки що, сміливо критикуйте.
foreach (Block in level)
{
if (distance from block to player > a specified amount)
ignore this block;
else
{
get the intersection depth between the two bounding boxes
if (depth of intersection != Zero-vector)
{
check y size vs x size
resolve on smallest axis
}
}
}
Як ви зауважите, коли розмір рівня стає більшим, порядок цього алгоритму зростає на N блоків. Я хотів би навіть не розглядати блоки, які навіть не є поряд із програвачем.
Я думаю, можливо, використовуйте подвійний масив блоків (0,0) для (mapWidth, mapHeight) замість списку, обчислюючи небезпечну зону залежно від позиції людини, наприклад, якщо позиція гравця знаходиться на (10, 20) він буде виглядати від (0, 10) до (20, 30) тощо.
Будь-які думки та міркування є приголомшливими, дякую.