Wie man mit der Corona SDK Physics Engine aufbläst Teil 1

Überblick

Jeder liebt ein gutes Physikspiel, aber seien wir ehrlich: Es macht viel mehr Spaß, wenn man Sachen in die Luft jagt! Dieses Tutorial zeigt Ihnen, wie Sie mit der Corona Physics Engine Explosionen in Ihrem Spiel erstellen können.

Konfiguration

Zu Beginn der Haushaltsführung erstellen wir zunächst eine build.settings-Datei mit folgendem Code:

 settings = orientation = default = "landscapeRight", unterstützt = "landscapeLeft", "landscapeRight"

Die Details hinter allen Optionen für diese Datei gehen über den Rahmen dieses Lernprogramms hinaus. Die obigen Einstellungen erzwingen die Ausrichtung des mobilen Geräts in den Querformat- oder Horizontalmodus. Da wir nur einen Satz von Grafiken haben, wird das Erzwingen einer Querformatausrichtung die Sache einfacher machen.

Physik

Als Nächstes richten wir unsere Physik-Engine in unserer main.lua-Datei ein:

 lokale Physik = Physik.start () erforderlich ("Physik") display.setStatusBar (display.HiddenStatusBar)

Einfach richtig? Corona ist großartig! In diesem Abschnitt haben wir auch eine Zeile zum Ausblenden der Statusleiste eingefügt. Dies ermöglicht uns, den gesamten Bildschirm des mobilen Geräts ohne native Komponenten zu übernehmen.

Grafik

Nachdem wir nun die Grundlagen erstellt haben, fügen wir einen gut aussehenden Hintergrund hinzu und zentrieren seine Position relativ zur Mitte des mobilen Geräts:

 local background = display.newImage ("bricks.png", 0, 0, true) background.x = display.contentWidth / 2 background.y = display.contentHeight / 2

Im obigen Code fügen wir der Bühne mit der Methode display.newImage ein Hintergrundbild hinzu. Die Anfangsposition in der oberen, linken Ecke ist 0,0, wie durch den 2. und 3. Parameter angegeben. Standardmäßig positioniert Corona Bilder mit einem Ankerpunkt genau in der Mitte. Wir verwenden die x, y-Methoden des Hintergrundobjekts, um den Ankerpunkt des Bildes genau in der Mitte des Bildschirms zu positionieren.

Bevor wir dem Bildschirm dynamische Objekte hinzufügen, fügen wir einen Boden hinzu, auf dem sie Platz nehmen können:

 local floor = display.newImage ("floor.png", 0, 280, true) physics.addBody (floor, "statisch", Reibung = 0,5)

Wir fügen ein Bild wie beim Hintergrund hinzu und positionieren es am unteren Rand des Bildschirms. Das Bodenobjekt wird dann als "statischer" Physikkörper zur Bühne hinzugefügt. "Statisch" bedeutet in diesem Fall, dass das Objekt mit anderen physischen Objekten auf dem Bildschirm interagiert, jedoch nicht durch die Schwerkraft oder Trägheitskräfte von sich bewegenden Objekten beeinflusst wird.

Dynamische Objekte

Unser nächster Schritt besteht darin, ein paar prekär gestapelte Kisten aufzubauen, die nur darauf warten, gerockt zu werden:

 lokale Kisten =  für i = 1, 5 tun für j = 1, 5 tun Kisten [i] = display.newImage ("crate.png", 140 + (i * 50), 220 - (j * 50)) physics.addBody (Kisten [i], Dichte = 0,2, Reibung = 0,1, Sprungkraft = 0,5) Ende

Der obige Code sieht auf den ersten Blick komplex aus, ist aber eigentlich sehr einfach. Wir haben zwei verschachtelte Schleifen, die wir durchlaufen, um eine Reihe von Kisten mit einer Breite von 5 und einer Höhe von 5 zu erstellen, indem wir die x- und y-Werte inkrementieren. Jede dieser Kisten wird der Bühne als "dynamischer" Körper hinzugefügt. "Dynamisch" ist, obwohl nicht im Code angegeben, der Standardtyp für alle Physikkörper. Wir haben ein paar Parameter hinzugefügt, um das Verhalten des Objekts zu bestimmen, wenn Kräfte darauf wirken. Der Dichtewert für jede Kiste wird später wichtig, wenn wir die Kraft unserer Explosion bestimmen. Je dichter die Objekte sind, desto größer ist die Kraft, die erforderlich ist, um sie zu bewegen. Willst du etwas Spaß machen? Erhöhen Sie den Absprungwert auf 1,0 und beobachten Sie, was mit den Kisten geschieht.

