Na época (1990), velhos jogos de pinball eram feitos assim:
Existem várias camadas para o playfield (o que você vê ao jogar):
e várias camadas para colisões:
A imagem em escala de cinza esquerda é um mapa de colisão para o jogo principal, a imagem direita é um mapa de colisão em uma área especial: rampas de pinball.
White
= área livre para bola, índice de cores há 255.
Gray
= bola será "empurrada" para fora desta zona. índice de cores = ângulo do vetor a ser adicionado à posição da bola. cinza claro = 0 graus. cinza escuro = 360 graus.
Algum código pseudo:
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; //
}
}
Alguns índices de cores especiais também pode ser usado para outra coisa do que colisão, uma gama de cores personalizada (por exemplo: 240 - 255) podem ser reservados para a detecção de zonas especiais, como spinners
, triggers
, bumpers
, holes
, ...
Como você pode ver, isso é muito simples. Existem apenas alguns pixels "lidos" por quadro. Por causa disso, você pode fazer a simulação da física rodar em uma taxa de quadros alta real, por exemplo: 200 fps. O uso de alta taxa de quadros suaviza a simulação e reduz o "tunelamento" (isso acontece quando a bola passa muito rápido e passa pelos elementos sem colidir). Essa simplicidade também é o que possibilita jogos suaves de pinball nos dias de hoje 386 computers
(e até mesmo rápido 286
) (entre outros truques, como ciclismo em cores, rolagem vga e mascaramento de sprites ...).
Hoje, a maioria dos jogos de pinball não são mais feitos assim. Em vez disso, o campo de jogo é uma cena 2D / 3D usando polígonos ou sprites e colisões são feitas contra algumas linhas simplificadas, curvas de bezier ou esferas que representam uma forma simplificada de campo de jogo visual.
exemplo (do pinball visual ):
Algumas empresas de jogos usam seu próprio mecanismo de física, mas outra maneira mais fácil é usar um mecanismo de física como Box2D
ou Bullet
. A maioria dos jogos de pinball do iPhone que eu vi estavam usando um mecanismo de física pré-existente + alguns recursos em 3D.
Os pinballs têm conjuntos muito ricos de física, não apenas buracos ou paredes, mas também elementos que reagem (batendo de volta) ou superfície irregular onde a bola diminui a velocidade e recupera a velocidade.
Se você deseja criar um bom pinball, o caminho a seguir é usar uma detecção de colisão 3D ou um sistema personalizado com todos os objetos colidíveis com um método com parâmetros de distância e velocidade, retornando velocidades alteradas.
fonte
Eu fiz um jogo de pinball há um tempo atrás; também era baseado em pixels. Eu tinha um mapa de colisão que continha apenas os dados da colisão. Uma colisão normal aproximada foi fácil de encontrar:
Pegue a área do mapa de colisão sobreposta à bola, encontre o centro, forme o vetor daquele ponto até o centro da bola e normalize.
Espero que te dê algumas ideias :)
fonte
Primeiro, se você faz um jogo de pinball, provavelmente precisará de mais detecção de colisão com CIRCLE-limite do que o da caixa :-)
Dada a complexidade do físico envolvido em um pinball de pleno direito, sugiro que mecanismo físico 2D existente. Box2D tem uma reputação bastante em javascript, pode haver outros, mas eu não encontrei nenhum bom (e gratuito).
Rq1: Você certamente usa (como eu) a divisão clássica em seu jogo entre atualização e empate. E você usa um timer (setInterval / setTimeout) e / ou RequestAnimationFrame para chamar a atualização e, em seguida, desenhar regularmente. Um pinball pode ser o tipo de jogo em que você deseja atualizar um cronômetro e outro o empate, para que você possa ajustar a taxa de cada um independentemente, para trabalhar em uma ampla variedade de dispositivos. Como você não pode simplesmente soltar (atualizar + desenhar) se o dispositivo estiver muito lento: se o tempo entre duas atualizações (dt) se tornar muito longo, o mecanismo físico poderá perder uma colisão.
fonte
Você pode dar uma olhada no pinball visual contra o pinball futuro para o assunto 2d vs 3d. Se você joga pinball visual (tudo é feito em 2D), joga pinball futuro, ou algo como Zen Pinball, você sente a diferença na maneira como eles jogam. Pessoalmente, prefiro o 3d, mas seu projeto pode ser mais adequado para 2d. Somente você poderá decidir que
fonte