Vamos supor que estou usando esse personagem.
(fonte: iconbug.com )
Como você implementaria a detecção de colisão para isso? Usar uma caixa delimitadora não parece ser uma boa aproximação, porque a forma do pássaro não está nem perto de um quadrado.
Eu estava pensando em ter uma espécie de estrutura de dados em quatro árvores dentro do objeto que representa partes da imagem. Cada folha pode ser false
(caso cubra o espaço branco / transparente fora do pássaro) ou true
(caso represente uma área do pássaro, isto é, bico, olho etc.). Então teste de alguma maneira o único obstáculo na cena para colisão com o pássaro.
Mas meus problemas na minha abordagem são:
- Não sei como inicializar o quad tree.
- Depois que a árvore quádrupla é inicializada, não sei como atravessá-la e usá-la quando o obstáculo estiver dentro das coordenadas da imagem.
Como você faria a detecção de colisões com caracteres não quadrados?
LE: A outra abordagem que vi foi usar várias caixas delimitadoras. Por exemplo, eu teria uma ou algumas caixas delimitadoras para o bico, depois algumas para o cabelo ou a cauda. Mas pode ser entediante. Se essa é uma abordagem válida no meu caso, como eu geraria essas caixas delimitadoras? Duvido que eu tenha que codificá-las no meu programa.
LE2: Eu me preocupo com colisões bastante precisas. Não consigo imaginar como uma única caixa ou círculo delimitador possa pelo menos se aproximar decentemente dessa forma, para que essa abordagem não funcione.
fonte
Respostas:
Colisor de círculo. Bom o suficiente, eu diria, a menos que você esteja fazendo algo chique com certas partes sendo afetadas pela física ou a colisão parecer antinatural, e mesmo que você precise dividi-la em várias partes, tenho uma coisa a dizer para você:
Não complique demais.
Você não precisa de uma estrutura completa de árvores quádruplas para isso. Basta ter várias caixas ou círculos em uma matriz reta e, em seguida, cruzar com todas elas. Isso não pode ser suficientemente crítico para o desempenho e você não ganhará muito com o uso de uma árvore quádrupla.
fonte
Um processo de verificação em duas etapas
Na primeira etapa, marque a caixa delimitadora e, se não houver colisão, o teste será concluído. Se houver colisão, você passa para a segunda passagem
Na segunda passagem , se você deseja mais precisão e deseja uma solução perfeita em pixels, pode fazer exatamente isso, um passe de verificação perfeito em pixels
Como sua imagem é PNG (ou qualquer outro formato de arquivo que contenha um canal alfa), isso seria bastante fácil
Se você observar o canal alfa de suas imagens, poderá ver como ele já possui todas as informações necessárias para uma colisão perfeita de pixels
As colisões perfeitas em pixels são geralmente caras, portanto, fazer uma estimativa aproximada com uma caixa delimitadora ou uma figura de colisão mais detalhada (como a sugerida por Anko) pode economizar um tempo precioso
A caixa delimitadora de colisão detalhada "mais fina" Anko sugeriu:
PS: Se sua imagem possui um halo, um efeito ou outro canal alfa diferente de 0 em torno do qual você não deseja colidir, o limite do algoritmo pode ser facilmente ajustado para acomodar esse
fonte
Eu usaria um círculo para o corpo e um único retângulo para o bico, mas essa é apenas a minha opinião. A complicação excessiva da geometria de colisão pode desacelerar o aplicativo, você praticamente está dobrando (ou mais) o número de caracteres na tela.
fonte
Talvez você possa usar algum tipo de colisor de polígono / borda instável.
Não sei exatamente como isso funcionaria, mas:
dois objetos: objeto 1: o pássaro (o1), objeto 2: a coisa que pode atingir o pássaro (o2)
1) Defina uma forma delimitadora que é um polígono que se encaixa bem no primeiro objeto (o1) em questão.
2) Obtenha as arestas de o1, o2 que poderiam colidir concebivelmente sem poderiam colidir sem o2 passar por o1 ou vice-versa.
Com a posição e o tamanho da forma (o2), você provavelmente poderia isolar arestas (de o1) que não podem ser atingidas, seja porque estão "por trás" de outra aresta (de o1) mais próxima de o2. Se você tivesse um triângulo retângulo cuja hipotenusa estava voltada para cima e para a direita e um retângulo se aproximando diretamente (com o lado comprido ao longo do eixo x), poderá dizer quais arestas devem ser omitidas porque são os valores inicial e final de y. acima ou abaixo do retângulo.
3) Determine se um dos pontos em uma aresta de o2 é igual a um ponto em qualquer uma das arestas de o1 que você selecionou na etapa 2.
esse conceito provavelmente funciona melhor para coligir polígonos (ou seja, itens com arestas claras), mas talvez você possa tratar um círculo como uma aresta longa (por exemplo, se o2 fosse um círculo).
fonte
Não adianta reinventar a roda. Obtenha uma boa API de jogos para fazer isso por você.
Bibliotecas de jogos 2D / Frameworks / Engines para Android
fonte