Como lidar com a detecção de colisão isométrica?

14

Eu gostaria de fazer um jogo de plataformas estilo isométrico de salto em corrida. O jogador deve ser capaz de pular em cima de plataformas acima do chão, atingir o lado de objetos etc.

Vou usar um mecanismo de jogo 2D, para não gostar de imitar a colisão 3D completa para dimensões que não estou usando.

Estou pensando que os objetos no jogo devem ser colocados usando: X, Y, largura, altura e Z para profundidade.

Usando esses valores, como devo detectar colisões?

jdeseno
fonte
Sei que esse é um tipo geral de pergunta, mas gostaria de respostas mais detalhadas ou links para bons recursos de aprendizado.
jdeseno

Respostas:

19

2 opções:

  • Você poderia tratá-lo como um jogo em 3D com uma câmera ortográfica fixa. Em seguida, você pode usar quaisquer recursos / livros / tutoriais / bibliotecas de jogos 3D padrão. Mesmo se renderizado em 2D com sprites, a matemática para o movimento etc ainda seria 3D nos bastidores. Isso daria os resultados mais precisos.

  • Você pode tratá-lo como um jogo 2D de cima para baixo, com uma propriedade de altura adicionada. Por exemplo, imagine uma grade 2D em que cada bloco tenha um valor de altura. Ao passar de um ladrilho para outro, você só permite que um personagem passe para um ladrilho específico se os pés do personagem estiverem acima ou iguais à altura desse ladrilho, mas se eles estiverem pulando e a gravidade os derrubar em cima de um ladrilho, você deixe-os permanecer lá. Com um pouco mais de trabalho, você poderia fazê-lo para poder caminhar sob pontes, etc.

Iain
fonte
4

Existem várias maneiras de simplificar isso. Por exemplo, se você não permitir camadas (por exemplo, uma ponte na qual você possa andar por cima e por baixo, poderá fazer toda a colisão detectando nas dimensões X / Y, onde filtrará o conjunto de colisões para qualquer altura ou profundidade ou mais alto.

ironfroggy
fonte
2

Se o jogo for baseado em uma grade retangular, ela definirá seus eixos X / Y. E Z pode ser usado para altura.

As colisões são tão mais ou menos tão fáceis quanto qualquer jogo 2D baseado em blocos.

Então você só precisa converter da grade de volta para coordenadas de tela isométricas para renderização. Isso é bastante direto - mas você pode precisar pensar em calcular valores de 'profundidade', para fins de classificação (renderizando a cena isométrica de trás para frente)

bluescrn
fonte
Usar Z para altura contraria o instinto, mas é a coisa certa a se fazer em jogos 2D de cima para baixo. você pode reutilizar o código entre jogos laterais e de cima para baixo.
Iain
2

Pesquisando ao redor, encontro esta demonstração: http://planetskill.com/iso/

WASD para mover. Barra de espaço para pular

Ele só implementa colisão com o eixo cima / baixo, mas a adição da outra colisão deve ser fácil:

Se a posição cima / baixo da próxima etapa for maior que o seu máximo, não se mova. Isso também deve permitir que você pule de maneira fácil.

Exemplo de código aqui: http://gist.github.com/478997

NocturnDragon
fonte
2

Tudo acima. Isométrico é apenas uma grade 2D cortada, então trate-a como um mapa de blocos 2D e pense em uma maneira de codificar a profundidade. Como você faria isso em um jogo 2D convencional (sendo capaz de ir atrás ou na frente dos blocos ao 'pular'? Você armazenaria uma profundidade por ladrilho (buffer de profundidade-> buffer z) ou usaria várias camadas , ou, se você quiser mais sofisticado, implementaria um retorno de chamada por tipo (ou posição de mapa) e seria capaz de fazer o que quisesse, verificar a profundidade, verificar o equipamento, deformar o player, fazer com que o jogador se movesse lentamente para cima, formatando o HD.

Kaj
fonte
Boa resposta Kaj - sendo esse o cerne da questão, estou surpreso que ninguém mais tenha levantado a questão. É sempre isso que confunde os novatos sobre isometria, no que diz respeito à física.
coordenador
1

Bem, você pode ter uma camada de colisão separada acima do seu nível que não é visível e usá-la para verificar a colisão. Você também pode usar isso para várias camadas, desde que saiba em qual camada o jogador está;)


fonte