Atualmente, estou trabalhando por conta própria em um jogo baseado em blocos (pense em Terraria, mas menos fantástico (acho que é uma palavra? Desculpe se não é)).
De qualquer forma, atualmente tenho a detecção de colisão funcionando (mesmo nos casos de canto!), O que foi um grande passo para mim. Há algo extremamente gratificante em ver um sprite não correr por um bloco. Mas então tive a ideia de fazer benchmark. Péssima ideia.
1.000 quadrados, não há problema. 10.000 quadrados, para 3 caracteres, era meio que lento. 100.000 quadrados (mapa realmente grande), para 3 personagens, não eram jogáveis.
Estou tendo o problema em que não quero nem considerar os blocos que estão muito longe do jogador, personagens, itens etc., mas não quero carregar esses in-out de memória constantemente.
Aqui está o meu algoritmo até agora, fique à vontade para criticar.
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
}
}
}
Como você notará, quando o tamanho do nível aumentar, a ordem desse algoritmo aumentará em N blocos. Eu gostaria de nem considerar blocos que nem sequer estão perto do jogador.
Acho que talvez use um (0,0) para (mapWidth, mapHeight) matriz dupla de blocos em vez de uma lista, calculando uma zona de perigo dependendo da posição da pessoa, por exemplo, se a posição do jogador estiver em (10, 20) parecerá de (0, 10) a (20, 30) ou mais.
Quaisquer pensamentos e considerações são impressionantes, obrigado.