Zaraz wyjdę i powiem, że nie wiem, jak rozwiązać problem opisany w pytaniu (wykrywanie kolizji między prostokątami w kształcie kafelków iso), ale mogę powiedzieć, jak inni rozwiązali go w przeszłości :
W innych grach sposób polega na oddzieleniu świata gry od świata ekranu . Kiedy zaczynasz, często wyobrażasz sobie, że są tym samym, ale prowadzi to do problemów takich jak ten, który opisujesz.
Ogólna idea jest taka, że świat gry jest przechowywany całkowicie w pamięci, za kulisami, to tylko liczby, referencje i logika. Fakt, że rysujesz świat gry w rzucie izometrycznym, nie ma znaczenia. Twój świat gry nie powinien mieć koncepcji izometrycznej, kwadratowej, a nawet jeśli ekran jest rysowany jako 3D. Wszystko to załatwia się, gdy narysujesz świat gry na ekranie (inaczej świat ekranu ). Świat gry powinien być przechowywany i utrzymywany w najprostszy sposób, który ma sens w grze, w grach izometrycznych zazwyczaj całkowicie ignorujesz fakt, że jest to iso i zamiast tego przechowujesz pozycje, jakbyś używał siatki wyrównanej do osi. Większość gier będzie miała metody przekształcania współrzędnych między dwoma światami, nazywam mój ScreenToWorld(x, y)
iWorldToScreen(x, y)
. Konwersji często dokonuje się za pomocą matematyki Matrix, ale można to osiągnąć innymi sposobami. Będziesz używać ScreenToWorld podczas używania myszy, a WorldToScreen podczas rysowania.
Podział świata gry i świata ekranu ma kilka zalet . Jedną z zalet jest to, że wykrywanie kolizji i ruch zdarzają się w świecie gry, a zatem zazwyczaj jest to bardzo proste, ponieważ nie masz do czynienia z nachyloną siatką, skośnymi współrzędnymi lub miejscem, w którym znajduje się ekran itp. W twoim przypadku , miałbyś do czynienia z prostokątami i kwadratami wyrównanymi do osi. Po zaktualizowaniu świata gry rysujesz na ekranie reprezentację świata gry, słowo kluczowe: reprezentacja. Na początku może się to wydawać sprzeczne z intuicją, ale Twój ekran jest jedynie reprezentacją tego, co dzieje się w świecie gry. Dzięki temu możliwe są takie serwery dedykowane, jak klienci podobni do terminali.
FreeCiv jest w rzeczywistości doskonałym przykładem tych wszystkich rzeczy. Możesz zobaczyć dokładnie ten sam świat, co dowolny z: kwadratową siatkę północ / południe, izometryczny, a nawet hex. Każda uruchomiona gra ma dedykowany serwer działający w tle, nawet w przypadku gier dla jednego gracza, dlatego klient jest tylko portem wyświetlania, niczym więcej.
Krótko mówiąc: Oddzielenie świata gry i logiki od świata ekranu upraszcza logikę gry, zmniejsza sprzężenie wyświetlania <-> i z kolei ułatwia wykrywanie kolizji między płytkami „iso” i wizualizację.