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:
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.
fuente
Respuestas:
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:
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.
fuente