Derzeit arbeite ich an meiner eigenen Version eines auf Kacheln basierenden Spiels (denke an Terraria, aber weniger fantastisch (ich denke, das ist ein Wort? Tut mir leid, wenn es nicht so ist)).
Jedenfalls funktioniert derzeit die Kollisionserkennung (sogar für Eckfälle!), Was für mich ein großer Schritt war. Es ist äußerst erfreulich zu sehen, wie ein Sprite nicht durch einen Block läuft. Aber dann hatte ich die Idee, ein Benchmarking durchzuführen. Schlechte Idee.
1.000 Quadrate, kein Problem. 10.000 Quadrate für 3 Zeichen waren etwas verzögert. 100.000 Felder (wirklich riesige Karte) für 3 Charaktere waren nicht spielbar.
Ich habe das Problem, dass ich nicht einmal die Blöcke berücksichtigen möchte, die zu weit vom Spieler, den Charakteren, Gegenständen usw. entfernt sind, aber ich möchte diese nicht ständig aus dem Speicher laden.
Hier ist mein bisheriger Algorithmus, zögern Sie nicht zu kritisieren.
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
}
}
}
Wie Sie feststellen werden, wächst die Reihenfolge dieses Algorithmus um N Blöcke, wenn die Levelgröße größer wird. Ich möchte nicht einmal Blöcke berücksichtigen, die nicht einmal in der Nähe des Spielers sind.
Ich denke, vielleicht verwenden Sie ein (0,0) bis (mapWidth, mapHeight) Doppelarray von Blöcken anstelle einer Liste und berechnen eine Gefahrenzone in Abhängigkeit von der Position der Person, z. B. wenn die Position des Spielers bei (10, 20) liegt. es wird von (0, 10) bis (20, 30) oder so weiter aussehen.
Alle Gedanken und Überlegungen sind großartig, danke.