obecnie pracuję nad własną wersją gry opartej na kafelkach (pomyśl Terraria, ale mniej fantastycznie (myślę, że to słowo? Przepraszam, jeśli nie jest)).
Tak czy inaczej, obecnie działam wykrywanie kolizji (nawet w przypadkach narożnych!), Co było dla mnie dużym krokiem. Jest coś niezwykle satysfakcjonującego w widzeniu, że duszek nie biegnie przez blok. Ale potem wpadłem na pomysł, aby przeprowadzić testy porównawcze. Kiepski pomysł.
1000 kwadratów, nie ma problemu. 10 000 kwadratów, dla 3 postaci było trochę opóźnione. 100 000 kwadratów (naprawdę ogromna mapa), na 3 postacie nie można było grać.
Mam problem polegający na tym, że nie chcę nawet brać pod uwagę bloków, które znajdują się zbyt daleko od gracza, postaci, przedmiotów itp., Ale nie chcę ciągle ładować tych brakujących pamięci.
Oto mój algorytm do tej pory, nie krępuj się krytykować.
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
}
}
}
Jak zauważysz, gdy rozmiar poziomu staje się większy, kolejność tego algorytmu rośnie o N bloków. Chciałbym nawet nie brać pod uwagę bloków, które nawet nie są blisko gracza.
Myślę, że może użyj (0,0) do (mapWidth, mapHeight) podwójnej tablicy bloków zamiast listy, obliczając strefę zagrożenia w zależności od pozycji osoby, np. Jeśli pozycja gracza wynosi (10, 20) będzie wyglądać od (0, 10) do (20, 30) itd.
Wszelkie przemyślenia i uwagi są niesamowite, dziękuję.