Rilevamento di collisioni 2D per il gioco del flipper


9

Finora nei giochi precedenti ho usato una semplice collisione 2D con caselle, quindi ho verificato a livello di pixel una collisione.

Se si crea un gioco di flipper in quasi molti fotogrammi, la palla entrerà in contatto con un muro o un'altra superficie, quindi c'è un altro approccio?

Risposte:


19

Ai tempi (1990), i vecchi giochi di flipper erano fatti così:

Esistono diversi livelli per Playfield (cosa vedi quando giochi):

inserisci qui la descrizione dell'immagine

e diversi strati per collisioni:

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

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

inserisci qui la descrizione dell'immagine

Alcune società di giochi usano il proprio motore fisico, ma un altro modo più semplice è usare un motore fisico come Box2Do Bullet. La maggior parte dei giochi di flipper per iPhone che ho visto utilizzavano un motore fisico preesistente + alcune risorse 3d.


... stiamo parlando di javascript e canvas qui, quindi l'operazione più lenta possibile in questo framework è ... disegnare e leggere pixel ... specialmente sui dispositivi più lenti. Quindi 4/5 di questa risposta sono semplicemente storia / irrilevanti. Ma la razionalità non può competere con le immagini.
GameAlchemist,

1
Le mappe di collisione possono essere archiviate in un array, perché dovresti memorizzarle in alcune aree di disegno? Come hai detto, la prima parte della risposta è principalmente per la storia, ma se hai bisogno di implementare un flipper su una CPU di fascia molto bassa (es: vecchio gsm), questo è ancora applicabile. Nei tempi moderni, vorrei piuttosto suggerire di usare un motore fisico come jbox2d o fare la fisica da soli con collisioni contro segmenti di linea o curve più bezier (se pensi di essere in grado di scrivere una cosa del genere).
tigrou,

La lettura di pixel nelle immagini è anche molto veloce nei browser moderni. Alcune delle prime demo "omg JS è più veloce di C" erano tutte kernel di elaborazione delle immagini.
Sean Middleditch,

Come sei venuto a conoscenza delle mappe di collisione tigrou?
Bemmu,

1
A causa di questo remake dei sogni di flipper: pouet.net/prod.php?which=24499 (non da me). Cerca nelle fonti, la mappa delle collisioni di cui parlo ci sono.
Tigrou,

1

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.


Perché dici il rilevamento delle collisioni 3D quali sono i vantaggi rispetto al 2D?
Giovanni

@John Immagino un buon flipper come un gioco 3D con rampe ecc. Potresti programmare queste rampe in 2D e scalare la palla quando passa sopra la rampa e verso il basso quando cade da solo, ma in questo caso è ancora un 3D gioco, aggiungi semplicemente la dimensione Z da solo.
Markus von Broady,

1

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


1

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.


0

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.