actuellement je travaille sur ma propre version d'un jeu à base de tuiles (pensez Terraria, mais moins fantastique (je pense que c'est un mot? Désolé si ce n'est pas le cas)).
Quoi qu'il en soit, la détection des collisions fonctionne actuellement (même dans les cas d'angle!), Ce qui a été une grande étape pour moi. Il y a quelque chose d'extrêmement gratifiant à voir un sprite ne pas traverser un bloc. Mais j'ai eu l'idée de faire un benchmark. Mauvaise idée.
1000 carrés, pas de problème. 10000 carrés, pour 3 personnages était un peu décalé. 100 000 carrés (carte vraiment énorme), pour 3 personnages était injouable.
J'ai un problème où je ne veux même pas considérer les blocs trop éloignés du joueur, des personnages, des objets, etc., mais je ne veux pas charger ceux qui sont en mémoire en permanence.
Voici mon algorithme jusqu'à présent, n'hésitez pas à critiquer.
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
}
}
}
Comme vous le remarquerez, lorsque la taille du niveau augmente, l'ordre de cet algorithme croît de N blocs. Je ne voudrais même pas considérer les blocs qui ne sont même pas à proximité du joueur.
Je pense peut-être utiliser un (0,0) à (mapWidth, mapHeight) double tableau de blocs au lieu d'une liste, calculant une zone de danger en fonction de la position de la personne, par exemple, si la position du joueur est à (10, 20) il apparaîtra de (0, 10) à (20, 30), ou ainsi de suite.
Toutes les pensées et considérations sont géniales, merci.