Die Bombe einstellen

Puh! Bereit für den spaßigen Teil? Lass uns diese Dinge in die Luft jagen. Das Prinzip bei der Erzeugung von Explosionen besteht darin, ein Explosions-Epizentrum und einen Explosionsradius zu bestimmen und alle Objekte zu beeinflussen, die in ihn fallen. In diesem Beispiel wird das Epizentrum der Explosion dadurch bestimmt, wo wir den Bildschirm berühren. Beginnen wir mit dem Hinzufügen dieses Verhaltens:

 local circle = "" lokale Funktion setBomb (event) if (event.phase == "started"), dann circle = display.newCircle (event.x, event.y, 80) circle.myName =? circle? circle: setFillColor (0,0,0, 0) physics.addBody (circle, "static", isSensor = true) circle.collision = onLocalCollision circle: addEventListener ("collision", circle) end if (event.phase =.) = "beendet") dann Kreis: removeSelf () Ende Ende Hintergrund: addEventListener ("touch", setBomb)

Hier haben wir eine Methode namens setBomb definiert, die einen unsichtbaren Kreis mit einem Radius von 80 generiert. Der Kreis befindet sich dort, wo der Benutzer den Bildschirm berührt hat. Der Physikkörper, den wir hinzufügen, hat einen speziellen Parameter namens isSensor, der auf true gesetzt ist. Sensorobjekte sind in der Physik-Engine vorhanden, werden jedoch weder von der Schwerkraft beeinflusst noch beeinflussen sie andere Objekte. In diesem Fall verwenden wir ein Sensorobjekt, um einfach zu ermitteln, welche Kisten es berühren. Der Kontakt wird ermittelt, indem auf Kollisionsereignisse zwischen den Kisten und unserem Sensor gewartet wird. Jede Kiste, die mit unserem Sensor kollidiert, befindet sich innerhalb des Explosionsradius und wird daher durch die Kraft der Explosion beeinträchtigt.

Kaboom!

Die folgende Methode wird ausgeführt, wenn eine Kollision eines Objekts mit dem Sensor, den wir im obigen Code erstellt haben, erkannt wird.

* Zur Information muss die folgende Methode im Code vor der obigen setBomb-Methode definiert werden. Aus Gründen des Fließens haben wir ihn jedoch später im Tutorial platziert.

 lokale Funktion onLocalCollision (self, event) wenn (event.phase == "begin" und self.myName == "circle"), dann local forcex = event.other.x-self.x local forcey = event.other.y- self.y-20 if (forcex < 0) then forcex = 0-(80 + forcex)-12 else forcex = 80 - forcex+12 end event.other:applyForce( forcex, forcey, self.x, self.y ) end end

Die Grundidee dieser Methode besteht darin, eine Kraft auf jedes Objekt anzuwenden, das mit unserem Sensorkreis kollidiert ist. Wir haben zwei Variablen namens forcex und forcey erstellt. Wir verwenden den Abstand von der Mitte der Kiste bis zur Mitte unseres Sensorkreises, um die Stärke der Kraft zu bestimmen, die wir anwenden werden. Auf diese Weise schaffen wir die Möglichkeit eines armen Mannes, die Explosionskraft zu verringern, je weiter das Objekt vom Epizentrum der Explosion entfernt ist. Alle diese Zahlen hängen stark von den physikalischen Eigenschaften der Objekte ab, die wir in die Luft sprengen.

* Hinweis: Kräfte als numerische Werte sind viel höher als die Eigenschaften für Dichte, Reibung und Sprungkraft von Objekten. Fühlen Sie sich frei, mit diesen Werten zu spielen, um interessante Ergebnisse zu erhalten!

Fazit

Und da haben wir es. Dieses Tutorial sollte einen hervorragenden Ausgangspunkt für das Erstellen aller Arten von coolen Spielen mit Explosionen bieten. Nehmen Sie sich etwas Zeit, um mit den Eigenschaften und Werten aller Variablen in dieser Übung zu experimentieren.

In Teil II dieses Tutorials fügen wir dem Explosionsgerüst zusätzliche Glocken hinzu, um es noch zerstörerischer zu machen!

Hinterlassen Sie einige Kommentare und lassen Sie mich wissen, was Sie über Teil I denken.