Creando efectos similares de Geometry Wars en 2D solamente

Quiero crear un juego con efectos similares al de "Geometry Wars" … para aquellos que nunca han jugado el juego, básicamente, se realizan cantidades masivas de efectos de "flexión" y "deformación" en el background durante explosiones y pulsos. .

Aquí hay una foto:

enter image description here

La cuadrícula es normalmente un grupo de cuadrados (cuadrados perfectos) en una cuadrícula perfecta. Cuando ocurren ciertos efectos, la cuadrícula se estira y crea efectos sorprendentes.

Ahora, bash crear un juego usando mi propio motor 2D desde cero. ¿Es posible falsificar efectos 3D como este para mis sprites? ¿Hay algún tipo de efecto que pueda hacer para hacer esto?

Implementé esto usando un sistema de física muy simple en Flash hace unos 5 años.

De memory:

Estructura basica

La cuadrícula es una capa de background intangible. Puede verse afectado por otros elementos físicos, pero no puede afectarlos.

Cada entidad física tiene un factor de "deformación gravitatoria". Los agujeros negros son muy negativos (tiran de la networking hacia ellos), las balas son ligeramente positivas (empujan la cuadrícula lejos de ellos), la nave es positiva fuerte, etc.

La rejilla de background se puede considerar una serie de líneas conectadas por una cuadrícula cuadrada de nodos en las uniones. Estos nodos tienen una position de señal conocida, un valor de resistencia (para la física del resorte) y, por supuesto, su position y velocidad actuales.


Los nodos

Una vez por pase (típicamente una vez por cuadro para resultados suaves), para cada entidad física que tiene una deformación de gravedad distinta de cero (utilicé un logging / cancelación de logging en el sistema de generación / muerte para evitar iteraciones extrañas), para cada uno de los nodos que están dentro de un radio de efecto dado, calcule su extracción con una fórmula simple como PullVector = NormalisedDirection * gravityWarpFactor / (Distance*Distance)
Dónde:
NormalisedDirection es un vector normalizado (magnitud = 1) que indica la position del object relativo al nodo.
gravityWarpFactor es el Warp Warp previamente mencionado, único para cada tipo de entidad. Distance es la distancia escalar entre el nodo y la entidad.

Por la sum de todos los vectores de arrastre en un nodo dado por todas las entidades cercanas le dará la fuerza general ejercida sobre él.

Luego, para cada nodo, puede usar la física básica de los muelles para moverlos desde su position actual en la dirección en la que están siendo tirados, a la vez que proporciona resistencia. QUIEREN volver a su position original, pero la fuerza constante puede alejarlos. (Como tirar de una goma elástica)


La cuadrícula

Una vez que haya calculado la position de cada nodo, puede renderizar las líneas conectadas a sus vecinos. En flash, hice una connection lineal simple a cada nodo adyacente, pero puede ir de lujo si lo desea y conectarlos mediante curvas de bezier a su segundo vecino, utilizando el vecino inmediato como punto de control.


Yendo de lujo

Como mencioné antes, no tiene que ser lineal con las líneas de la cuadrícula. Splines y Beziers pueden ser muy geniales.

Además, si miras las líneas en Geometry Wars, ves que son alternativas entre líneas gruesas y delgadas. Esto se puede implementar agregando una propiedad de 'espesor' a cada nodo, y para las líneas trazadas entre ellos, elija el valor de espesor más alto o más bajo de los dos nodos para determinar el peso de la línea.

Alternativamente, si quisieras ir realmente de lujo y get una apariencia de estilo de cómic, podrías crear una línea desigual que gradúe su grosor a medida que se acerca al nodo.

Una última cosa que hice, que realmente le da un impacto extra al efecto visual de la deformación gravitatoria es alterar el balance entre los altavoces izquierdo / derecho en function de dónde se agrupan los nodos. Una forma simple de hacerlo es calcular el valor promedio de X de la position actual del nodo, en comparación con el valor X promedio de la position original del nodo (que en la mayoría de los casos será el centro de la pantalla). Si el promedio es mayor o menor que el original, le dirá si los nodos se agrupan en los lados izquierdo y derecho de la pantalla.