Verrò subito e dirò che non so come risolvere il problema che hai descritto nella domanda (rilevamento delle collisioni tra rettangoli a forma di piastrella iso), ma posso dirti come altri lo hanno risolto in passato :
Il modo in cui viene fatto in altri giochi è quello di separare il mondo di gioco dal mondo dello schermo . Quando inizi, è normale immaginare che siano la stessa cosa, ma poi porta a problemi come quello che stai descrivendo.
L'idea generale è che il mondo di gioco è completamente archiviato nella memoria, dietro le quinte, sono solo numeri, riferimenti e logica. Il fatto che tu stia disegnando il mondo di gioco in modo isometrico è irrilevante. Il tuo mondo di gioco non dovrebbe avere il concetto di isometrico, o quadrato, o anche se lo schermo viene disegnato in 3D. Tutto ciò viene curato quando si disegna il mondo di gioco sullo schermo (ovvero il mondo dello schermo ). Il mondo di gioco dovrebbe essere memorizzato e mantenuto nel modo più semplice che abbia senso per il gioco, nei giochi isometrici, in genere si ignora completamente il fatto che è iso e invece si memorizzano le posizioni come se si stesse utilizzando una griglia allineata agli assi. La maggior parte dei giochi avrà metodi per convertire le coordinate tra i due mondi, io chiamo il mio ScreenToWorld(x, y)
eWorldToScreen(x, y)
. La conversione viene spesso eseguita con la matematica Matrix, ma può essere ottenuta in altri modi. Userai ScreenToWorld quando usi il mouse e WorldToScreen quando disegni.
Ci sono molti vantaggi nel dividere il mondo di gioco e il mondo dello schermo . Uno dei vantaggi è che il rilevamento e il movimento delle collisioni avvengono tutti nel mondo di gioco ed è quindi abbastanza semplice perché non si ha a che fare con una griglia inclinata, con coordinate oblique o dove si trova lo schermo, ecc. , avresti a che fare con rettangoli e quadrati allineati agli assi. Una volta che il mondo di gioco è stato aggiornato, si disegna una rappresentazione del mondo di gioco sullo schermo, parola chiave: rappresentazione. All'inizio può sembrare controintuitivo, ma il tuo schermo è solo una rappresentazione di ciò che sta accadendo nel mondo di gioco. Ciò rende possibili cose come server dedicati e client simili a terminali.
FreeCiv è in realtà un ottimo esempio di tutte queste cose. Puoi visualizzare lo stesso mondo esatto di uno qualsiasi: una griglia quadrata nord / sud, isometrica o persino esadecimale. Ogni gioco che esegui ha un server dedicato in esecuzione in background, anche per i giochi a giocatore singolo, quindi il client è anche solo una porta di visualizzazione, niente di più.
Per farla breve: separare il mondo di gioco e la logica dal mondo dello schermo semplifica la logica di gioco, riduce l' accoppiamento del display <-> del gioco e, a sua volta, rende il rilevamento delle collisioni tra tessere "iso" più facile da gestire e più facile da visualizzare.