Was ist in einer Projektilphysik-Engine enthalten?

In diesem Artikel untersuchen wir die Verwendung der Physik, um Projektileffekte in Spielen wie Angry Birds zu simulieren. Wir werden die Grundlagen des Einsatzes der 2D-Physik im Weltraum der Spiele betrachten, z. B. Körper erstellen und Impulse und Kräfte anwenden.

Physikmaschinen

Warum eine Physik-Engine verwenden? Was macht es eigentlich?? 

Eine Physik-Engine hilft uns, zwei sehr wichtige Dinge für unser Spiel zu tun:

  1. Erkennen Kollisionen zwischen unseren Objekten im Spiel.
  2. Simulieren die Kräfte und die daraus resultierenden Bewegungen unserer Objekte aus diesen Kollisionen…

Kollisionserkennung: Spiele würden nicht viel Spaß machen, wenn Ihr Charakter durch den Boden fiel, bevor Sie springen konnten, oder wenn Sie einen Feind mit dem Fuß treffen, der durchgefallen ist. Die Kollisionserkennung mit einer Physik-Engine ermöglicht ein sehr genaues Abhören der Kontakte und ermöglicht die Simulation von Interaktionen zwischen Objekten Kräfte.

Simulation erzwingen:Was soll nach einer Kollision passieren? Die Spielelogik könnte aufgerufen werden, Sie könnten springen, das andere Spielobjekt könnte springen, oder Sie können sich einfach nicht weiter bewegen. Dies geschieht alles hinter den Kulissen mit den berechneten Kräften des Motors. Aber Kräfte sind nicht auf Kontakt beschränkt. Andere Kräfte wie Schwerkraft und Impulse können auftreten, ohne dass sich Gegenstände tatsächlich berühren. Kräfte beeinflussen Aktionen im Spiel und die Bewegung von Objekten, Charakteren und sogar dem Weltraum selbst.

.

Wir schauen uns an Wie Physik-Engines funktionieren in Kürze, aber lassen Sie uns zuerst einen Blick darauf werfen Was Motoren, die Sie verwenden möchten, und Warum Sie können sich entscheiden, sie je nach Ihren speziellen Bedürfnissen zu verwenden.

Wahl des Motors

Wenn Sie zum ersten Mal über die Verwendung der Physik in Ihrem Spiel nachdenken, müssen Sie entscheiden, wie Sie das Problem angehen möchten und was Ihr Spiel in Bezug auf die Simulation erfordert. Sie haben zwei Möglichkeiten, Physik zu verwenden:

  1. Verwenden Sie eine vorhandene Physik-Engine.
  2. Erstellen Sie eine benutzerdefinierte Physik-Simulation

Verwenden einer vorhandenen Physik-Engine

Für vordefinierte und einsatzbereite Physik-Engines gibt es mehrere ausgezeichnete Optionen. Eine der beliebtesten Optionen für 2D-Spiele ist Box2D; Es ist eine native C ++ - Engine, die über Wrapper, Ports und Erweiterungen verfügt, die es in nahezu jeder 2D-Plattform verwenden können. Eine andere beliebte Wahl ist Chipmunk 2D, der in verschiedenen Mainstream-Game-Engines wie Cocos2D verwendet wird.

Eine benutzerdefinierte Engine erstellen

In einigen Spielen ist die Verwendung einer vordefinierten Engine nicht unbedingt die optimale Wahl. Die Verwendung einer Physik-Engine kann zu unnötigem Aufwand führen, wenn ihre volle Funktion nicht erforderlich ist. In Fällen wie einfachen Plattformspielern oder Spielen mit Ziegelsteinbrechern, bei denen keine pixelgenaue Kollisionserkennung oder andere Funktionen einer Engine erforderlich sind, werden möglicherweise Ressourcen verbraucht, die anderweitig besser genutzt werden könnten. 

Durch das Erstellen einer eigenen Engine können Sie mehr Flexibilität gegenüber dem Endprodukt erzielen, es kann jedoch auch komplizierter werden, wenn Sie mit mehr als wenigen Instanzen von Zeichen und Objekten arbeiten.

Die Spielschleife

Bevor wir die Eigenschaften und Details einer Physik-Simulation besprechen, schauen wir uns an, wie sie in der Schleife Ihrer Spielszene aufgerufen wird.

