Motorul fizic care vine cu Corona Game Edition este un instrument incredibil de puternic și ușor de utilizat. În acest tutorial, vom acoperi finalizarea unui joc de baschet rudimentar folosind această tehnologie interesantă.
(9.81, 0) - 9.81 m / s * s în direcția pozitivă x fizica.setScale (80) - 80 pixeli pe metru fizica.setDrawMode ("normal")
Primul lucru pe care îl facem (ca în multe programe) este să scăpați de bara de stare din partea de sus a ecranului. Apoi, facem declarația necesară pentru utilizarea fizicii și stocăm rezultatul în variabilă numită "fizică". Lucrurile devin mai interesante în următoarele câteva rânduri. În linia cinci, am stabilit accelerația gravitațională. De obicei, gravitația este stabilită la 9,8 m / s * în direcția y pozitivă, dar în acest caz dorim să tragem gravitația în poziția x pozitivă deoarece aplicația va avea o orientare peisaj. Mai mult, am setat scara la 80 de pixeli pe metru. Acest număr poate varia destul de puțin în funcție de mărimea obiectelor din aplicația dvs. și este posibil să fiți nevoit să jucați cu el pentru a vă oferi jocul simțul corect. Am ales 80 px / m pentru că vreau să se potrivească aproximativ 15 picioare de spațiu vertical pe ecran. Știind că este doar o chestiune simplă de conversie a unității pentru a obține o valoare.
Notă: Este important să încercați să legați totul de obiecte din lumea reală în aplicații cu fizică. Măsurătorile de viață mai reale pe care le folosiți, cu atât mai puține presupuneri vor fi și cu cât va apărea mai realist aplicația dvs..
Eliminăm aceste câteva linii prin setarea modului de tragere la normal. Această linie ușurează mai târziu modificarea la modul de depanare dacă ar trebui să reparăm un comportament neintenționat cu coliziuni. Setarea acestui lucru la normal este comportamentul implicit și atrage formele pe măsură ce utilizatorul le va vedea în jocul final.
local = display.newImage ("CourtBackground.png") scor local = display.newText scor: setTextColor (0, 0, 0) score.rotation = -90 score.size = 36 local = display.newRect (320, 0, 1, 480) local lWall = display.newRect (0, 480, 320, 1) local rWall = display.newRect (0, -1, 320, 1) display.newRect (-1, 0, 1, 480) staticMaterial = densitate = 2, frecare = .3, bounce = .4 fizics.addBody (etaj, static, staticMaterial) ", staticMaterial) fizica.addBody (rWall," static ", staticMaterial) fizica.addBody (tavan," static ", staticMaterial)
Acest bloc stabilește limitele arenei și proprietățile tuturor obiectelor statice din aplicație. Începem prin adăugarea unei imagini simple în fundal. În interiorul dreptunghiului alb din imaginea de fundal, poziționăm un text pentru a afișa scorul curent. Deoarece aplicația va fi afișată în modul peisaj, vom face, de asemenea, ajustările de rotație necesare aici. Arena are nevoie să prindă mingea în partea vizibilă a ecranului. Am realizat acest lucru cu patru dreptunghiuri statice (podea, lWall, rWall, plafon) plasate doar din vedere.
Apoi, vom aduce fizica înapoi în ecuație. În loc să reintroducem masa pentru proprietățile fizice ale fiecărui obiect, vom crea un nume de tabel staticMaterial pentru a fi reutilizat pentru fiecare dintre pereți și scopul în sine. Am ales valori destul de normale pentru aceste proprietăți, deși vă încurajez să jucați cu ei. Mai este un pas pe care trebuie să-l luăm și asta este să-i spunem lui Corona că aceste obiecte ar trebui să participe la calculele fizicii. Facem acest lucru prin apelarea funcției addBody a obiectului fizicii. Această funcție are trei argumente:
Am determinat deja proprietățile și obiectele, astfel încât tot ceea ce rămâne este modificatorul opțional. Utilizăm "static" pentru a împiedica gravitația, sau orice forță, să ne distragă pereții!
-- Creați obiectivul vertPost = display.newRect (110, 5, 210, 10) vertPost: setFillColor (33, 33, 33) local horizPost = display.newRect (110, 10, 10, 40) horizPost: setFillColor , 33) backboard local = display.newRect (55, 50, 85, 5) backboard: setFillColor (33, 33, 33) fizics.addBody (vertPost, staticMaterial static fizica.addBody (horizPost, staticMaterial) fizics.addBody (backboard, "static", staticMaterial) --Creați mingea locală ball = display.newCircle (50, 200, 10) ball: setFillColor (192, 99, 55) fizics.addBody = .8, frecare = .3, bounce = .6, raza = 10)
Într-o singură lovitură, noi creăm restul elementelor vizuale ale aplicației noastre. Acest lucru ar trebui să pară foarte familiar. Există doar două lucruri pe care aș dori să le subliniez. În primul rând, unele dintre valorile pentru poziționarea obiectivului pot părea oprite. Aceasta trebuie să țină cont de orientarea peisajului. Scopul va apărea în poziție verticală atunci când dispozitivul este rotit de partea sa. De asemenea, asigurați-vă că includeți proprietatea radiusului în tabelul proprietăților mingii, astfel încât să se poarte corect.
funcția locală drag (eveniment) minge locală = event.target faza locală = event.phase dacă "a început" == faza apoi display.getCurrentStage (): setFocus (minge) - memorați poziția inițială ball.x0 = event.x - .x ball.y0 = event.y - ball.y - Evitați forțele gravitaționale event.target.bodyType = "kinematic" - Opriți mișcarea curentă, dacă există event.target:setLinearVelocity (0, 0) event.target.angularVelocity = 0 altceva dacă "a fost mutat" == fază apoi ball.x = event.x - ball.x0 ball.y = event.y - ball.y0 elseif "terminat" == faza sau "canceled" == faza apoi afișați. getCurrentStage (): setFocus (nil) event.target.bodyType = "dinamic" sfarsit end end true ball end: addEventListener ("atinge", trage)
Această funcție ne oferă un suport de bază foarte puternic. Unele dintre punctele înalte includ setarea tipului de corp al mingii la cinematică, astfel încât gravitatea nu va trage mingea din mâinile utilizatorului (Notă: asigurați-vă că ați revenit la dinamică după terminarea atingerii). Liniile imediat după aceea sunt la fel de importante. Acolo vom opri toată mișcarea mingii când este atinsă pentru a evita aceeași problemă cu gravitatea.
Dacă rulați aplicația așa cum este acum, probabil veți observa că mingea își pierde din moment din momentul în care nu mai atingeți. Pentru a remedia acest lucru, trebuie să creați o funcție pentru a urmări viteza mingii și apoi să setați viteza mingii în mod corespunzător după terminarea atingerii.
viteza localăX = 0 viteza localăY = 0 local prevTime = 0 local prevX = 0 local prevY = 0 funcția trackVelocity (eveniment) time localPassed = event.time - prevTime prevTime = prevTime + / 1000) viteY = (ball.y - prevY) / (timePassed / 1000) prevX = ball.x prevY = sfârșitul mingii.y Runtime: addEventListener ("enterFrame", trackVelocity)
Noi creăm trackVelocity ca ascultător al evenimentului enterFrame, așa că se numește de fiecare dată când ecranul este redesenat. Ceea ce face este să găsească schimbarea vitezei peste schimbarea în timp pentru a găsi viteza mingii în pixeli pe secundă. Nu prea e mult. Adăugați următoarea linie la funcția de tragere pentru a seta corect viteza liniară a mingii.
minge: setLinearVelocity (speedX, speedY)
Începem cu mai multe lucrări vizuale, dar până acum ar trebui să fii un profesionist la dreptunghiuri, deci ar trebui să fie fără durere. Următorul cod creează janta. Observați că porțiunea de mijloc a jantei nu va fi parte a sistemului fizic deoarece vrem ca bila să treacă liber.
(207, 67, 4) local rimFront = display.newRect (110, 92, 5, 3) rimFront: setFillColor (207, 67, 4) local rimMiddle = display.newRect (110, 62, 5, 30) rimMiddle: setFillColor (207, 67, 4) fizics.addBody (rimBack, static, staticMaterial) fizics.addBody (rimFront, static, staticMaterial)
Apoi avem nevoie de o modalitate de a ști când mingea a trecut prin poartă. Cea mai ușoară modalitate de a realiza acest lucru este desemnarea unui mic patch de ecran în apropierea jantei drept "zonă de scor". Ori de câte ori mingea este în această zonă, putem crește scorul. Pentru a împiedica scorul de la înșelăciune atunci când mingea rămâne în jurul jantei, ținem evidența timpului ultimului gol și asigurăm că există o separare adecvată între fiecare gol succesiv. O întârziere de o secundă ar trebui să funcționeze frumos.
scorCtr = 0 local lastGoalTime = 1000 functie monitorScore (eveniment) daca event.time - lastGoalTime> 1000 atunci daca ball.x> 103 si ball.x < 117 and ball.y > 62 și ball.y < 92 then scoreCtr = scoreCtr + 1 print(score) lastGoalTime = event.time score.text = "Score: "… scoreCtr end end end Runtime:addEventListener("enterFrame", monitorScore)
Chiar dacă această aplicație ar fi putut fi creată cu versiunea standard a SDK Corona, munții ar fi trebuit mai mult să încerce să urmărească coliziuni, frecare, gravitate etc. Corona Game Edition are grijă de sarcinile fizice mai dificile, aveți mai mult timp să vă concentrați asupra conținutului și gameplay-ului jocului dvs..