в настоящее время я работаю над собственной игрой на основе тайлов (думаю, 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) и т. д.
Любые мысли и соображения потрясающие, спасибо.
Ответы:
Да, ты думаешь правильно. Вы должны использовать двумерный массив плиток, поскольку это позволяет индексировать плитки по позициям.
А поскольку игрок может столкнуться только с окружающими его клетками, количество проверок на столкновение, которое вам нужно сделать, очень мало. Это, конечно, зависит от размера игрока. Образец платформер делает это следующим образом :
Проверьте образец, если у вас все еще есть проблемы.
источник
Я думаю, мой ответ будет вашим ответом! ;-)
Если у вас есть позиция игрока (и размер), вы можете рассчитать индексы окружающих плиток (которые являются единственными, которые будут проверены подробно). Таким образом, не важно, насколько велика ваша карта, это зависит только от фактического размера вашего игрока, что приводит к большему количеству потенциальных фишек для проверки.
Может быть, проверить учебник о столкновениях на riemers.net, если вы еще этого не сделали.
источник
При работе с большим количеством коллизий вы обычно хотите использовать более продвинутую структуру , такую как Quadtree или Hashmap, для проверки этих коллизий.
Поскольку плитки статичны, я бы предложил использовать Quadtree. Четырехъядерное дерево состоит из четырехугольников. Каждый четырехугольник состоит из четырех прямоугольников, и каждый из этих прямоугольников является четырехугольником. Это продолжается рекурсивно до указанного размера. Каждый квад может содержать список тайлов, которые обитают в этой области экрана. Таким образом, когда вы проверяете наличие столкновений, вы можете
Теперь, если вы не хотите даже смотреть на плитки вне экрана, вы можете сделать что-то вроде
источник