Início > Tutoriais, XNA > [XNA] Colisão por Bounding Box

[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.

caixa.png

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.

  1. Carlos
    02/05/2010 às 1:26 pm | #1

    Cara ta de parebens seus tutoriais ajudam muito quando o assunto eh xna, continue assim.

    • Kleber Andrade
      02/05/2010 às 1:28 pm | #2

      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.

  2. Ricardo Leme
    03/22/2010 às 3:05 pm | #3

    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!

    • Kleber Andrade
      03/22/2010 às 3:53 pm | #4

      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+

  3. Ricardo Leme
    03/22/2010 às 3:55 pm | #5

    Olá Kleber!

    Grato! Com certeza manterei os devidos créditos e link para o seu blog. :^)
    []´s

    • Kleber Andrade
      03/22/2010 às 4:03 pm | #6

      Obrigado, precisar de mais alguma coisa é só entrar em contato…

      pdjkleber[arroba]gmail.com
      pdj_kleber[arroba]hotmail.com

      Abraços,

  4. henrique adriano
    12/30/2010 às 6:04 pm | #7

    Show cara, parabens ai pelo esforço de nos mostrar o caminho das pedras

    • Kleber Andrade
      01/01/2011 às 6:21 pm | #8

      Obrigado Henrique. O grande objetivo é justamente transmitir um pouco de conhecimento para vocês.

  5. Vinicius
    01/26/2011 às 11:15 pm | #9

    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á.

    • Kleber Andrade
      01/26/2011 às 11:29 pm | #10

      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

  6. Vinicius
    01/27/2011 às 3:20 pm | #11

    Depende, aonde é para ficar a string Microsoft.Xna.Framework? Eu coloquei ela na mesma linha da classe Game1

  7. 03/13/2011 às 12:17 am | #12

    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?

    • Kleber Andrade
      03/13/2011 às 9:27 pm | #13

      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)

  1. 11/22/2009 às 8:25 pm | #1
  2. 01/04/2010 às 1:33 pm | #2

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Sair / Alterar )

Imagem do Twitter

You are commenting using your Twitter account. Sair / Alterar )

Foto do Facebook

You are commenting using your Facebook account. Sair / Alterar )

Connecting to %s

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.

Join 29 other followers