¿Cómo crear una detección realista de colisión en un juego de rol 2D?

9

Siempre quise crear un juego de rol 2D anticuado como Star Ocean, Final Fantasy, Sword of Mana e incluso la serie "Tales of", y supongo que mucha gente lo hace. Pero incluso antes de escribir una sola línea de código, hice mucha investigación, dibujo y pruebas.

He encontrado casi todas las respuestas a mis preguntas, pero hay un problema que no he podido resolver: ¿cómo se crea una detección de colisiones realista pero simple , como en los juegos que mencioné antes?

Ya conozco varias formas de calcular la detección de colisiones, mira los siguientes ejemplos:

Ejemplos de detección de colisión

Ninguno de estos satisface mis necesidades.

  • Las colisiones basadas en azulejos son demasiado simples y se adaptan más a un Zelda que a un Star Ocean. Además, el dibujo de cada mosaico debe llenar todo el espacio para parecer realista.
  • Pixel-perfect tiene demasiadas limitaciones. Si su ficha tiene algunos píxeles aquí y allá, lo más probable es que el jugador se quede atascado en el medio de la nada (es decir: en algunos juegos se queda atascado en una raíz de árbol de 2 píxeles de ancho).
  • Y las máscaras binarias usan demasiada memoria y configuraciones imo.

He leído mucha documentación pero nunca encontré algo que me pareciera bien. Y todas mis pruebas no se parecían mucho a lo que solía jugar. Entonces, si tiene buenos enlaces o tutoriales sobre cómo evolucionó el juego de rol 2D, hágamelo saber.

Aymerico
fuente
2
¿Qué entorno estás desarrollando para que las máscaras de colisión lleven demasiada memoria? Eso realmente no es una preocupación para la mayoría de los sistemas modernos, y las máscaras de colisión realmente suenan como lo que estás buscando.
Gregory Avery-Weir
Estoy desarrollando en PC la mayor parte del tiempo con XNA, pero recientemente he estado pensando en comenzar un proyecto en WP7. El problema que tuve con las máscaras de colisión fue que, usando una resolución pequeña, actuaba exactamente como lo haría un píxel perfecto, al hacer que mi personaje se atascara en una esquina, por ejemplo. Entonces, a menos que use la curva de Bézier para un movimiento suave, debe tener mucho cuidado con la creación de la máscara.
Aymeric

Respuestas:

9

Los N Tutoriales pueden ayudar aquí. Es cierto que son para un juego de plataformas de estilo arcade, pero funcionarán igual de bien para un juego de rol de vista superior; simplemente no apliques la gravedad. La premisa es probar la colisión en una colección de formas básicas: círculos, cuadros delimitadores alineados con ejes, líneas, puntos, etc.

Luego, de alguna manera, decora su mundo con estos (tal vez a través de un editor de nivel personalizado) o los genera automáticamente (se ajusta a un cuadro o círculo más cercano), o ambos (predeterminado a cuadro / círculo generado automáticamente, y permite que un diseñador modifique) .

Donde trabajo, hemos hecho bastantes juegos de plataformas y algunos juegos de exploración de arriba hacia abajo. Los hemos estado haciendo desde los días de GBA. La mayoría de las veces usamos AABB para personajes y objetos, ajustables en un editor de sprites, y nos volvemos locos aquí, permitiendo un montón de cajas por sprite, algunas con diferentes propósitos. Podríamos tener:

  • uno o más cuadros de colisión, que describen la forma del objeto para toparse con cosas;
  • posiblemente muchas "cajas de ataque" que solo aparecen cuando estás en medio de un ataque (y animas con el sprite), tal vez incluso dos o tres por arma, dependiendo;
  • algunas "cajas vulnerables" que recibirán daño cuando sean golpeadas por las cajas de ataque de otros; de manera predeterminada, usamos la caja de colisión, pero las cajas vulnerables tienden a sentirse mejor cuando son más pequeñas que la caja de colisión, y podemos permitir para daños por ubicación de esta manera
  • uno o más "recuadros de activación" en IA que describen la región de detección para la IA: atacarán si el jugador está en esta región, por ejemplo.

Los niveles son principalmente cadenas de segmentos de línea; Tenemos un poco de metadatos por segmento para describir superficies dañinas o resbaladizas, etc.

Entonces, la mayor parte de la detección y respuesta de colisión se convierte en AABB-vs-AABB o AABB-vs-segmento. Ocasionalmente, lanzamos un círculo contra algo para un proyectil, aunque a menudo un AABB también lo hará aquí.

No necesita muchas formas básicas para que las cosas se vean bien y se comporten bien, algunas funcionarán, siempre que pueda modificarlas e iterarlas.


Además, no se sienta mal por combinar sistemas; La colisión basada en mosaicos puede ser excelente en algunas áreas (representando la mayoría de su mundo) pero horrible para las interacciones objeto-objeto. Esta bien; ¡use un sistema diferente para object-vs-object! Escribir para las interacciones entre los dos sistemas puede ser más fácil de lo que piensas.

leander
fuente