Hur man blåser upp saker med Corona SDK Physics Engine Del 1

Översikt

Alla älskar ett bra fysikspel, men låt oss möta det: det är mycket roligare när du blåser upp saker! Denna handledning visar dig hur du använder Corona-fysikmotorn för att skapa explosioner i ditt spel.

Inrätta

Låt oss börja med att skapa en build.settings-fil med följande kod:

 settings = orientation = default = "landscapeRight", stöds = "landscapeLeft", "landscapeRight"

Detaljerna bakom alla alternativ för den här filen ligger utanför omfattningen av denna handledning. Ovanstående inställningar kommer att tvinga mobilenhetens orientering i landskap eller horisontellt läge. Eftersom vi bara har en uppsättning grafik, tvingar en landskapsorientering att hålla saker enklare.

Fysik

Därefter börjar vi genom att ställa in vår fysikmotor i vår main.lua-fil:

 lokal fysik = kräver ("fysik") physics.start () display.setStatusBar (display.HiddenStatusBar)

Lätt rätt? Corona är fantastisk! I det här avsnittet har vi också inkluderat en rad för att dölja statusfältet. Detta gör att vi kan ta över hela skärmen på den mobila enheten utan några inbyggda komponenter.

Grafik

Nu när vi har gjort grunderna, låt oss lägga till en snygg bakgrund och centrera dess position i förhållande till mobilenheten:

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

I ovanstående kod lägger vi till en bakgrundsbild till scenen med display.newImage-metoden. Det är första positionen i det övre, vänstra hörnet är 0,0 som anges av 2: a och 3: e parametrarna. Som standard placerar Corona bilder med en ankarpunkt i exakt centrum. Vi använder x, y-metoderna på bakgrundsobjektet för att placera bildens ankarpunkt i skärmens exakta mittpunkt.

Innan vi lägger till några dynamiska objekt på skärmen, lägger vi till ett golv för att de ska sitta på:

 lokal golv = display.newImage ("floor.png", 0, 280, true) physics.addBody (golv, "statisk", friktion = 0,5)

Vi lägger till en bild precis som vi gjorde för bakgrunden och placerar den längst ner på skärmen. Golvobjektet läggs sedan till scenen som en "statisk" fysik kropp. "Statisk" betyder i detta fall att objektet kommer att interagera med andra fysikobjekt på skärmen men kommer inte att påverkas av gravitation eller tröghetskrafter från rörliga föremål.

Dynamiska objekt

Vårt nästa steg är att ställa upp ett gäng försiktigt staplade lådor som bara väntar på att bli rockade:

 lokala kasser =  för i = 1, 5 gör för j = 1, 5 kasser [i] = display.newImage ("crate.png", 140 + (i * 50), 220 - (j * 50)) fysik.addBody (kasser [i], densitet = 0,2, friktion = 0,1, studs = 0,5) ändänden

Ovanstående kod kan se ut komplex först men det är faktiskt väldigt enkelt. Vi har två kapslingar som vi cyklar igenom för att skapa en uppsättning lådor 5 breda och 5 långa genom att öka x- och y-värdena. Var och en av dessa lådor läggs till scenen som en "dynamisk" kropp. "Dynamisk", även om den inte anges i koden, är standardtypen för alla fysikorgan. Vi har lagt till några parametrar för att bestämma objektets beteende när krafter handlas på det. Täthetsvärdet för varje kista kommer att vara viktigt senare när vi bestämmer kraften i vår explosion. Ju tätare objekten desto större kraft behövs för att flytta dem. Vill du prova något kul? Öka studsvärdet till 1,0 och kolla vad som händer med rutorna.

Ställ in bomben

Phew! Klar för den roliga delen? Låt oss blåsa upp dessa saker. Principen bakom att skapa explosioner är att bestämma ett explosionsepicentrum och sprängradie och påverka alla föremål som faller in i den. I det här exemplet bestäms explosionscentrets epicenter av var vi rör på skärmen. Låt oss börja med att lägga till det beteendet:

 local circle = "" lokal funktion setBomb (händelse) om (event.phase == "började") då cirkel = display.newCircle (event.x, event.y, 80) circle.myName =? circle? cirkel: setFillColor (0,0,0, 0) physics.addBody (cirkel, "static", isSensor = true) circle.collision = onLocalCollisionscirkel: addEventListener ("kollision", cirkel) slutar om (event.phase = = "slutade") sedan cirkel: removeSelf () endänd bakgrund: addEventListener ("touch", setBomb)

Här har vi definierat en metod som heter setBomb som genererar en osynlig cirkel med en radie av 80. Cirkeln är placerad där användaren har berört skärmen. Den fysik kropp som vi lägger till har en speciell parameter som heter isSensor satt till true. Sensorobjekt finns i fysikmotorn men påverkas inte av gravitationen eller påverkar andra objekt. Vi använder ett sensorobjekt i det här fallet för att enkelt upptäcka vilka lådor som är i kontakt med det. Kontakt kommer att bestämmas genom att lyssna på kollisionshändelser mellan kassorna och vår sensor. Varje kista som kolliderar med vår sensor ligger inuti sprängradie och påverkas sålunda av explosionens kraft.

Kaboom!

Följande metod kommer att utföras vid detektering av objektets kollision med den sensor som vi skapade i ovanstående kod.

* Som en informationspunkt måste följande metod definieras i koden före ovan angivnaBomb-metoden. Av flödesskäl har vi dock placerat den senare i handledningen.

 lokal funktion onLocalCollision (själv, händelse) om (event.phase == "började" och self.myName == "circle") då 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

Grundtanken bakom denna metod är att tillämpa en kraft på något objekt som har kolliderat med vår sensorkrets. Vi har skapat två variabler som heter forcex och forcey. Vi använder avståndet från mitten av kassen till mitten av vår sensorkrets för att bestämma styrkan på den kraft vi ska tillämpa. Genom att göra detta skapar vi en fattig mans sätt att minska explosionsstyrkan ju längre objektet kommer från sprängets epicentrum. Alla dessa siffror är mycket beroende av fysikegenskaperna hos de föremål som vi blåser upp.

* Obs! Krafter som numeriska värden är mycket högre än objektets densitet, friktion och studsegenskaper. Känn dig fri att leka med dessa värden för att få några intressanta resultat!

Slutsats

Och där har vi det. Denna handledning bör ge en utmärkt utgångspunkt för att skapa alla sorters coola spel som innefattar explosioner. Ta lite tid att experimentera med egenskaperna och värdena för alla variablerna i den här övningen.

I del II i denna handledning lägger vi till några extra klockor och visselpipor till explosionsramen för att göra det ännu mer destruktivt!

Lämna några kommentarer och låt mig veta vad du tycker om del I.