Ir para conteúdo

Arquivado

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

jadsonlucena

Detecção de colisão eficiente

Recommended Posts

Galera, estou tentando fazer um sistema de colisões eficiente no canvas com javascript.



A forma mais básica seria adicionar todos os objetos em uma lista e sempre que o personagem se movesse, a lista seria varrida comparando a posição de cada objeto com a do personagem, levando em conta o espaço que os dois ocupam. Se algum objeto da lista se intersectar com o personagem, o tratamento de colisão seria realizado.



Mas percebemos que se tivermos um grande número de objetos no cenário. Este não seria uma forma inteligente de se fazer a coisa. Pois a busca de todos os objetos da lista incluindo a comparação realizada seriam muito custos.



Eu gostaria de verificar sempre se à um outro elemento na área do personagem sem ter que varrer todos os elementos da tela. Algo semelhante ao onmouseover, mas para elementos.



Alguém conheceria alguma (se possível, a melhor) forma de se fazer isso?



Grato desde já....


Compartilhar este post


Link para o post
Compartilhar em outros sites

Você pode usar a forma básica para checar se há colisão entre os objetos que estão sendo vistos na tela. Os objetos vistos na tela podem, sugeridamente, estar em uma lista (array), que vai sendo modificada ao mesmo tempo que o jogo é renderizado, com base nas condições e na estrutura. Os objetos que não são vistos na tela deveriam permanecer em uma lista (array) onde há objetos não vistos na tela (no caso de estarem na lista de objetos visíveis na tela são removidos de lá).

 

Quando um objeto está visível na tela é porque sua metade pode estar sendo vista em algum local, *com base em seu tamanho*;

 

Checando horizontalmente:

 

*** (Objeto > X) maior que (Objeto > Largura (negativo -))

*** &

*** (Objeto > X) menor que (Área > Largura)

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por BrunoHSL
      Galera, estou fazendo um jogo e estou pegando de exemplo um código que vi na internet, e adaptando no meu conforme as necessidades, quando chegou na colisão ( a ultima parte do meu jogo já) estou com um problema, eu simplesmente nao consigo colocar ele no meu codigo pois da erro no if Gameover, gostaria que me explicassem o que acontece nessa parte do código para que eu possa adaptar ele em meu jogo
      function Sprite(caminhoDaImagem, xInicial, yInicial) { //restante do código... this.colidiu = function(outro){ var colidiuNoXTopo = outro.x >= this.x && outro.x <= (this.x + this.largura); var colidiuNoYTopo = outro.y >= this.y && outro.y <= (this.y + this.altura); var colidiuNoXBase = (outro.x + outro.largura) >= this.x && (outro.x + + outro.largura) <= (this.x + this.largura); var colidiuNoYBase = (outro.y + outro.altura) >= this.y && (outro.y + outro.altura) <= (this.y + this.altura); return (colidiuNoXTopo && colidiuNoYTopo) || (colidiuNoXBase && colidiuNoYBase); } } Desde já, muito obrigado 
    • Por igorsk89
      Não estou conseguindo fazer com que o "enemy", que no caso é o asteroide, colida com a nave e a mesma executar a função de destruir..
      Alguém tem alguma ideia do que está dando errado?? Se está faltando algo, etc?!
      Screenshots:


    • Por Pablo Goulart Nogueira
      Esse é o código que eu fiz para testar a detecção da colisão, mas a janela fecha antes de eu poder ve se está funcionando.
       
      if (personagem.x + personagem.bx > blocos.x - blocos.bx &&
      personagem.x - personagem.bx < blocos.x + blocos.bx && personagem.y + personagem.by > blocos.y - blocos.by && personagem.y - personagem.by < blocos.y + blocos.by ) { return 1; } else return 0;
    • Por jadsonlucena
      Galera, estou tentando fazer um sistema de colisões eficiente no canvas com javascript.
       
      A forma mais básica seria adicionar todos os objetos em uma lista e sempre que o personagem se movesse, a lista seria varrida comparando a posição de cada objeto com a do personagem, levando em conta o espaço que os dois ocupam. Se algum objeto da lista se intersectar com o personagem, o tratamento de colisão seria realizado.
       
      Mas percebemos que se tivermos um grande número de objetos no cenário. Este não seria uma forma inteligente de se fazer a coisa. Pois a busca de todos os objetos da lista incluindo a comparação realizada seriam muito custos.
       
      Eu gostaria de verificar sempre se à um outro elemento na área do personagem sem ter que varrer todos os elementos da tela. Algo semelhante ao onmouseover, mas para elementos.
       
      Alguém conheceria alguma (se possível, a melhor) forma de se fazer isso?
       
      Grato desde já....
×

Informação importante

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