Pergunta

O que é a melhor maneira de detectar colisões em 2D sprites do jogo? Eu estou trabalhando atualmente em allegro e G ++

Foi útil?

Solução

Há uma infinidade de maneiras de detectar detecção de colisão. Os métodos que você usa será ligeiramente alterada se dependendo se o seu usando um ambiente 2D ou 3D. Lembre-se também ao instituir um sistema de detecção de colisão, para ter em conta quaisquer física que você pode querer implementar no jogo (necessário para a maioria dos jogos 3D descida), a fim de melhorar a realidade dele.

A versão curta é usar caixas delimitadoras. Ou em outras palavras, fazer com que cada entidade no mundo uma caixa, em seguida, verificar se cada um dos axises da caixa estão colidindo com outras entidades.

Com grandes quantidades de entidades para testar colisões que você pode querer verificar em uma octree. Você seria simples divisão do mundo em setores, só então verificar se há colisão entre objetos nos mesmos setores.

Para obter mais recursos, você pode ir para sourceforge e procurar o motor dinâmica de bala que é um mecanismo de detecção de colisão e física open source, ou você poderia verificar http://www.gamedev.net que tem abundância de recursos sobre temas de desenvolvimento de jogos copiosas.

Outras dicas

Qualquer decente biblioteca de gráficos 2D será ou fornecer suas próprias funções de detecção de colisão para tudo, desde sprites alinhados com polígonos de pixels, ou ter uma ou mais boas bibliotecas de terceiros para executar essas funções. Sua escolha de motor / biblioteca / quadro deve ditar suas escolhas de detecção de colisão, como eles são provavelmente muito mais otimizado do que o que você poderia produzir sozinho.

Para Allegro existe Collegro . Para SDL há SDL_Collide.h ou SDL-Collide . Você pode usar I_COLLIDE com OpenGL. DarkBASIC foi construído em um sistema de colisão, e DarkPhysics para interações muito precisos, incluindo colisões.

Use uma biblioteca, eu recomendo Box2D

Esta questão é muito geral. Há muitas maneiras de ir sobre a detecção de colisão em um jogo 2D. Seria útil para saber o que você está tentando fazer.

Como ponto de partida, porém, existem métodos muito simples que permitem a detecção entre os círculos, retângulos, etc. Eu não sou um grande fã de gamedev.net, mas existem alguns bons recursos lá sobre este tipo de detecção. Um tal artigo é aqui . Abrange algum material básico que pode ajudar você a começar.

jogos 2D básicos pode usar retângulos ou círculos para "encerram" um objeto na tela. Detecção de quando retângulos se sobrepõem ou quando círculos se sobrepõem é matemática bastante straightfoward. Se você precisa de algo mais complicado (como polígonos convexos artibrary), então a solução é mais complicada. Mais uma vez, gamedev.net pode ser de alguma ajuda aqui.

Mas realmente responder à sua pergunta, precisamos saber o que você está tentando fazer? Que tipo de jogo? Que tipo de objetos que você está tentando colidem? Você está tentando colidir com os limites da tela, etc.

A implementação de um sistema de detecção de colisão é uma questão complicada, mas você quer considerar três pontos.

  • Mundo de objetos. Partitioning espaço. Se você fazer uma verificação de colisão contra todos os sprites 2D em seu mundo contra tudo o resto, você vai ter um programa lento lento! Você precisa priorizar. Você precisa dividir o espaço. Você pode usar um sistema de malha ortogonal e cortar o seu mundo em uma grade 2D. Ou você pode usar uma árvore de BSP, usando linhas como a função seperator.

  • detecção de colisão fase Broad Isto usa delimitadora volumes, tais como cilindros ou elipses (o que aproxima a forma de seus sprites o melhor) para determinar se ou não os objetos podem ser comparados com mais detalhes. A matemática para isso é fácil. Saiba suas transformações de matriz 2D. E para intersecção 2d, você ainda pode usar altas placas de vídeo alimentados para fazer um monte de trabalho!

  • detecção de colisão fase Narrow Agora que você já determinou que dois ou mais objetos podem ser comparados, você entrar em sua seção sintonizado bem. O objetivo desta fase é determinar o resultado de colisão. Profundidade de penetração, o volume abrangeu, etc ... E esta informação será alimentado em qualquer motor de física que você tem planejado. Em 3D Este é o reino da algs distância GJK e outros algoritmos neato que todos nós amamos tanto!

Você pode implementar tudo isso genericamente e especifique o amplo e resoluções estreitas polymorphically, ou fornecer um gancho se você estiver trabalhando em uma linguagem de nível mais baixo.

As colisões entre o que? Depende se você usar sprites, polígonos côncavos, polígonos convexos, retângulos, quadrados, círculos, pontos ...

Verificação de colisão entre duas bolas em 2D é fácil. Você pode pesquisar no Google, mas basicamente você verifique se o comprimento das duas bolas de raio combinadas é maior ou igual à distância entre o centro das duas bolas.

Depois, você pode encontrar o ponto de colisão, levando o vetor de unidade entre o centro das bolas e multiplicá-lo com um dos o raio bolas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top