Die typische Spielschleife wird für jeden Frame in der folgenden Reihenfolge durchlaufen:

  1. Eingang
  2. Update / Spielelogik
  3. Simulieren Sie die Spielphysik
  4. Bildschirm / Szene rendern

Dies bedeutet, dass die Berechnung der resultierenden Physik die letzte in der Schleife durchgeführte Aufgabe ist, bevor der Bildschirm aktualisiert wird. Dies ist sinnvoll, da der Sinn der Simulation darin besteht, auf das Geschehene im Weltraum des Spiels zu reagieren. 

Beachten Sie, dass dieses Bild zeigt, dass die Physik in jedem Frame Ihrer Spielschleife simuliert wird. Dies kann zu erheblichem Aufwand führen, wenn Ihre Simulation zu groß oder zu kompliziert wird. Aus diesem Grund ist es am besten, die Spielverwaltung und die Aufrufe an die Simulation und ihre Zuhörer begrenzt zu halten. 

Feste Rate vs. Frame-abhängige Physik

Es ist jetzt sinnvoll, zwei verschiedene Methoden zum Abfragen der Physik-Simulation zu diskutieren: Feste vs. Frame-abhängige Raten. Bedenke die (nichtig) Update: Methode konsistent in den meisten Spielschleifen. Diese Schleife wird einmal pro Frame der Spielszene aufgerufen. Wenn Ihre "Physik simulieren" -Methode von aufgerufen wird (nichtig) Update:, Ihre Physik in der Spielwelt hängt von Ihrer Bildrate ab können führen zu abgehackten und unrealistischen Simulationen. In iOS wird dieser Effekt durch die Verwendung von behoben verwendetPreciseCollisionDetection Boolesche Eigenschaft, aber was ist mit anderen Motoren?? 

Betrachten Sie das folgende Codesegment:

 CFTimeInterval timeSinceLast = currentTime - self.lastUpdateTimeInterval; self.lastUpdateTimeInterval = currentTime; if (timeSinceLast> 1) timeSinceLast = 1.0 / 60.0; 

Dieser Code soll Probleme mit dem Deltawert für die Zeit kompensieren. Stellen Sie sich eine Situation vor, in der Sie das Spiel auf Ihrem Telefon gespielt haben und einen Anruf erhalten haben: Es würde Ihrem Spiel helfen, Ihr Delta wieder auf den erwarteten 1/60 (für ein 60-fps-Spiel) zurückzusetzen.. 

Dies ist eigentlich der erste Schritt in einer Diskussion über die Entkopplung der Physiksimulation vom Zeitschritt der (nichtig) Update: Methode. Ein modifiziertes Zeitintervall würde zwar sicherlich zu einem stabileren Physik-Simulationsaufruf beitragen, korrigiert jedoch nicht alle Situationen. Dazu müssten wir eigentlich Löschen Der Physik-Simulationsaufruf wird aus der Game-Rendering-Schleife aufgerufen und ein fester Zyklus erstellt, in dem er ausgeführt werden kann. Zum Beispiel; Wenn Ihr Spiel mit 60 Bildern pro Sekunde laufen soll, legen Sie die Physik so fest, dass sie 60 Mal pro Sekunde simuliert. Diese Entkopplung beseitigt alle Bedenken in Bezug auf das Rendern von Problemen, die in Ihrer Physik-Simulation ruckelndes Feedback verursachen.

Kurz gesagt: Seien Sie gewissenhaft bei der Umsetzung der Physik. Wenn Sie feststellen, dass Sie eine Engine in einer Umgebung verwenden, in der Sie Systemressourcen besteuern, sollten Sie eine physikalische Simulation mit festen Schritten in Betracht ziehen, um die Fairness und Treue zu wahren.

Vom Sprite zum Physik-Körper

EIN Sprite ist ein Bild, das auf dem Bildschirm Ihres Spiels dargestellt wird. Ein Sprite verfügt standardmäßig über keine Eigenschaften in einer Physik-Simulation. Sie können einige der Verhaltensweisen einer physischen Welt "fälschen", indem Sie Eigenschaften eines Sprites wie etwa ein Begrenzungsfeld und einen Kreuzungsaufruf verwenden. Dann müssen Sie jedoch die gesamte resultierende Logik selbst schreiben. Wäre es nicht besser, wenn das Spiel all dies für uns erledigen könnte??

In diesen Ausschnitten erstellen wir ein Sprite:

 SKSpriteNode * sprite = [SKSpriteNode spriteNodeWithImageNamed: @ "image"]; sprite.position = Standort; [self addChild: sprite];

