Vou me arrepender de usar um sistema de detecção de colisão baseado em cores?


7

Estou começando a construir meu primeiro jogo com o XNA (tenho experiência com C #, mas não com jogos).

Estou construindo um shooter 2D simples, de cima para baixo. Eu li este tutorial sobre o uso de um sistema de colisão baseado em cores e me pareceu muito legal. http://www.xnadevelopment.com/tutorials/theroadnottaken/theroadnottaken.shtml

Isso significa que eu posso fazer níveis rapidamente usando qualquer programa gráfico e não tenho que definir meu cenário (paredes, árvores, etc.) em termos de caixas de colisão, certo?

No entanto, posso ver que percorrer esse caminho significa que talvez o cálculo para determinar se objetos em movimento rápido, como marcadores cruzam paredes, etc. se torne mais difícil potencialmente porque você não pode fazer cálculos básicos do tipo interseção de geometria.

Isso está certo? Vou me arrepender de ir nessa direção se meu jogo ficar mais complexo com o tempo? Vale apenas investir na criação de um editor de níveis para definir meu cenário em termos de geometria?

Qualquer conselho para um noob muito apreciado!

Respostas:


6

Você é pontual com suas observações sobre os recursos de uma abordagem de colisão baseada em bitmap.

Este método fornece uma maneira muito fácil de editar seus níveis com qualquer programa que possa gerar um bitmap (qualquer programa de edição de imagens). Este sistema também é realmente flexível quando você deseja definir diferentes tipos de solo. Diga greenpor lama e redpor um subsolo sólido. Em seguida, você consulta facilmente o pixel atual e determina o tipo de subsolo em que o player fica. Até rampas (gradientes do tipo A a B) são possíveis sem muitos problemas.

Problemas surgem com a detecção de colisão. É fácil detectar uma interseção com outro objeto (basta fazer um teste de pixel), mas é difícil (computacionalmente caro) descobrir qual orientação o objeto com o qual você colidiu tem. Isso é especialmente importante quando você precisa de uma superfície normal para desviar os objetos corretamente .

Também objetos em movimento muito rápido podem ser um problema, especialmente se você tiver objetos finos (por exemplo, 1 pixel de largura) para colidir. Já existe essa pergunta que aborda esse tópico.

No final, tudo depende de que tipo de jogo você deseja criar e de qual resolução (em termos de detecção / resolução de colisões) você precisa. A abordagem baseada em bitmap funciona melhor quando grande parte do seu mundo é estática. Mas também permite implementar coisas como níveis destrutíveis com bastante facilidade.

Como você não mencionou o tipo de jogo que deseja criar, agora cabe a você decidir se uma abordagem de colisão baseada em bitmap será ou não benéfica para o seu jogo. Boa sorte.


Na minha experiência, a questão da superfície normal é bastante trivial em comparação com a determinação real do impulso angular após um impacto, em um sistema de detecção de colisão com pixel perfeito. Geralmente, o PPCD não é usado para jogos que exigem esse tipo de nível de detalhe, provavelmente porque torna as coisas muito mais difíceis do que a física baseada em vetores, nesse sentido. O outro problema que experimentei com essa abordagem foi a possibilidade de ficar "paralisado" quando você gira seu personagem em determinadas posições do seu nível. O Box2D e similares lidam com isso afastando os centróides quando estão muito próximos.
Engenheiro

muito obrigado! Não pretendo fazer desvios, então acho que está tudo bem. Eu não tinha certeza do que fazer com as balas viajando rapidamente, que podem pular paredes em um único quadro. Descobrir se eles cruzaram uma parede parece bom, basta pegar uma amostra da imagem do mapa em um retângulo longo e fino que é o caminho das balas e procurar por pixels coloridos na parede. Mas descobrir o primeiro pixel de parede que ele teria atingido parece um pouco mais difícil. Eu acho que quando a bala dispara, eu transmito o raio e pego um número de pixels de amostra em intervalos curtos ao longo do raio procurando o primeiro pixel da parede e marcando isso como o ponto de impacto?
precisa saber é o seguinte

2
@TerryB: Eu acho que o algoritmo da linha Bresenham funcionará bem aqui. Desenhe a linha até atingir um pixel da parede e esse será o seu ponto de colisão.
bummzack
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.