Detección de colisión 2D para Pinball Game

9

Hasta ahora, en juegos anteriores, he usado una colisión 2D simple con cajas y luego compruebo a nivel de píxel una colisión.

Si realiza un juego de pinball en casi muchos cuadros, la pelota estará en contacto con una pared u otra superficie, ¿hay otro enfoque?

Juan
fuente

Respuestas:

19

En los días (1990), los viejos juegos de pinball se hicieron así:

Hay varias capas para el campo de juego (lo que ves cuando juegas):

ingrese la descripción de la imagen aquí

y varias capas para colisiones:

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

La imagen izquierda en escala de grises es un mapa de colisión para el juego principal, la imagen derecha es un mapa de colisión para un área especial: rampas de pinball.

White = área libre para pelota, índice de color hay 255.

Gray= la pelota será "empujada" lejos de esta zona. índice de color = ángulo del vector para agregar a la posición de la pelota. gris claro = 0 grados gris oscuro = 360 grados

Algunos pseudocódigo:

void do_ball_physics()
{
    while(1)
    {
         byte color = read_pixel_under_ball(ballx, bally); //one pixel read
         if(color == 255) //see remark below
            break;
         float vectorx = sin(color/255.0f * 2.0f * PI);
         float vectory = cos(color/255.0f * 2.0f * PI); 
         ballx += vectorx; //push ball away from one unit
         bally += vectory; //

    }
}

Algunos índices de color especiales también se pueden usar para otra cosa que la colisión, una gama de colores personalizados (por ejemplo, 240 - 255) puede ser reservado para la detección de zonas especiales como spinners, triggers, bumpers, holes, ...

Como puede ver, esto es muy simple. Solo hay unos pocos píxeles "leídos" por fotograma. Debido a esto, puede hacer que la simulación física se ejecute a una velocidad de fotogramas realmente alta, por ejemplo: 200 fps. El uso de una alta velocidad de fotogramas suavizará la simulación y reducirá el "efecto túnel" (esto sucede cuando la pelota va demasiado rápido y pasa por los elementos del canal sin chocar). Esa simplicidad también es lo que hace que los juegos de pinball sean posibles 386 computers(e incluso rápidos 286) en el pasado (entre otros trucos como ciclismo de color, desplazamiento vga y enmascaramiento de sprites ...).

Hoy, la mayoría de los juegos de pinball ya no se hacen así. En cambio, el campo de juego es una escena 2d / 3d que usa polígonos o sprites y las colisiones se realizan contra algunas líneas simplificadas, curvas bezier o esferas que representan una forma simplificada del campo de juego visual.

ejemplo (del pinball visual ):

ingrese la descripción de la imagen aquí

Algunas compañías de juegos usan su propio motor de física, pero otra forma más fácil es usar un motor de física como Box2Do Bullet. La mayoría de los juegos de pinball de iPhone que vi usaban un motor de física preexistente + algunos activos 3d.

tigrou
fuente
... estamos hablando de JavaScript y Canvas aquí, por lo que la operación más lenta posible en este marco es ... dibujar y leer píxeles ... especialmente en dispositivos más lentos. Entonces 4/5 de esta respuesta son simplemente historia / irrelevante. Pero la racionalidad no puede competir con las imágenes.
GameAlchemist
1
Los mapas de colisión se pueden almacenar en una matriz, ¿por qué querrías almacenarlos en algún lienzo? Como dijiste, la primera parte de la respuesta es principalmente para la historia, pero si necesitas implementar un pinball en una CPU de muy bajo nivel (por ejemplo: gsm antiguo), esto todavía es aplicable. En los tiempos modernos, preferiría sugerir el uso de un motor de física como jbox2d o hacer la física usted mismo con colisiones contra segmentos de línea o curvas bezier (si cree que puede escribir tal cosa).
tigrou
La lectura de píxeles en las imágenes también es muy rápida en los navegadores modernos. Algunas de las primeras demostraciones "omg JS es más rápido que C" fueron todos núcleos de procesamiento de imágenes.
Sean Middleditch
¿Cómo se enteró de los mapas de colisión tigrou?
Bemmu
1
Debido a esta nueva versión de los sueños de pinball: pouet.net/prod.php?which=24499 (no por mí). Mire en las fuentes, hay un mapa de colisión del que hablo.
tigrou
1

Los pinballs tienen un conjunto muy rico de física, no solo agujeros o paredes, sino también elementos que reaccionan (golpean hacia atrás) o una superficie irregular donde la pelota se ralentiza y luego recupera su velocidad.

Si desea crear un buen pinball, el camino a seguir es utilizar una detección de colisión en 3D o un sistema a medida con cada objeto colisionable que tenga un método con parámetros de distancia y velocidad, devolviendo velocidades cambiadas.

Markus von Broady
fuente
¿Por qué dice detección de colisión en 3D qué beneficios tiene esto sobre 2D?
John
@John Me imagino un buen pinball como un juego en 3D con rampas, etc. Podrías programar estas rampas en 2D y escalar la pelota hacia arriba cuando pasa por la rampa y hacia abajo cuando se caiga, pero en este caso todavía es una 3D. juego, solo agrega la dimensión Z por ti mismo.
Markus von Broady
1

Hice un juego de pinball hace un tiempo; también estaba basado en píxeles. Tenía un mapa de colisión que solo contenía los datos de colisión. Una colisión aproximada normal fue fácil de encontrar:

Tome el área del mapa de colisión superponiendo la pelota, encuentre el centro, forme el vector desde ese punto hasta el centro de la pelota, luego normalice.

Espero que te den algunas ideas :)

salvaje
fuente
1

Primero, si haces un juego de pinball, lo más probable es que necesites más detección de colisión de CÍRCULO delimitador que el BOX de límite :-)
Dada la complejidad de la física involucrada en un pinball de pleno derecho, sugeriría buscar un motor físico 2D existente. Box2D tiene una buena reputación en JavaScript, puede haber otros, pero no encontré ninguno bueno (y gratuito).
Rq1: Ciertamente usa (como lo hago) la división clásica en su juego entre actualización y sorteo. Y usa un temporizador (setInterval / setTimeout) y / o RequestAnimationFrame para llamar a la actualización, luego dibuja, de manera regular. Un pinball podría ser el tipo de juego en el que desea tener una actualización de conducción del temporizador y otra que impulse el sorteo, para que pueda ajustar la velocidad de cada uno de forma independiente, para trabajar en una amplia gama de dispositivos. Debido a que no puede simplemente soltar (actualizar + dibujar) si el dispositivo es demasiado lento: si el tiempo entre dos actualizaciones (dt) se vuelve demasiado largo, el motor físico podría perder una colisión.

GameAlchemist
fuente
0

Puede echar un vistazo a pinball visual vs pinball futuro para el tema 2d vs 3d. Si juegas pinball visual (todo está hecho en 2d), entonces juega pinball futuro, o algo así como Zen Pinball, sientes la diferencia en cómo juegan. Personalmente prefiero el 3d, pero su proyecto puede ser más adecuado para 2d, solo usted podría decidir eso

ProtoJazz
fuente