Je vais tout de suite dire que je ne sais pas comment résoudre le problème que vous avez décrit dans la question (détection de collision entre des rectangles en forme de tuile iso), mais je peux vous dire comment d'autres l'ont résolu dans le passé :
La façon dont cela se fait dans d'autres jeux consiste à séparer le monde du jeu du monde de l' écran . Lorsque vous commencez, il est courant d'imaginer qu'ils sont la même chose, mais cela conduit à des problèmes comme celui que vous décrivez.
L'idée générale est que le monde du jeu est entièrement stocké en mémoire, dans les coulisses, c'est juste des chiffres, des références et de la logique. Le fait que vous dessiniez le monde du jeu en isométrique est sans importance. Votre monde de jeu ne devrait pas avoir le concept d'isométrique ou de carré, ni même si l'écran est dessiné en 3D. Tout cela est pris en charge lorsque vous dessinez le monde du jeu à l'écran (alias le monde de l' écran ). Le monde du jeu doit être stocké et entretenu de la manière la plus simple qui soit logique pour le jeu, dans les jeux isométriques, vous ignorez complètement le fait qu'il est iso et stockez plutôt les positions comme si vous utilisiez une grille alignée sur l'axe. La plupart des jeux auront des méthodes pour convertir les coordonnées entre les deux mondes, j'appelle le mien ScreenToWorld(x, y)
etWorldToScreen(x, y)
. La conversion est souvent effectuée avec Matrix Math, mais peut être réalisée par d'autres moyens. Vous utiliserez ScreenToWorld lorsque vous utilisez la souris et WorldToScreen lorsque vous dessinez.
Il y a plusieurs avantages à séparer le monde du jeu et le monde de l' écran . L'un des avantages est que la détection des collisions et les mouvements se produisent tous dans le monde du jeu, et sont donc généralement assez simples car vous n'avez pas affaire à une grille inclinée, à des coordonnées asymétriques, à l'emplacement de l'écran, etc. Dans votre cas , vous auriez affaire à des rectangles et des carrés alignés sur l'axe. Une fois le monde du jeu mis à jour, vous dessinez une représentation du monde du jeu à l'écran, mot-clé: représentation. Cela peut sembler contre-intuitif au premier abord, mais votre écran n'est qu'une représentation de ce qui se passe dans le monde du jeu. Cela rend possible des choses comme des serveurs dédiés et des clients de type terminal.
FreeCiv est en fait un excellent exemple de toutes ces choses. Vous pouvez voir le même monde exact que n'importe lequel: une grille carrée Nord / Sud, isométrique ou même hexadécimale. Chaque jeu que vous exécutez a un serveur dédié fonctionnant en arrière-plan, même pour les jeux solo, le client n'est donc qu'un port d'affichage, rien de plus.
Pour faire court: séparer le monde du jeu et la logique du monde de l'écran simplifie la logique du jeu, réduit le couplage d' affichage du jeu <-> et, à son tour, rend la détection de collision entre les tuiles "iso" plus facile à manipuler et à visualiser.