[XNA] Colisão por Bounding Box
O sistema de colisão por BoundingBox é um sistema simples, muito menos complexo que a colisão por pixel que vimos no tutorial passado. Na colisão por BoundingBox é feita uma analise utilizando o retângulo da imagem 2D (entende-se por retângulo da imagem a sua localização e tamanho), no qual verificamos se houve alguma sobreposição.
Este tipo de colisão não é uma das melhores formas, pois pode ocorrer das imagens não ocuparem o retângulo por completo, dando uma falsa impressão de colisão. Porém é um método prático e rápido de ser implementado. Uma das grandes vantagens deste sistema é que podemos utilizar o mesmo código em jogos 3D, pois o sistema do BoundingBox trabalha com coordenadas tridimensionais.
Vamos analisar a estrutura de um BoundingBox.
- CornerCount: Informa a quantidade de vértices que a estrutura tem, ou seja 8 (cubo).
- Min: é o ponto com componentes (x,y,z) que são menores ou iguais aos outros pontos que compões a BoundingBox.
- Max: é o ponto com componentes (x,y,z) que são maiores ou iguais aos outros pontos que compões a BoundingBox.
- Intersects: verifica se houve intersecção entre ele e outros objetos das estruturas Bounding.
- Contains: retorna uma enumeração denominada ContainmentType (Contains, Disjoint ou Intersect).
Vamos então criar um exemplo e ver este método de colisão em ação. Nosso exemplo vai ter duas caixas (BoundingBox) e para isso vamos precisar saber a posição delas, uma dessas caixas vai ficar parada e a outra vamos mover com o teclado, e caso aconteça uma colisão vamos pintar a tela de vermelho caso contrario deixamos com a cor azul padrão.
Crie um projeto e salve a imagem abaixo dentro da Content.
Crie as variáveis necessárias, inicialize e carregue a imagem. Veja o código abaixo.
Agora vamos fazer desenhar nossas imagens na tela e depois ver como vai funcionar o método Update().
Enfim, vamos movimenta nossa caixa verde pela tela usando as setas do teclado e após atualizarmos sua posição, vamos atualizar as Bounding Box das caixas e checar se aconteceu ou não colisão.
Por fim, vamos compilar nosso projeto para ver o resultado final.
Caso você queira fazer a caixa verde ficar sempre na frente da azul, é só inverter a ordem de desenho delas, desenhe primeiro a azul e depois a verde. Se você leu o artigo de Colisão por Pixel, pode notar o quanto mais fácil é fazer uma colisão por BoundingBox.
Para fazer download do projeto clique aqui.
Espero que tenham gostado, até a próxima.
Referência:
Colisão por BoundingBox no XNA: http://www.sharpgames.net/Artigo/tabid/58/selectmoduleid/376/ArticleID/1060/reftab/54/Default.aspx, acessado em Novembro de 2009.








Cara ta de parebens seus tutoriais ajudam muito quando o assunto eh xna, continue assim.
Obrigado Carlos, pretendo colocar muito assunto ligado a desenvolvimento de jogos, principalmente XNA que o pessoal esta usando bastante e também é bem simples de usar.
Continue acessando o blog e muito obrigado, logo teremos mais novidades e muito mais tutoriais.
Abraços.
Kleber,
Parabéns pelo tutorial! Muito didático.
Ensino XNA em um curso de Ciência da Computação e gostaria de saber se poderia utilizar esse post como um exercício complementar em sala de aula.
Forte abraço!
Olá Ricardo, muito obrigado estou tentando deixar o material sempre o mais didático possível e fico feliz quando vejo que as pessoas estão gostando.
Sobre usar o material com certeza o senhor pode usar, só peço para manter uma referência do resto pode usar e modificar com certeza, o material é para este fim mesmo.
Abraços, vamos manter contato. T+
Olá Kleber!
Grato! Com certeza manterei os devidos créditos e link para o seu blog. :^)
[]´s
Obrigado, precisar de mais alguma coisa é só entrar em contato…
pdjkleber[arroba]gmail.com
pdj_kleber[arroba]hotmail.com
Abraços,
Show cara, parabens ai pelo esforço de nos mostrar o caminho das pedras
Obrigado Henrique. O grande objetivo é justamente transmitir um pouco de conhecimento para vocês.
Poxa cara, ta 10 seus tutoriais. Só agora me embolei numa coisinha.
O Tal da linha BoundingBox por si mesma. Quando vou testar o jogo ele da aqueles erros, e diz que essa linha esta sendo usada como um tipo (presumo que é para ela ser usada) mas que ela é um “namespace”. Teria como você me ajudar? Pra simplificar as coisas, simplismente quando digito BoundingBox, não fica azul, e sim como se eu digitasse caixa1, por exemplo. Obrigado desde já.
Cara, se tu tiver em outra classe sem ser a Game1 é porque provavelmente você não adicionou a using necessária (using Microsoft.Xna.Framework;)
[]s
Depende, aonde é para ficar a string Microsoft.Xna.Framework? Eu coloquei ela na mesma linha da classe Game1
Então cara, estava tentando que quando ele se tocassem, ele para de andar, e tentei fazer isso indicando que quando ele se tocassem a velocidade fosse 0, porém se o fizer ele não anda mais, então não há como o personagem do jogo andar mais depois de tocar alguém, então como deve ser feito?
Olá Leonardo é só você setar a velocidade 0 quando existe colisão e quando não existir você volta a velocidade para o normal (aproveitando o que você fez)