Mapa de altura do terreno variável do Sidescroller para caminhada / colisão

7

Eu tenho brincado com a mudança de ladrilhos inclinados no XNA e é semi-funcional, mas não completamente satisfatório. Também estive pensando que ter conjuntos de declives predeterminados pode não me dar um terreno que pareça "orgânico" o suficiente. Há também o problema de ter que construir vários tipos diferentes de ladrilhos para cada inclinação quando estão encadeados (apenas ladrilhos de 45 graus encadearão perfeitamente como eu o entendo).

Eu tinha pensado em, de alguma maneira, procurar correntes conectadas de ladrilhos inclinados e tratá-lo como um novo triângulo grande, pois estava tendo problemas com falhas nas bordas onde os ladrilhos inclinados se conectam. Mas, isso leva de volta ao problema de limitar a curvatura do terreno.

Então ... o que eu gostaria de fazer agora é criar uma imagem ou textura simples do terreno de um nível (ou seção do nível) e gerar um mapa de altura simples (dos Y's para cada X) para o terreno. A posição Y do jogador seria apenas atualizada com base na posição X.

Existe uma maneira simples de fazer isso (ou uma maneira melhor de resolver esse problema)? O principal problema que posso ver com esse método é o caso em que há áreas acima do solo que podem ser percorridas. Talvez exista uma maneira de apenas mapear todas as áreas que podem ser percorridas no solo?

Eu estive analisando este bit útil de código: http://thirdpartyninjas.com/blog/2010/07/28/sloped-platform-collision/, mas preciso de uma maneira de gerar os pontos / vetores reais.

Edição: Eu tentei pré-gerar caminhos inclinados usando o link que eu postei, mas agora estou convencido de que devo usar a colisão por pixel, como você sugeriu. Eu estive analisando o exemplo em: http://create.msdn.com/en-US/education/catalog/tutorial/collision_2d_perpixel e estou tentando descobrir como ajustar o sprite após a detecção de uma colisão. Como David sugeriu, fiz alguns pontos do sensor (pés, lados, centro inferior etc.) e posso detectar facilmente quando esses pontos realmente colidem com partes não transparentes de uma segunda textura (inclinação simples). Estou tendo problemas com o algoritmo de como realmente ajustaria a posição do sprite com base em uma colisão.

Digamos que eu detecte uma colisão com a inclinação no pé direito do sprite. Como digitalizar os dados da textura da inclinação para encontrar a posição Y para colocar o pé do sprite, para que ele não fique mais dentro da inclinação? O modo como ele é armazenado como uma matriz 1D no exemplo é um pouco confuso, devo tentar armazenar os dados como uma matriz 2D?

Também notei que várias pessoas mencionam que é melhor separar as verificações de colisão horizontal e verticalmente, por que exatamente?

Grilo Falante
fonte

Respostas:

12

Não acho que você deva tentar converter o mapa inteiro em um único mapa de altura, exatamente por causa do problema que você descreveu. Os mapas podem ter complexidade arbitrária que você não seria capaz de representar em um mapa de altura.

Mas você também não precisa ter uma inclinação fixa para cada tipo de ladrilho. Você pode armazenar informações de colisão por pixel para cada tipo de bloco ou computá-lo no canal alfa do bloco e usá-lo para determinar onde o personagem deve ficar a cada momento, com base nos blocos que ele está atualmente cruzando. Aqui está um exemplo dos dados de colisão para um bloco:

insira a descrição da imagem aqui

Usando esse esquema, você pode ter qualquer tipo de inclinação que desejar, variando a máscara de colisão do ladrilho. É assim que os jogos Sonic foram implementados no passado e, como tal, sugiro a leitura da página a seguir na íntegra para uma melhor compreensão:

http://info.sonicretro.org/SPG:Solid_Tiles#Slopes_And_Curves

Então, para processar colisões entre seu personagem e o ambiente, sugiro definir alguns sensores ou pontos de colisão em seu personagem, como os pontos magenta na imagem abaixo:

insira a descrição da imagem aqui

Por exemplo, os sensores superiores podem ser usados ​​para detectar e reagir a colisões com o teto, os sensores do meio podem ser usados ​​para detectar e reagir a colisões contra paredes e os sensores inferiores podem ser usados ​​para detectar colisões com o piso e determinar a altura correta para o jogador. Movendo os sensores do meio para cima e para baixo, você pode controlar a inclinação de uma ladeira antes que o jogador não possa mais escalá-la.

Outro truque interessante que você pode fazer com os sensores inferiores, depende de quantos deles estão colidindo com o chão, é possível detectar quando o jogador está perto de uma borda e, possivelmente, reproduzir uma animação diferente, como a imagem abaixo.

insira a descrição da imagem aqui

David Gouveia
fonte
Obrigado pela resposta, tentei uma abordagem diferente ao formar caminhos pré-gerados, mas estou tentando agora. Eu editei minha postagem acima, mas é realmente uma pergunta diferente, por isso vou publicá-la como uma pergunta separada.
Grilo Falante