… Und rufen Sie eine Kollision zwischen zwei Sprites auf:

-(void) update: (CFTimeInterval) currentTime / * Wird aufgerufen, bevor jeder Frame gerendert wird * / if (CGRectIntersectsRect (sprite1.frame, sprite2.frame)) // etwas tun

Körperformen

Physik Körper sind "einfache" Formen, die die ungefähre Größe und Form Ihres Sprites definieren oder möglicherweise einen aktiven Bereich Ihres Sprites definieren. Folgendes berücksichtigen:

Ein Physikkörper ist nicht durch das Image Ihres Sprites vorgegeben und ist normalerweise im Spiel nicht sichtbar. Sie erstellen die Form dynamisch, indem Sie häufig eine Methode aufrufen, um entweder die Form zu zeichnen, aus der der Körper besteht, oder indem Sie ein Programm verwenden, das Sie beim Herausziehen und Definieren des Körpers unterstützt. Sie bringen dann den Körper an das Sprite an und erhalten Zugriff auf die simulierten Effekte und Eigenschaften, die diesem Körper zugewiesen sind.

Sie können mehrere Physikkörper an ein einzelnes Sprite gebunden haben. Nehmen Sie zum Beispiel ein Sprite eines Helden, der ein Schwert trägt. Es wäre sinnvoll, einen Körper für den Heldencharakter zu schaffen und einen anderen für das Schwert, das er trägt. Auf diese Weise können Sie eine Spielelogik erstellen, die auf Kollisionen zwischen verschiedenen Körpern basiert. 

Im Pseudocode würde die Logik so aussehen:

// Physiklogik - (ungültig) physicsCollisionDidOccur switch (Kollisionsbitmaske) case (Player || Sword): // nichts tun; brechen; Fall (Spieler || Feind): // autsch !!; brechen; Fall (Schwert || Feind): // Schaden anrichten !!; brechen; default: // nichts tun; brechen; 

Bezug des Physikkörpers zum Sprite

Betrachten Sie die Situation eines Weltraumspiels, in dem Sie ein Heldenschiff und ein feindliches Schiff haben:

Wahrscheinlich möchten Sie den Physikkörper des Players aus zwei Gründen etwas kleiner machen als das Basis-Sprite-Image:

Verbesserte visuelle Kollision: Wenn ein Spieler in Ihrem Spiel mit einem Objekt kollidiert, werden die Sprite-Bilder an der Berührungsstelle zeitweise überlappen, was visuell gut aussieht. (Weiter zu diesem Punkt: Behalten Sie beim Zeichnen von Z-Werten den Charakter Ihres Spielers vorne in der Szenenhierarchie.)

Vom Benutzer wahrgenommene Fairness: Um zu versuchen, dass sich Ihr Spiel für den Spieler "fair" anfühlt, lassen Sie den kollidierenden Körper auf den Großteil des Objekts beschränkt und halten Sie ihn von äußeren Vorsprüngen wie der Rückenflosse des obigen Bildes fern. Auf diese Weise gibt es keine "billigen Treffer", um die Spieler Ihres Spiels zu ärgern. Umgekehrt möchten Sie normalerweise, dass der physische Körper des Feindes mindestens die Größe des Basisbildes hat. Wenn wir unserem Weltraumhelden einen Laser geben, um auf seinen Feind zu schießen, macht ein etwas zu großer Feindkörper es für unseren Spieler sinnvoller, einen Treffer zu erzielen. Betrachten Sie diesen Ansatz auch für Kacheln in einem Plattform- oder Puzzlespiel, bei dem Ihr Spieler von Plattform zu Plattform springen muss. Die Spieler sind an diese Art von Spielen gewöhnt; Wenn Sie den Physikkörper ein bisschen erweitern, wird Ihr Spiel einigermaßen "fair" bleiben..

Typische 2D-Engine-Einschränkungen

Es gibt zwei Haupttypen von Physikkörpern:

  1. Kantenbasierte Körper
  2. Volumenbasierte Körper

Ein kantenbasierter Körper ist eine statische, unbewegliche Linie, die eine Grenze für andere Körper schafft, mit denen sie kollidieren können. Es hat ein negativer Raum Darin hat das keine Wirkung auf Körper. Eine großartige Anwendung wäre, eine Begrenzung um Ihren Bildschirm zu erstellen, in der alle Körper enthalten sind.

