Respuestas:
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):
y varias capas para colisiones:
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 ):
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 Box2D
o Bullet
. La mayoría de los juegos de pinball de iPhone que vi usaban un motor de física preexistente + algunos activos 3d.
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.
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 :)
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.
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