Hoe je dingen kunt opvullen met de Corona SDK Physics Engine deel 1

Overzicht

Iedereen houdt van een goed physics-spel, maar laten we wel wezen: het is veel leuker als je dingen opblaast! Deze tutorial laat je zien hoe je de Corona physics engine gebruikt om explosies in je game te creëren.

Opstelling

Laten we als een beetje huishouding beginnen met het maken van een build.settings-bestand met de volgende code:

 instellingen = orientation = default = "landscapeRight", supported = "landscapeLeft", "landscapeRight"

De details achter alle opties voor dit bestand vallen buiten het bestek van deze zelfstudie. De bovenstaande instellingen zullen de oriëntatie van het mobiele apparaat in liggende of horizontale modus forceren. Omdat we slechts één set afbeeldingen hebben, zal het dwingen van een liggende oriëntatie het eenvoudiger houden.

Fysica

Vervolgens beginnen we met het instellen van onze physics-engine in ons main.lua-bestand:

 local physics = require ("physics") physics.start () display.setStatusBar (display.HiddenStatusBar)

Makkelijk toch? Corona is geweldig! In dit gedeelte hebben we ook een regel toegevoegd om de statusbalk te verbergen. Hierdoor kunnen we het volledige scherm van het mobiele apparaat overnemen zonder eigen componenten.

grafiek

Nu we de basis hebben voltooid, laten we een mooie achtergrond toevoegen en de positie centreren ten opzichte van het midden van het mobiele apparaat:

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

In de bovenstaande code voegen we een achtergrondafbeelding toe aan het werkgebied met de methode display.newImage. De beginpositie in de linkerbovenhoek is 0,0, zoals aangegeven door de 2e en 3e parameter. Standaard plaatst Corona afbeeldingen met een ankerpunt in het exacte midden ervan. We gebruiken de x, y-methoden op het achtergrondobject om het ankerpunt van de afbeelding exact in het midden van het scherm te plaatsen.

Voordat we dynamische objecten aan het scherm toevoegen, voegen we een verdieping toe waarop ze kunnen zitten:

 local floor = display.newImage ("floor.png", 0, 280, true) physics.addBody (floor, "static", friction = 0.5)

We voegen een afbeelding toe net als voor de achtergrond en plaatsen deze onder aan het scherm. Het vloerobject wordt dan aan het podium toegevoegd als een "statisch" fysisch lichaam. "Statisch" betekent in dit geval dat het object in wisselwerking staat met andere physics-objecten op het scherm, maar niet wordt beïnvloed door de zwaartekracht of enige traagheidskrachten van bewegende objecten.

Dynamische objecten

Onze volgende stap zal zijn om een ​​stel gevaarlijk gestapelde kratten op te zetten die gewoon wachten om opgeschud te worden:

 lokale kisten =  voor i = 1, 5 doen voor j = 1, 5 doen kisten [i] = display.newImage ("crate.png", 140 + (i * 50), 220 - (j * 50)) physics.addBody (crates [i], density = 0.2, friction = 0.1, bounce = 0.5) end end

De bovenstaande code lijkt in eerste instantie ingewikkeld, maar het is eigenlijk heel eenvoudig. We hebben twee geneste lussen die we doorlopen om een ​​set kratten 5 breed en 5 hoog te maken door de x- en y-waarden te verhogen. Elk van deze kratten wordt aan het podium toegevoegd als een "dynamisch" lichaam. "Dynamisch", hoewel niet aangegeven in de code, is het standaardtype voor alle natuurkunde-instanties. We hebben enkele parameters toegevoegd om het gedrag van het object te bepalen wanneer er op wordt ingewerkt. De dichtheidswaarde voor elke kist zal later belangrijk zijn wanneer we de kracht van onze explosie bepalen. Hoe dichter de objecten, hoe groter de kracht die nodig is om ze te verplaatsen. Wil je iets leuks proberen? Verhoog de bouncewaarde naar 1.0 en kijk wat er met de kratten gebeurt.

De bom instellen

Phew! Klaar voor het leuke gedeelte? Laten we deze dingen opblazen. Het principe achter het creëren van explosies is om een ​​explosie-epicentrum en explosie-straal te bepalen en alle objecten die erin vallen te beïnvloeden. Voor dit voorbeeld wordt het epicentrum van de explosie bepaald door waar we het scherm aanraken. Laten we beginnen met het toevoegen van dat gedrag:

 local circle = "" lokale functiesetBomb (event) if (event.phase == "started") then 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 = = "ended") then circle: removeSelf () end end background: addEventListener ("touch", setBomb)

Hier hebben we een methode gedefinieerd, setBomb genaamd, die een onzichtbare cirkel genereert met een straal van 80. De cirkel is gepositioneerd op de plek waar de gebruiker het scherm heeft aangeraakt. De fysica die we toevoegen heeft een speciale parameter genaamd isSensor ingesteld op waar. Sensorobjecten zijn aanwezig in de physics engine, maar worden niet beïnvloed door de zwaartekracht en hebben geen invloed op andere objecten. We gebruiken in dit geval een sensorobject om eenvoudig te detecteren welke kratten contact maken. Contact wordt bepaald door te luisteren naar botsingen tussen de kratten en onze sensor. Elke kist die botst met onze sensor bevindt zich binnen de explosie-straal en zal dus worden beïnvloed door de kracht van de explosie.

Kaboom!

De volgende methode wordt uitgevoerd bij het detecteren van de botsing van een object met de sensor die we in de bovenstaande code hebben gemaakt.

* Als informatiepunt moet de volgende methode worden gedefinieerd in de code voorafgaand aan de bovenstaande setBomb-methode. Om flow-redenen hebben we het later in de tutorial geplaatst.

 lokale functie op LocalCollision (self, event) if (event.phase == "started" en self.myName == "circle") dan 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

Het basisidee achter deze methode is om een ​​kracht toe te passen op elk object dat met onze sensorcirkel in botsing is gekomen. We hebben twee variabelen gemaakt, genaamd forcex en forcey. We gebruiken de afstand van het midden van de krat tot het midden van onze sensorcirkel om de sterkte van de kracht te bepalen die we zullen toepassen. Door dit te doen, creëren we de manier waarop een arme man de kracht van de explosie vermindert, naarmate het object verder uit het epicentrum van de explosie komt. Al deze getallen zijn sterk afhankelijk van de fysische eigenschappen van de objecten die we opblazen.

* Opmerking: Krachten als numerieke waarden zijn veel hoger dan de dichtheid, wrijving en bounce-eigenschappen van objecten. Voel je vrij om met deze waarden te spelen om interessante resultaten te krijgen!

Conclusie

En daar hebben we het. Deze tutorial zou een uitstekend startpunt moeten bieden voor het maken van allerlei coole games met explosies. Neem de tijd om te experimenteren met de eigenschappen en waarden van alle variabelen in deze oefening.

In Deel II van deze tutorial voegen we extra klokken en fluittonen toe aan het explosieframework om het nog destructiever te maken!

Laat enkele opmerkingen achter en laat me weten wat je van Deel I vindt.