Ein volumenbasierter Körper hat Volumen und Masse und kann entweder dynamisch oder statisch sein. Da diese Körper Masse haben, prallen Objekte von ihnen ab und sie können durch Kraftkontakte beeinflusst werden. Volumenbasierte Körper können aus vier Hauptformen bestehen:

  1. Kreis
  2. Rechteck
  3. Kette
  4. Komplexes Polygon

Es gibt einige Einschränkungen bei der Verwendung von Körpern in Ihrer typischen 2D-Physik-Engine. Hier sind die zwei wichtigsten Einschränkungen:

Konvexe Physikkörper 

Wenn eine Form ist konvex, es bedeutet, dass kein Innenwinkel weniger als 180 Grad beträgt. 

Es kann klar sein, dass Physik-Simulationen mit konkaven Formen ausgeführt werden können, aber die Verarbeitungskosten sind so hoch, dass sie für 2D einfach nicht realistisch sind, insbesondere wenn sie auf einem tragbaren oder weniger leistungsstarken Gerät ausgeführt werden. Konkav-mögen Formen können konstruiert werden, indem zwei konvexe Formen miteinander verbunden werden Statisches Gelenk. Fugen sind ein weiteres großartiges Feature, das mit 2D-Engines zur Verfügung steht, sind jedoch außerhalb des Rahmens dieser Diskussion.

Starre Physikkörper

Wenn ein Ball gegen eine Wand stößt, wird in der "realen" Welt so etwas vorkommen:

Dein Charakter ist Sprite kann diese Art der Transformation durchmachen, aber ihren physischen Körper kann nicht. Sie können bestimmte Eigenschaften des Körpers steuern, um seine "Hüpfkraft" zu beeinflussen, er kann jedoch keine veränderliche Form haben. Dies ist bekannt als Starrer Körper, Das bedeutet, dass der Körper selbst nicht deformiert oder zerquetscht werden kann.

Eigenschaften eines Physikkörpers

Werfen wir einen kurzen Blick auf einige der nützlichsten Eigenschaften, die in einem typischen Physikkörper verfügbar sind:

  1. Restitution ist ein Maß dafür, wie "federnd" ein Objekt ist. Formal ist es das Maß, wie viel Energie ein Objekt behält, nachdem es mit einem anderen Objekt kollidiert.
  2. Dichte ist das Maß dafür, wie "schwer" ein Objekt ist. Es wird als relative Qualität verwendet - zum Beispiel wäre ein Stein dichter als ein Ball. Wenn der Ball den Stein schlägt, wird er stärker betroffen sein.
  3. Reibung ist das Maß dafür, wie "rutschig" ein Objekt ist. Dies wird verwendet, wenn ein Objekt entlang eines anderen gleitet und bestimmt, wie lange es dauert, bis es anhält.
  4. Wenn ein Körper ist dynamisch, dann werden Kräfte, die von der Welt und anderen Objekten auferlegt werden, eine Wirkung haben; wenn es ein ist statisch Körper, dann werden sie nicht.
  5. Drehung ist normalerweise eine boolesche Variable, die für einen Physikkörper festgelegt werden kann. In bestimmten Fällen möchten Sie möglicherweise einen Körper einschränken und nicht drehen lassen, aber Sie möchten, dass die Kräfte auf das Objekt angewendet werden.

Die meisten Engines verfügen über mehr Eigenschaften als diese, aber für die Zwecke dieser Diskussion sind diese ausreichend, um zu beginnen.

Bewegung und Schwung


In einer simulierten Physikwelt werden Körper durch die Anwendung von bewegt Kräfte und Impulse.

Kräfte: Allgemeine Kräfte wirken typischerweise langsamer auf Körper als Impulse. Sie sind eine konstante Kraft, die über eine Zeiteinheit wirkt (wie die Schwerkraft oder ein Motor)..

Impulse (Impulskräfte): Impulse sind sofortige Anpassungen des Impulses eines Körpers. Impulse werden normalerweise auf der Grundlage von Benutzereingaben auf eine Simulation angewendet.

Was als nächstes?

Nachdem Sie nun die Theorie verstanden haben, ist der beste Weg, Ihr Verständnis von Projektilphysik-Motoren zu festigen, indem Sie selbst eine bauen. Als nächstes werde ich den Code für ein einfaches, auf Physik basierendes Spiel aufteilen, das ich geschrieben habe, damit Sie genau sehen können, wie es funktioniert!