Risposte:
Ai tempi (1990), i vecchi giochi di flipper erano fatti così:
Esistono diversi livelli per Playfield (cosa vedi quando giochi):
e diversi strati per collisioni:
L'immagine in scala di grigio a sinistra è una mappa di collisione per il gioco principale, l'immagine a destra è una mappa di collisione per un'area speciale: rampe di flipper.
White
= area libera per palla, indice di colore è 255.
Gray
= la palla verrà "allontanata" da questa zona. indice di colore = angolo del vettore da aggiungere alla posizione della palla. grigio chiaro = 0 gradi grigio scuro = 360 gradi.
Alcuni pseudo-codice:
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; //
}
}
Alcuni indici di colore speciali possono essere usati anche per qualcosa di diverso da collisione, una gamma di colori personalizzati (ad esempio: 240-255) può essere riservato per il rilevamento di zone speciali come spinners
, triggers
, bumpers
, holes
, ...
Come puoi vedere, questo è molto semplice. Vi sono solo pochi pixel "letti" per frame. Per questo motivo puoi far funzionare la simulazione fisica con un frame rate veramente alto, ad es .: 200 fps. L'uso di framerate elevati faciliterà la simulazione e ridurrà il "tunneling" (ciò accade quando la palla va troppo veloce e passa attraverso gli elementi senza scontrarsi). Quella semplicità è anche ciò che rende possibili giochi di flipper lisci 386 computers
(e persino veloci 286
) nei giorni passati (tra alcuni altri trucchi come il ciclismo dei colori, lo scorrimento dei vga e il mascheramento degli sprite ...).
Oggi, la maggior parte dei giochi di flipper non sono più realizzati in questo modo. Invece il campo di gioco è una scena 2d / 3d che utilizza poligoni o sprite e le collisioni sono fatte contro alcune linee semplificate, curve di Bezier o sfere che rappresentano una forma semplificata del campo di gioco visivo.
esempio (dal flipper visivo ):
Alcune società di giochi usano il proprio motore fisico, ma un altro modo più semplice è usare un motore fisico come Box2D
o Bullet
. La maggior parte dei giochi di flipper per iPhone che ho visto utilizzavano un motore fisico preesistente + alcune risorse 3d.
I flipper hanno insiemi di fisica molto ricchi, non solo buchi o pareti, ma anche elementi di reazione (colpire indietro) o superficie irregolare in cui la palla rallenta e poi ritorna alla sua velocità.
Se si desidera creare un buon flipper, la strada da percorrere è utilizzare un rilevamento di collisioni 3D o un sistema auto-personalizzato con ogni oggetto collidabile che abbia un metodo con parametri di distanza e velocità, restituendo le velocità modificate.
Ho fatto una partita a flipper qualche tempo fa; era anche basato su pixel. Avevo una mappa di collisione che conteneva solo i dati di collisione. Una collisione approssimativa normale era facile da trovare:
Prendi l'area della mappa di collisione sovrapposta alla palla, trova il centro, forma il vettore da quel punto al centro della palla, quindi normalizza.
Spero che ti dia qualche idea :)
Prima di tutto, se crei un gioco di flipper, molto probabilmente avrai bisogno di più delimitazione-CIRCLE-rilevamento delle collisioni rispetto al limite BOX one :-)
Data la complessità della fisica coinvolta in un flipper a tutti gli effetti, suggerirei di guardare un motore fisico 2D esistente. Box2D ha una buona reputazione in javascript, potrebbero essercene altri ma non ne ho trovato uno buono (e gratuito).
Rq1: Sicuramente usi (come faccio io) la classica divisione nel tuo gioco tra aggiornamento e disegno. E usi un timer (setInterval / setTimeout) e / o RequestAnimationFrame per chiamare l'aggiornamento, quindi disegnare, in modo regolare. Un flipper potrebbe essere il tipo di gioco in cui si desidera avere un aggiornamento alla guida del timer e un altro alla guida del sorteggio, in modo da poter regolare la frequenza di ciascuno in modo indipendente, per lavorare su una vasta gamma di dispositivi. Perché non puoi semplicemente rilasciare (aggiornamento + disegno) se il dispositivo è troppo lento: se il tempo tra due aggiornamenti (dt) diventa troppo lungo, il motore fisico potrebbe perdere una collisione.
Potresti dare un'occhiata al flipper visivo e al futuro flipper per il soggetto 2d vs 3d. Se giochi a flipper visivo (Tutto è realizzato in 2d), allora giochi a flipper futuro, o qualcosa come Zen Pinball, senti la differenza nel modo in cui giocano. Personalmente preferisco il 3d, ma il tuo progetto potrebbe essere più adatto a 2d, solo tu saresti in grado di decidere