Anderson Ferminiano 2 Denunciar post Postado Abril 16, 2010 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
Matheus Brito 12 Denunciar post Postado Abril 17, 2010 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
Anderson Ferminiano 2 Denunciar post Postado Abril 18, 2010 você diz pra mostrar como transformar um mapa de bits em gráficos na prática? Compartilhar este post Link para o post Compartilhar em outros sites
Matheus Brito 12 Denunciar post Postado Abril 18, 2010 É, isso mesmo. Abs Compartilhar este post Link para o post Compartilhar em outros sites