Alle elsker et godt fysikkspill, men la oss innse det: det er mye morsommere når du blåser opp ting! Denne opplæringen vil vise deg hvordan du bruker Corona-fysikkmotoren for å skape eksplosjoner i spillet ditt.
Som litt av housekeeping, la oss begynne med å lage en build.settings-fil med følgende kode:
settings = orientation = default = "landscapeRight", støttet = "landscapeLeft", "landscapeRight"
Detaljer bak alle alternativene for denne filen er utenfor omfanget av denne opplæringen. Ovennevnte innstillinger vil tvinge retningen til mobilenheten til liggende eller horisontale modus. Siden vi bare har et sett med grafikk, vil tvinge en landskapsorientering holde ting enklere.
Deretter starter vi ved å sette opp vår fysikkmotor i vår main.lua-fil:
lokal fysikk = krever ("fysikk") physics.start () display.setStatusBar (display.HiddenStatusBar)
Enkelt rett? Corona er kjempebra! I denne delen har vi også inkludert en linje for å skjule statuslinjen. Dette tillater oss å overta hele skjermen på mobilenheten uten noen innfødte komponenter.
Nå som vi har det grunnleggende gjort, la oss legge til en fin utseende bakgrunn og sentrere sin posisjon i forhold til midten av mobilenheten:
lokal bakgrunn = display.newImage ("bricks.png", 0, 0, true) background.x = display.contentWidth / 2 background.y = display.contentHeight / 2
I koden ovenfor legger vi et bakgrunnsbilde til scenen med display.newImage-metoden. Det er startposisjon øverst, venstre hjørne er 0,0 som angitt i 2. og 3. parameter. Som standard vil Corona plassere bilder med et ankerpunkt i sitt eksakte senter. Vi bruker x, y-metodene på bakgrunnsobjektet til å plassere ankerpunktet til bildet i det eksakte midten av skjermen.
Før vi legger til dynamiske objekter på skjermen, la oss legge til et gulv for at de skal sitte på:
lokal gulv = display.newImage ("floor.png", 0, 280, ekte) physics.addBody (gulv, "statisk", friksjon = 0,5)
Vi legger til et bilde som vi gjorde for bakgrunnen, og plasserte det i bunnen av skjermen. Gulvobjektet legges deretter til scenen som en "statisk" fysikk kropp. "Statisk" betyr i dette tilfellet at objektet vil samhandle med andre fysikkobjekter på skjermen, men vil ikke bli påvirket av tyngdekraften eller treningskrefter fra bevegelige objekter.
Vår neste skritt vil være å sette opp en haug med usikre stablede kasser som bare venter på å bli rocket:
lokale kasser = for i = 1, 5 gjør for j = 1, 5 kasser [i] = display.newImage ("crate.png", 140 + (i * 50), 220 - (j * 50)) fysikk.addBody (kasser [i], tetthet = 0,2, friksjon = 0,1, sprette = 0,5) endeenden
Ovennevnte kode kan se komplisert først, men det er faktisk veldig enkelt. Vi har to nestede løkker som vi sykler gjennom for å lage et sett med kasser 5 bred og 5 høye ved å øke x- og y-verdiene. Hver av disse kasser legges til scenen som en "dynamisk" kropp. "Dynamisk", men ikke spesifisert i koden, er standard typen for alle fysikklegemer. Vi har lagt til noen parametere for å bestemme oppførselen til objektet når krefter opptrer på den. Tetthetsverdien for hver kasse vil være viktig senere når vi bestemmer styrken av eksplosjonen vår. Jo tettere gjenstandene, desto større kraft behøves for å flytte dem. Vil du prøve noe gøy? Øk sprettingsverdien til 1,0 og se hva som skjer med kasser.
Puh! Klar for den morsomme delen? La oss blåse disse tingene opp. Prinsippet bak å skape eksplosjoner er å bestemme et eksplosjons-epicenter og blastradius og påvirke alle objekter som faller innenfor det. For dette eksempelet vil eksplosjonens epicenter bestemmes av hvor vi berører skjermen. La oss begynne med å legge til atferd:
lokal sirkel = "" lokal funksjon settBomb (hendelse) hvis (event.phase == "startet") så circle = display.newCircle (event.x, event.y, 80) circle.myName =? sirkel? sirkel: setFillColor (0,0,0, 0) physics.addBody (sirkel, "statisk", isSensor = true) circle.collision = onLocalCollision sirkel: addEventListener avslutte hvis (event.phase = = "endte") og deretter sirkel: removeSelf () end end background: addEventListener ("touch", setBomb)
Her har vi definert en metode som heter setBomb som genererer en usynlig sirkel med en radius på 80. Sirkelen er plassert der brukeren har rørt skjermen. Den fysikk kroppen vi legger til har en spesiell parameter kalt isSensor satt til true. Sensorobjekter er tilstede i fysikkmotoren, men påvirkes ikke av tyngdekraft, og de påvirker ikke andre gjenstander. Vi bruker et sensorobjekt i dette tilfellet bare for å oppdage hvilke kasser som kontakter det. Kontakt vil bli bestemt ved å lytte etter kollisjonshendelser mellom kasser og vår sensor. En hvilken som helst kasse som kolliderer med sensoren, er inne i eksplosjonsradiusen og vil dermed bli påvirket av eksplosjonens kraft.
Følgende metode vil bli utført ved påvisning av objekts kollisjon med sensoren vi opprettet i den ovennevnte koden.
* Som et punkt med informasjon, må følgende metode defineres i koden før den ovenfor angitteBomb-metoden. Av flytende grunner har vi imidlertid lagt det senere i opplæringen.
lokal funksjon onLocalCollision (self, event) hvis (event.phase == "startet" og self.myName == "circle") og deretter 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
Den grunnleggende ideen bak denne metoden er å bruke en kraft til ethvert objekt som har kollidert med sensorsirkelen. Vi har opprettet to variabler kalt forcex og forcey. Vi bruker avstanden fra midten av kassen til midten av sensorsirkelen for å bestemme styrken av kraften vi skal bruke. Ved å gjøre dette skaper vi en fattig manns måte å redusere eksplosjonens kraft, jo lenger objektet kommer fra blastens epicenter. Alle disse tallene er svært avhengige av fysikkegenskapene til objektene vi blåser opp.
* Merk: Krafter som numeriske verdier er mye høyere enn tetthet, friksjon og sprettegenskaper for objekter. Ta gjerne med deg med disse verdiene for å få interessante resultater!
Og der har vi det. Denne opplæringen skal gi et utmerket utgangspunkt for å lage alle slags kule spill som involverer eksplosjoner. Ta deg tid til å eksperimentere med egenskapene og verdiene til alle variablene i denne øvelsen.
I del II av denne opplæringen legger vi noen ekstra klokkene og fløyter til eksplosjonsrammen for å gjøre det enda mer destruktivt!
Legg igjen noen kommentarer og gi meg beskjed om hva du synes om del I.