Vou direto ao assunto e digo que não sei como resolver o problema que você descreveu na pergunta (detecção de colisão entre retângulos em forma de ladrilho iso), mas posso dizer como outras pessoas o resolveram no passado :
A maneira como é feita em outros jogos é separar o mundo do jogo do mundo da tela . Quando você está começando, é comum imaginá-los sendo a mesma coisa, mas isso leva a problemas como o que você está descrevendo.
A idéia geral é que o mundo do jogo seja completamente armazenado na memória, nos bastidores, são apenas números, referências e lógica. O fato de você estar desenhando o mundo do jogo em isométrico é irrelevante. Seu mundo de jogo não deve ter o conceito de isométrico, quadrado ou mesmo se a tela estiver sendo desenhada em 3D. Tudo isso é resolvido quando você desenha o mundo do jogo na tela (também conhecido como mundo da tela ). O mundo do jogo deve ser armazenado e mantido da maneira mais simples que faça sentido para o jogo. Em jogos isométricos, você normalmente ignora completamente o fato de ser iso e, em vez disso, armazena as posições como se estivesse usando uma grade alinhada por eixos. A maioria dos jogos terá métodos para converter coordenadas entre os dois mundos, eu chamo de meu ScreenToWorld(x, y)
eWorldToScreen(x, y)
. A conversão geralmente é feita com a matemática Matrix, mas pode ser alcançada de outras maneiras. Você usará o ScreenToWorld ao usar o mouse e o WorldToScreen ao desenhar.
Existem várias vantagens em dividir o mundo do jogo e o mundo da tela . Uma das vantagens é que a detecção e o movimento de colisões acontecem no mundo do jogo e, portanto, geralmente são bastante diretos, porque você não está lidando com uma grade inclinada, coordenadas inclinadas ou onde a tela está etc. No seu caso , você lidaria com retângulos e quadrados alinhados ao eixo. Depois que o mundo do jogo é atualizado, você desenha uma representação do mundo do jogo na tela, palavra-chave: representação. Pode parecer contra-intuitivo no começo, mas sua tela é apenas uma representação do que está acontecendo no mundo do jogo. Isso possibilita coisas como servidores dedicados e clientes semelhantes a terminais.
O FreeCiv é realmente um ótimo exemplo de todas essas coisas. Você pode visualizar o mesmo mundo exato que qualquer um dos seguintes: Grade quadrada Norte / Sul, Isométrica ou até Hex. Cada jogo que você executa possui um servidor dedicado em execução em segundo plano, mesmo para jogos para um jogador, portanto, o cliente também é apenas uma porta de exibição, nada mais.
Resumindo: separar o mundo do jogo e a lógica do mundo da tela simplifica a lógica do jogo, reduz o acoplamento da tela do jogo e, por sua vez, torna a detecção de colisão entre blocos "iso" mais fácil de manusear e mais fácil de visualizar.