Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Anderson Ferminiano

Artigo Colisão Bidimensional

Recommended Posts

Falaaaaa galera, trouxe um artigo hoje sobre colisão bidimensional, isto é, colisão em um ambiente 2D orientado por 2 coordenadas: x e y. É um assunto bem simples, mas que muita gente comete erros de lógica, o que faz muitos jogos ficarem extremamente lentos.

 

Este artigo vai falar sobre a LÓGICA de colisão e não sobre como aplicar ela em um projeto efetivamente, não colocarei aqui códigos prontos, apenas uma fórmula e explicações. Apesar de não termos códigos, temos um exemplo com código fonte aberto pra quem quiser olhar na prática como é feito.

 

O exemplo mostra também na prática o que é x, o que é y, e como nossa fórmula retorna o índice do vetor que representa nosso mapa. No exemplo você pode movimentar o quadrado preto sobre o mapa e verificar suas respectivas propriedades em tempo de execução.

 

Exemplo em Actionscript 3.0: http://www.andersonferminiano.com/games/colisao_bidimensional/

Download das sources no fim do artigo.

 

Então, começamos apresentando como é formado o mapa. Um mapa 2D é formado por 2 coordenadas, onde um representa o x e outro representa y, ou seja, um representa as colunas e o outro as linhas respectivamente. Ele é representado matematicamente por uma matriz, como a seguir:

 

(11 12
21 22)

Temos acima um mapa com 4 tiles, sendo suas dimensões 2x2 (x vs y SEMPRE). Para entendermos melhor, vamos fazer um mapa:

 

0,0,0,1,0,0,0
0,0,1,1,1,0,0
1,1,0,1,0,1,1
1,1,0,1,0,1,1
0,0,1,1,1,0,0
0,0,0,1,0,0,0

Certo, agora temos um mapa 7x6, onde 1 representa algum objeto para colisão (uma pedra por exemplo) e 0 representa o chão, onde podemos andar normalmente.

Neste exemplo, X máximo = 7.

Obs: o que cada número vai representar no jogo depende diretamente do projeto e do desenvolvedor, não há uma regra para isto.

Vamos passar essa matriz pra programação!

 

Matriz = {0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,0,1,0,1,1,1,1,0,1,0,1,1,0,0,1,1,1,0,0,0,0,0,1,0,0,0}

Pra quem não entendeu, eu simplesmente juntei todas linhas e colunas com vírgulas, agora no vetor não temos mais nenhuma divisão visível sobre o que é linha, ou o que é coluna, isto será feito à partir de variáveis.

 

 

Para montarmos um mapa, devemos saber o X máximo, assim sempre que chegarmos ao X máximo em um loop sobre o vetor, acrescentamos uma unidade no Y e resetamos o X para 1, até finalizar o mapa. Se quiser saber mais sobre a etapa da criação do mapa sobre X e Y, olhe o exemplo e verá na prática esta parte.

“Beleza, mas se não temos mais divisões, como vamos achar nesse vetor aí a posição de um personagem?!”

 

Também à partir do X máximo e uma fórmula que criei, conseguimos descobrir em que índice do vetor, a posição que procuramos se encontra.

 

Fórmula:

X = 3 
Y = 2
// Usuário quer saber posição X 3 e Y 2
MAXIMO_X = 7 	
// MAXIMO X SOBRE NOSSO EXEMPLO
INDICE_VETOR = (int((Y-1)*MAXIMO_X)+X)-1

Na fórmula primeiro subtrai 1 tanto do y, quanto do X para corrigir as diferenças, porque um vetor geralmente começa do índice 0 (depende da linguagem esta parte), mas X e Y sempre são >= 1, depois disso multipliquei o Y pelo máximo X e obtive a quantidade de linhas que já passei e somei as colunas (X).

 

Feito isso, agora você já pode criar alguns joguinhos com uma pouca criatividade, como o clássico Bomberman.

 

Download do exemplo:

http://www.andersonferminiano.com/games/colisao_bidimensional/sources.zip

 

Espero que tenham aproveitado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ow anderson um exemplo interessante pra dar junto com essa otima explicação que você deu ai seria o esquema onde montamos o mapa de bits e fazemos o tile do mapa.

 

Abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.