2D-Kollisionserkennung für Flipperspiel

9

Bisher habe ich in früheren Spielen eine einfache 2D-Kollision mit Kästchen verwendet und dann auf Pixelebene nach einer Kollision gesucht.

Wenn Sie ein Flipperspiel in fast vielen Frames machen, hat der Ball Kontakt mit einer Wand oder einer anderen Oberfläche. Gibt es also einen anderen Ansatz?

John
quelle

Antworten:

19

Damals (1990) wurden alte Flipperspiele wie folgt hergestellt:

Es gibt mehrere Ebenen für das Spielfeld (was Sie beim Spielen des Spiels sehen):

Geben Sie hier die Bildbeschreibung ein

und mehrere Schichten für Kollisionen:

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

Das linke Graustufenbild ist eine Kollisionskarte für das Hauptspiel, das rechte Bild ist eine Kollisionskarte für ein spezielles Gebiet: Flipper-Rampen.

White = freie Fläche für Kugel, Farbindex gibt es 255.

Gray= Ball wird aus dieser Zone "weggeschoben". Farbindex = Winkel des Vektors, der zur Ballposition hinzugefügt werden soll. hellgrau = 0 Grad dunkelgrau = 360 Grad

Ein Pseudocode:

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; //

    }
}

Einige spezielle Farbindizes können auch für etwas verwendet werden , sonst als Kollision, eine benutzerdefinierte Farbbereich (zB: 240-255) kann zur Erkennung Sonderzonen wie reserviert spinners, triggers, bumpers, holes, ...

Wie Sie sehen können, ist dies sehr einfach. Pro Frame werden nur wenige Pixel "gelesen". Aus diesem Grund können Sie die Physiksimulation mit einer wirklich hohen Framerate ausführen, z. B. 200 fps. Die Verwendung einer hohen Framerate glättet die Simulation und reduziert das "Tunneln" (dies geschieht, wenn der Ball zu schnell geht und durch die Elemente läuft, ohne zu kollidieren). Diese Einfachheit ermöglicht auch reibungslose Flipperspiele in früheren Zeiten 386 computers(und sogar schnell 286) (neben einigen anderen Tricks wie Farbwechsel, VGA-Scrolling und Sprite-Maskierung ...).

Heutzutage werden die meisten Flipperspiele nicht mehr so ​​gemacht. Stattdessen ist das Spielfeld eine 2D / 3D-Szene mit Polygonen oder Sprites, und es werden Kollisionen mit einigen vereinfachten Linien, Bezierkurven oder Kugeln durchgeführt, die eine vereinfachte Form des visuellen Spielfelds darstellen.

Beispiel (vom visuellen Flipper ):

Geben Sie hier die Bildbeschreibung ein

Einige Spielefirmen verwenden ihre eigene Physik-Engine, aber eine andere, einfachere Möglichkeit ist die Verwendung einer Physik-Engine wie Box2Doder Bullet. Die meisten iPhone-Flipperspiele, die ich gesehen habe, verwendeten eine bereits vorhandene Physik-Engine + einige 3D-Assets.

Tigrou
quelle
... wir sprechen hier von Javascript und Canvas, daher ist der langsamste Vorgang, der in diesem Framework möglich ist, ... das Zeichnen und Lesen von Pixeln ... insbesondere auf langsamsten Geräten. 4/5 dieser Antwort sind also einfach Geschichte / irrelevant. Aber Rationalität kann nicht mit Bildern konkurrieren.
GameAlchemist
1
Kollisionskarten können in einem Array gespeichert werden. Warum sollten Sie sie auf einer Leinwand speichern? Wie Sie sagten, bezieht sich der erste Teil der Antwort hauptsächlich auf die Geschichte. Wenn Sie jedoch einen Flipper auf einer sehr niedrigen CPU (z. B. altes GSM) implementieren müssen, gilt dies weiterhin. In der heutigen Zeit würde ich eher vorschlagen, eine Physik-Engine wie jbox2d zu verwenden oder die Physik selbst mit Kollisionen gegen Liniensegmente oder Bezier-Kurven durchzuführen (wenn Sie glauben, dass Sie so etwas schreiben können).
Tigrou
Das Lesen von Pixeln in Bildern ist in modernen Browsern ebenfalls sehr schnell. Einige der ersten "omg JS ist schneller als C" -Demos waren alle Bildverarbeitungskerne.
Sean Middleditch
Wie haben Sie von den Kollisionskarten Tigrou erfahren?
Bemmu
1
Aufgrund dieses Flipper-Traum-Remakes: pouet.net/prod.php?which=24499 (nicht von mir). Schauen Sie in Quellen nach, Kollisionskarten, über die ich spreche, sind da.
Tigrou
1

