Detecção de colisão 2D para Pinball Game

9

Até agora, em jogos anteriores, usei colisão 2D simples com caixas e depois verifiquei no nível de pixel uma colisão.

Se jogar um jogo de pinball em quase muitos quadros, a bola estará em contato com uma parede ou outra superfície, então existe outra abordagem?

John
fonte

Respostas:

19

Na época (1990), velhos jogos de pinball eram feitos assim:

Existem várias camadas para o playfield (o que você vê ao jogar):

insira a descrição da imagem aqui

e várias camadas para colisões:

insira a descrição da imagem aqui insira a descrição da imagem aqui

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 ):

insira a descrição da imagem aqui

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 Box2Dou 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.

tigrou
fonte
... estamos falando de javascript e canvas aqui, então a operação mais lenta possível nessa estrutura é ... desenhar e ler pixels ... especialmente nos dispositivos mais lentos. Portanto, 4/5 desta resposta são simplesmente históricos / irrelevantes. Mas a racionalidade não pode competir com as imagens.
GameAlchemist
11
Os mapas de colisão podem ser armazenados em uma matriz. Por que você deseja armazená-los em alguma tela? Como você disse, a primeira parte da resposta é principalmente para a história, mas se você precisar implementar um pinball em uma CPU muito baixa (por exemplo: gsm antigo), isso ainda será aplicável. Nos tempos modernos, eu prefiro sugerir o uso de um mecanismo de física como o jbox2d ou fazer a física sozinho com colisões contra segmentos de linhas ou curvas mais claras (se você acha que é capaz de escrever uma coisa dessas).
usar o seguinte
A leitura de pixels nas imagens também é muito rápida nos navegadores modernos. Alguns dos primeiros demos "omg JS é mais rápido que C" eram todos kernels de processamento de imagens.
23812 Sean Sean Middleditch
Como você aprendeu sobre os mapas de colisão tigrou?
Bemmu
11
Por causa desse remake dos sonhos do pinball: pouet.net/prod.php?which=24499 (não por mim). Procure nas fontes, o mapa de colisão de que falo está lá.
Tigrou
1

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.

Markus von Broady
fonte
Por que você diz na detecção de colisão 3D, o que é melhor para 2D?
John
@ John Imagino um bom pinball como um jogo 3D com rampas, etc. Você pode programar essas rampas em 2D e escalar a bola para cima quando ela passar por cima da rampa e para baixo quando cair, mas neste caso ainda é uma 3D jogo, você apenas adiciona a dimensão Z sozinho.
Markus von Broady
1

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 :)

wildbunny
fonte
1

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.

GameAlchemist
fonte
0

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

ProtoJazz
fonte