Cum să suflați lucrurile în sus cu motorul Corony SDK Physics Partea 1

Prezentare generală

Toată lumea iubește un joc de fizică bun, dar hai să ne confruntăm cu asta: este mult mai distractiv când sufli lucruri în sus! Acest tutorial vă va arăta cum să utilizați motorul de fizică Corona pentru a crea explozii în joc.

Înființat

Ca un pic de menaj, să începem prin crearea unui fișier build.settings cu următorul cod:

 setări = orientation = default = "landscapeRight", suportat = "landscapeLeft", "landscapeRight"

Detaliile din spatele tuturor opțiunilor pentru acest fișier sunt dincolo de scopul acestui tutorial. Setările de mai sus vor forța orientarea dispozitivului mobil în modul peisaj sau orizontal. Deoarece avem doar un singur set de elemente grafice, forțând o orientare peisaj, vor păstra lucrurile mai simple.

Fizică

Apoi, vom începe prin crearea motorului fizic în fișierul principal.lua:

 fizica locala = necesita ("fizica") physics.start () display.setStatusBar (display.HiddenStatusBar)

E ușor? Corona este minunat! În această secțiune, am inclus și o linie pentru a ascunde bara de stare. Acest lucru ne permite să preluăm întreg ecranul dispozitivului mobil fără componente native.

Grafică

Acum, după ce am realizat elementele de bază, să adăugăm un fundal frumos și să ne concentrăm poziția față de centrul dispozitivului mobil:

 fundal local = display.newImage ("bricks.png", 0, 0, adevărat) background.x = display.contentWidth / 2 background.y = display.contentHeight / 2

În codul de mai sus adăugăm o imagine de fundal la scenă cu metoda display.newImage. Poziția inițială este în colțul din stânga sus, 0,0 este indicată de parametrii 2 și 3. Implicit, Corona va poziționa imaginile cu un punct de ancorare în centrul său exact. Utilizăm metodele x, y pe obiectul de fundal pentru a poziționa punctul de ancorare al imaginii în centrul exact al ecranului.

Înainte de a adăuga obiecte dinamice pe ecran, să adăugăm un etaj pentru ele:

 planșeu local = display.newImage ("floor.png", 0, 280, adevărat) fizics.addBody (etaj, "static", friction = 0.5)

Adăugăm o imagine ca și în cazul fundalului, poziționându-l în partea de jos a ecranului. Obiectul de podea este apoi adăugat la etapă ca un corp fizic "static". "Static" în acest caz înseamnă că obiectul va interacționa cu alte obiecte de fizică pe ecran, dar nu va fi afectat de gravitație sau de forțele inerțiale din obiectele în mișcare.

Obiecte dinamice

Următorul nostru pas va fi să înființăm o grămadă de cutii precare încărcate care așteaptă doar să se rătăcească:

 carcasele locale =  pentru i = 1, 5 pentru j = 1, 5 pentru lăzi [i] = display.newImage ("crate.png", 140 + (i * 50); fizics.addBody (cutii [i], densitate = 0.2, frecare = 0.1, bounce = 0.5) end end

Codul de mai sus ar putea părea complex la început, dar este de fapt foarte simplu. Avem două bucle imbricate pe care le traversăm pentru a crea un set de lăzi 5 lățime și 5 înălțime prin creșterea valorilor x și y. Fiecare dintre aceste lăzi este adăugată la scenă ca un corp "dinamic". "Dinamic", deși nu este specificat în cod, este tipul implicit pentru toate corpurile fizicii. Am adăugat câțiva parametri pentru a determina comportamentul obiectului atunci când forțele sunt acționate asupra acestuia. Valoarea densității pentru fiecare cutie va fi importantă mai târziu când vom determina forța exploziei noastre. Cu cât obiectele sunt mai dense, cu atât este mai mare forța necesară pentru a le mișca. Vrei să încerci ceva distractiv? Creșteți valoarea de bounce la 1.0 și urmăriți ce se întâmplă cu cutiile.

Setarea bombei

Pfiu! Gata pentru distracție? Să aruncăm aceste lucruri în aer. Principiul generării exploziilor este de a determina un epicentru de explozie și o rază de explozie și să afecteze toate obiectele care intră în el. Pentru acest exemplu, epicentrul exploziei va fi determinat de locul în care atingem ecranul. Să începem prin adăugarea acelui comportament:

 cerc local = "" funcția locală setBomb (eveniment) dacă (event.phase == "a început") apoi cerc = display.newCircle (event.x, event.y, 80) cerc.myName =? cerc? cerc: setFillColor (0,0,0, 0) fizics.addBody (cerc, "static", isSensor = true) circle.collision = cercLocalCollision: addEventListener ("collision" = "terminat") apoi cerc: removeSelf () end end background: addEventListener ("touch", setBomb)

Aici am definit o metodă numită setBomb care generează un cerc invizibil cu o rază de 80. Cercul este poziționat acolo unde utilizatorul a atins ecranul. Corpul de fizică pe care îl adăugăm are un parametru special numit isSensor setat la adevărat. Elementele senzorilor sunt prezente în motorul fizicii, dar nu sunt afectate de gravitate și nici nu afectează alte obiecte. În acest caz, folosim un obiect de senzor pentru a detecta cutiile care îl contactează. Contactul va fi determinat prin ascultarea evenimentelor de coliziune între cutii și senzorul nostru. Orice cutie care se ciocnește cu senzorul nostru este în interiorul razei de explozie și astfel va fi afectată de forța exploziei.

Kaboom!

Următoarea metodă va fi executată la detectarea coliziunii unui obiect cu senzorul pe care l-am creat în codul de mai sus.

* Ca punct de informare, următoarea metodă trebuie definită în cod înainte de metoda setBomb de mai sus. Din motive de flux, cu toate acestea, am plasat-o mai târziu în tutorial.

 funcția locală onLocalCollision (auto, eveniment) în cazul în care (event.phase == "a început" și self.myName == "cerc"), apoi forcex = event.other.x-self.x local forcey = auto.y-20 dacă (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

Ideea de bază din spatele acestei metode este de a aplica o forță oricărui obiect care sa ciocnit cu cercul nostru de senzori. Am creat două variabile numite forcex și forță. Utilizăm distanța din centrul cutiei în centrul cercului senzorului pentru a determina puterea forței pe care o vom aplica. Făcând acest lucru, creăm un mod de a scădea forța exploziei de către un om sărac, cu cât obiectivul este mai departe de epicentrul exploziei. Toate aceste numere sunt în mare măsură dependente de proprietățile fizice ale obiectelor pe care le aruncăm în aer.

* Notă: Forțele ca valori numerice sunt mult mai mari decât proprietățile de densitate, frecare și reflexie ale obiectelor. Simțiți-vă liber să jucați cu aceste valori pentru a obține rezultate interesante!

Concluzie

Și acolo o avem. Acest tutorial ar trebui să ofere un punct de plecare excelent pentru crearea de tot felul de jocuri interesante care implică explozii. Luați ceva timp pentru a experimenta proprietățile și valorile tuturor variabilelor din acest exercițiu.

În Partea a II-a a acestui tutorial vom adăuga câteva clopote și fluiere suplimentare în cadrul exploziei pentru ao face și mai distructivă!

Lăsați câteva comentarii și spuneți-mi ce părere aveți despre Partea I.

Cod