Flipper haben sehr viele physikalische Eigenschaften, nicht nur Löcher oder Wände, sondern auch reagierende Elemente (Rückschläge) oder unebene Oberflächen, auf denen der Ball langsamer wird und dann seine Geschwindigkeit zurückerhält.

Wenn Sie einen guten Flipper erstellen möchten, müssen Sie entweder eine 3D-Kollisionserkennung oder ein selbst zugeschnittenes System verwenden, bei dem jedes kollidierbare Objekt über eine Methode mit Entfernungs- und Geschwindigkeitsparametern verfügt, die geänderte Geschwindigkeiten zurückgibt.

Markus von Broady
quelle
Warum sagen Sie 3D-Kollisionserkennung, was passt dazu über 2D?
John
@ John Ich stelle mir einen guten Flipper als 3D-Spiel mit Rampen usw. vor. Sie könnten diese Rampen in 2D programmieren und den Ball vergrößern, wenn er über die Rampe geht, und nach unten, wenn er selbst zurückfällt, aber in diesem Fall ist es immer noch ein 3D Spiel, fügen Sie einfach Z-Dimension selbst hinzu.
Markus von Broady
1

Ich habe vor einiger Zeit ein Flipperspiel gemacht. es war auch pixelbasiert. Ich hatte eine Kollisionskarte, die nur die Kollisionsdaten enthielt. Eine ungefähre Kollisionsnormale war leicht zu finden:

Nehmen Sie den Bereich der Kollisionskarte, der den Ball überlappt, suchen Sie die Mitte, bilden Sie den Vektor von diesem Punkt zur Ballmitte und normalisieren Sie dann.

Hoffe das gibt dir ein paar Ideen :)

Wildhase
quelle
1

Erstens, wenn Sie ein Flipperspiel machen, benötigen Sie höchstwahrscheinlich mehr Bounding-CIRCLE-Kollisionserkennung als die Bounding-BOX :-)
Angesichts der Komplexität der Physik, die an einem vollwertigen Flipper beteiligt ist, würde ich vorschlagen, sich anzuschauen vorhandene 2D-Physik-Engine. Box2D hat einen guten Ruf in Javascript, es mag andere geben, aber ich habe keine gute (und kostenlose) gefunden.
Rq1: Sie verwenden sicherlich (wie ich) die klassische Aufteilung in Ihrem Spiel zwischen Update und Draw. Und Sie verwenden einen Timer (setInterval / setTimeout) und / oder RequestAnimationFrame, um update aufzurufen und dann regelmäßig zu zeichnen. Ein Flipper kann die Art von Spiel sein, bei der Sie ein Timer-Fahrupdate und ein anderes die Auslosung aktualisieren möchten, sodass Sie die Rate jedes einzelnen unabhängig voneinander anpassen können, um auf einer Vielzahl von Geräten zu arbeiten. Weil Sie nicht einfach fallen lassen (Update + Zeichnen) können, wenn das Gerät zu langsam ist: Wenn die Zeit zwischen zwei Updates (dt) zu lang wird, kann es sein, dass die Physik-Engine eine Kollision verpasst.

GameAlchemist
quelle
0

Sie könnten einen Blick auf visuelle Flipper gegen zukünftige Flipper für das Thema 2d gegen 3D werfen. Wenn Sie visuellen Flipper spielen (alles ist in 2D gemacht), dann spielen Sie zukünftigen Flipper oder so etwas wie Zen-Flipper. Sie spüren den Unterschied in der Art und Weise, wie sie spielen. Ich persönlich bevorzuge das 3D, aber Ihr Projekt ist möglicherweise besser für das 2D geeignet. Nur Sie könnten das entscheiden

ProtoJazz
quelle