Piszę izometryczną grę 2D i mam trudności z dokładnym określeniem, na którym kafelku znajduje się kursor. Oto rysunek:
gdzie xs i ys to współrzędne ekranu (piksele), xt i yt to współrzędne kafelka, W i H to odpowiednio szerokość i wysokość kafelka w pikselach. Mój zapis współrzędnych to (y, x), co może być mylące, przepraszam za to.
Do tej pory najlepiej wymyśliłem:
int xtemp = xs / (W / 2);
int ytemp = ys / (H / 2);
int xt = (xs - ys) / 2;
int yt = ytemp + xt;
To wydaje się prawie poprawne, ale daje mi bardzo nieprecyzyjny wynik, co utrudnia wybranie niektórych kafelków lub czasami wybiera kafelek obok tego, który próbuję kliknąć. Nie rozumiem dlaczego i chciałbym, aby ktoś mógł mi pomóc zrozumieć logikę tego.
Dzięki!
Miałem ten sam problem z grą, którą pisałem. Wyobrażam sobie, że ten problem będzie się różnił w zależności od tego, jak dokładnie zaimplementowałeś system izometryczny, ale wyjaśnię, jak rozwiązałem problem.
Zacząłem od mojej funkcji tile_to_screen. (Zakładam, że tak właśnie umieszczasz kafelki w odpowiednim miejscu.) Ta funkcja ma równanie do obliczania screen_x i screen_y. Mój wyglądał tak (python):
Wziąłem te dwa równania i przekształciłem je w układ równań liniowych. Rozwiąż ten układ równań dowolną wybraną metodą. (Użyłem metody RREF. Niektóre kalkulatory graficzne mogą rozwiązać ten problem.)
Końcowe równania wyglądały następująco:
Jak widać, nie jest to proste jak początkowe równanie. Ale działa dobrze w stworzonej przeze mnie grze. Dzięki Bogu za algebrę liniową!
Aktualizacja
Po napisaniu prostej klasy Point z różnymi operatorami uprościłem tę odpowiedź na następujące:
źródło
Używasz dobrego układu współrzędnych. Sprawy stają się znacznie trudniejsze, jeśli używasz naprzemiennych kolumn.
Jednym ze sposobów myślenia o tym problemie jest to, że masz funkcję do zamiany (xt, yt) na (xs, ys). Podążę za odpowiedzią Thane'a i zadzwonię
map_to_screen
.Chcesz odwrócić tę funkcję. Możemy to nazwać
screen_to_map
. Odwrotności funkcji mają następujące właściwości:Te dwie rzeczy są dobre do przetestowania jednostkowego, gdy masz już napisane obie funkcje. Jak piszesz odwrotność? Nie wszystkie funkcje mają odwrotność, ale w tym przypadku:
Sprawdź, czy funkcja odwrotna + oryginalna zwraca odpowiedź, od której zacząłeś. Thane przechodzi oba testy, jeśli
+ TILE_HEIGHT/2
usuniesz przesunięcie renderowania. Kiedy rozwiązałem algebrę, wymyśliłem:który moim zdaniem jest taki sam jak Thane'a
screen_to_map
.Ta funkcja zamienia współrzędne myszy na liczby zmiennoprzecinkowe; Użyj,
floor
aby przekonwertować je na liczby całkowite.źródło