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ę.