¿Cómo manejo la detección de colisión isométrica?

14

Me gustaría hacer un juego de plataformas isométrico de carrera-salto. El jugador debe poder saltar sobre plataformas sobre el piso, golpear el costado de objetos, etc.

Usaré un motor de juego 2D, así que no me gustaría emular una colisión 3D completa para dimensiones que no estoy usando.

Estoy pensando que los objetos en el juego deben colocarse usando: X, Y, ancho, alto y Z para la profundidad.

Usando esos valores, ¿cómo debo detectar colisiones?

jdeseno
fuente
Sé que esta es una pregunta general, pero me gustaría obtener respuestas más detalladas o enlaces a buenos recursos de aprendizaje.
jdeseno

Respuestas:

19

2 opciones:

  • Podrías tratarlo como un juego en 3D con una cámara ortográfica fija. Entonces podría usar cualquier recurso / libro / tutorial / biblioteca estándar de juegos 3D. Incluso si se representa en 2D con sprites, las matemáticas para el movimiento, etc., seguirían siendo 3D detrás de escena. Esto le daría los resultados más precisos.

  • Podrías tratarlo como un juego 2D de arriba hacia abajo, con una propiedad de altura adicional. Por ejemplo, imagine una cuadrícula 2D donde cada mosaico tiene un valor de altura. Cuando te mueves de una ficha a otra, solo dejas que un personaje pase a una ficha particular si los pies del personaje están por encima o igual a la altura de esa ficha, pero si están saltando y la gravedad los hace caer encima de una ficha, tú deja que permanezcan allí. Con un poco más de trabajo, podría hacerlo para poder caminar debajo de los puentes, etc.

Iain
fuente
4

Hay muchas maneras de simplificar esto. Por ejemplo, si no permitiste capas (por ejemplo, un puente sobre el que puedes caminar tanto por encima como por debajo, podrías hacer toda la detección de colisión en dimensiones X / Y, donde filtrar el conjunto de colisión a cualquier altura + profundidad o mas alto.

ironfroggy
fuente
2

Si el juego se basa en una cuadrícula rectangular, esta cuadrícula define tus ejes X / Y. Y Z se puede usar para la altura.

Las colisiones son más o menos tan fáciles como cualquier juego 2D basado en fichas.

Luego solo necesita convertir de la cuadrícula a coordenadas de pantalla isométricas para renderizar. Esto es bastante sencillo, pero es posible que deba pensar en calcular los valores de 'profundidad', para fines de clasificación (renderizar la escena isométrica de atrás hacia adelante)

bluescrn
fuente
Usar Z para la altura va en contra del instinto, pero es lo correcto en los juegos 2D de arriba hacia abajo. entonces puedes reutilizar el código entre juegos de lado a lado y de arriba hacia abajo.
Iain
2

Buscando en Google encuentro esta demostración: http://planetskill.com/iso/

WASD para moverse. Barra espaciadora para saltar

Solo implementa la colisión con el eje arriba / abajo, pero agregar la otra colisión debería ser fácil:

Si la posición arriba / abajo del siguiente paso es más alta que su máximo, simplemente no se mueva. Esto también debería permitirle implementar el salto de una manera fácil.

Código de muestra aquí: http://gist.github.com/478997

NocturnDragon
fuente
2

Todas las anteriores. Isométrico es solo una cuadrícula 2D cortada, así que trátelo como un mapa de mosaico 2D y piense en una forma de codificar la profundidad. ¿Cómo harías eso en un juego 2D normal (ser capaz de ir detrás o delante de los bloques cuando 'saltas'? O almacenarías una profundidad por ficha (profundidad buffer-> z buffer) o usarías múltiples capas , o, si quiere más elegante, implementaría una devolución de llamada por tipo de mosaico (o posición de mapa) y podría hacer lo que quiera, verificar la profundidad, verificar el equipo, deformar el reproductor, hacer que el jugador se mueva lentamente hacia arriba, formatear HD.

Kaj
fuente
Buena respuesta Kaj: este es el quid de la cuestión, me sorprende que nadie más lo haya mencionado. Esto es siempre lo que confunde a los novatos sobre la isometría, en lo que respecta a la física.
Ingeniero
1

Bueno, podría tener una capa de colisión separada por encima de su nivel que no sea visible y usarla para verificar la colisión. También puede usar esto para varias capas siempre que sepa en qué capa está el jugador;)


fuente