в настоящее время я работаю над собственной игрой на основе тайлов (думаю, Terraria, но менее фантастической (я думаю, что это слово? Извините, если это не так)).
Во всяком случае, в настоящее время у меня работает функция обнаружения столкновений (даже для угловых случаев!), Что стало для меня большим шагом. Есть что-то чрезвычайно приятное в том, что спрайт не проходит через блок. Но тогда у меня возникла идея сравнительного анализа. Плохая идея.
1000 квадратов, без проблем. 10000 квадратов, для 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) и т. д.
Любые мысли и соображения потрясающие, спасибо.