Actualmente estoy trabajando en mi propia versión de un juego basado en mosaicos (piense en Terraria, pero menos fantástico (creo que es una palabra? Lo siento si no lo es)).
De todos modos, actualmente tengo detección de colisión funcionando (¡incluso para casos de esquina!), Lo cual fue un gran paso para mí. Hay algo extremadamente gratificante en ver que un sprite no corre por un bloque. Pero luego tuve la idea de comparar. Mala idea.
1,000 cuadrados, no hay problema. 10,000 casillas, para 3 personajes, fue un poco lento. 100,000 cuadrados (mapa realmente enorme), para 3 personajes no se podía jugar.
Tengo el problema de que ni siquiera quiero considerar los bloques que están demasiado lejos del jugador, los personajes, los elementos, etc., pero no quiero cargarlos constantemente de memoria.
Aquí está mi algoritmo hasta ahora, no dude en 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 notará, cuando el tamaño del nivel aumenta, el orden de este algoritmo crece en N bloques. Me gustaría ni siquiera considerar bloques que ni siquiera están cerca del jugador.
Estoy pensando que tal vez use un (0,0) para (mapWidth, mapHeight) doble matriz de bloques en lugar de una lista, calculando una zona de peligro dependiendo de la posición de la persona, por ejemplo, si la posición del jugador está en (10, 20) se verá de (0, 10) a (20, 30), etc.
Cualquier pensamiento y consideraciones son increíbles, gracias.