Dicas Rápidas – ExF03 – Detecção de Colisão

11 abril, 2009 (13:25) | dúvida | Por: admin

Um dos requisitos no exercício F03 é a não sobreposição dos controles.
Ou seja: um objeto não pode ocupar o lugar de outro ao mesmo tempo.

Uma maneira simples de detectar a colisão é através da propriedade Bounds de um controle.
Tal propriedade reflete o retângulo relacionado à área ocupada por um controle. O método IntersectsWith desta propriedade pode ser usado para verificar se um retângulo tem algum cruzamento com outro.

No exemplo abaixo, no caso de sobreposição, a posição original é retornada.
Ver em anexo o código funcionando.


// Obtém o elemento que está sendo arrastado
Button b = (Button) e.Data.GetData(typeof(Button));
// Armazena o ponto no qual o retângulo está
Point pOrigem = b.Location;
// Calcula o ponto que o elemento foi arrastado
Point p = new Point(e.X, e.Y);
// Coloca no ponto desejado
b.Location = this.PointToClient(p);
// Percorre todos os controles do form
foreach (Control c in this.Controls)
{
 // Há um cruzamento entre os dois controles
 // ou seja, um está sobre o outro
 // O controle não é ele mesmo (b!=c)
 if (b.Bounds.IntersectsWith(c.Bounds) && b!=c)
 {
    // Volta para a posição original
    b.Location = pOrigem;
    break;
 }
}

Escreva um comentário