Opprette et enkelt basketballspill med Corona Game Edition

Fysikkmotoren som følger med Corona Game Edition er et utrolig kraftig og brukervennlig verktøy. I denne opplæringen vil vi dekke ferdigstillelsen av et rudimentært basketballspill med denne spennende teknologien.

Trinn 1: Konfigurere Fysikkmotor

 display.setStatusBar (display.HiddenStatusBar) lokal fysikk = krever fysikk. physics.start () physics.setGravity (9.81, 0) - 9.81 m / s * s i den positive x-retningen physics.setScale (80) - 80 piksler per meter physics.setDrawMode ("normal")

Det første vi gjør (som i mange programmer) er å kvitte seg med statuslinjen øverst på skjermen. Deretter gjør vi det nødvendige kravet om å bruke fysikk og lagre resultatet i den passende navnet "fysikk" -variabelen. Ting blir mer interessante i de neste linjene. I linje fem satte vi gravitasjonsakselerasjonen. Tyngdekraften er typisk satt til 9,8 m / s * s i positiv y-retning, men i dette tilfellet ønsker vi å gjøre tyngdekraften trekke i den positive x-retningen fordi applikasjonen vil ha en landskapsorientering. Videre setter vi skalaen til 80 piksler per meter. Dette nummeret kan variere ganske litt basert på størrelsen på objektene i søknaden din, og du må kanskje leke med det for å gi spillet ditt den riktige følelsen. Jeg valgte 80 px / m fordi jeg vil passe rundt 15 fot vertikal plass på skjermen. Å vite at det er bare et enkelt spørsmål om enhetskonvertering for å få en verdi.

Merk: Det er viktig å prøve og knytte alt til virkelige verdensobjekter i applikasjoner med fysikk. Jo mer virkelige målinger du bruker, jo mindre gjetning vil det være og jo mer realistisk vil søknaden din virke.

Vi runder ut disse få linjene ved å sette trekkmodusen til normal. Denne linjen gjør det lettere å bytte til feilsøkingsmodus senere hvis vi skulle fikse noe utilsiktet oppførsel med kollisjoner. Angi dette til vanlig er standardadferd og trekker figurene som brukeren vil se dem i det endelige spillet.


Trinn 2: Opprette arenaen

 lokal bakgrunn = display.newImage ("CourtBackground.png") lokal score = display.newText ("Score: 0", 50, 300) score: setTextColor (0, 0, 0) score.rotation = -90 score.size = 36 lokal gulv = display.newRect (320, 0, 1, 480) lokal lWall = display.newRect (0, 480, 320, 1) lokal rWall = display.newRect (0, -1, 320, 1) lokalt tak = display.newRect (-1, 0, 1, 480) staticMaterial = tetthet = 2, friksjon = .3, sprette = .4 physics.addBody (gulv, "statisk", staticMaterial) physics.addBody (lWall, "static ", staticMaterial) physics.addBody (rWall," static ", staticMaterial) physics.addBody (tak," statisk ", staticMaterial)

Denne blokken etablerer arenaens grenser, og egenskapene til alle de statiske gjenstandene i søknaden. Vi begynner med å legge til et enkelt bilde i bakgrunnen. Inne i det hvite rektangelet i bakgrunnsbildet plasserer vi litt tekst for å vise nåværende poengsum. Fordi programmet vil bli vist i liggende modus, gjør vi også nødvendige rotasjonsjusteringer her. Arenaen må fange ballen i den synlige delen av skjermen. Vi oppnår dette med fire statiske rektangler (gulv, lWall, rWall, tak) plassert rett ut av visningen.

Deretter tar vi fysikk tilbake i ligningen. I stedet for å gjenskape tabellen for de fysiske egenskapene til hvert objekt, oppretter vi et tabellnavn staticMaterial som skal gjenbrukes for hver av veggene og målet selv. Jeg har valgt ganske standardverdier for disse egenskapene, selv om jeg oppfordrer deg til å leke med dem. Det er et enda skritt vi må ta, og det er å fortelle Corona at disse objektene skal delta i fysikkberegninger. Vi gjør dette ved å ringe addBody-funksjonen til fysikkobjektet. Denne funksjonen tar tre argumenter:

  1. Objektet
  2. En valgfri modifikator
  3. Et bord med fysiske egenskaper

Vi har allerede bestemt egenskapene og objektene, så alt som gjenstår er den valgfrie modifikatoren. Vi bruker "statisk" for å hindre tyngdekraft, eller noe kraft for den saks skyld, fra å forflytte våre vegger!


Trinn 3: Legge til en ball og et mål

 -- Opprett mål lokalt vertPost = display.newRect (110, 5, 210, 10) vertPost: setFillColor (33, 33, 33) lokal horizPost = display.newRect (110, 10, 10, 40) horizPost: setFillColor (33, 33 , 33) lokal bakplate = display.newRect (55, 50, 85, 5) bakplate: setFillColor (33, 33, 33) physics.addBody (vertPost, "statisk", staticMaterial) physics.addBody (horizPost, "static" staticMaterial) physics.addBody (bakbrett, "statisk", staticMaterial) --Kjør ballen lokal ball = display.newCircle (50, 200, 10) ball: setFillColor (192, 99, 55) physics.addBody = .8, friksjon = .3, sprett = .6, radius = 10)

I et fall, skaper vi resten av de visuelle elementene i appen vår. Dette bør alle se veldig kjent ut. Det er bare to ting jeg vil påpeke. For det første kan noen av verdiene for posisjonering av målet virke av. Dette er å redegjøre for landskapsretningen. Målet vises oppreist når enheten roteres på siden. Sørg også for å inkludere radiusegenskapen i egenskapstabellen til ballen slik at den vil oppføre seg riktig.


Trinn 4: Opprett drastøtte for ballen

 lokal funksjon dra (event) lokal ball = event.target lokal fase = event.phase hvis "startet" == fase deretter display.getCurrentStage (): setFocus (ball) - Lagre startposisjon ball.x0 = event.x - ball .x ball.y0 = event.y - ball.y - Unngå gravitasjonskrefter event.target.bodyType = "kinematisk" - Stopp gjeldende bevegelse, hvis noen event.target:setLinearVelocity (0, 0) event.target.angularVelocity = 0 annet hvis "flyttet" == fase da ball.x = event.x - ball.x0 ball.y = event.y - ball.y0 elseif "ended" == fase eller "avbrutt" == fase deretter vise. getCurrentStage (): setFocus (nil) event.target.bodyType = "dynamisk" endeendrevert sann endeball: addEventListener ("touch", dra)

Denne funksjonen gir oss svært grunnleggende drastøtte. Noen av de høye punktene er å sette kroppens type til kinematisk, slik at tyngdekraften ikke vil trekke ballen ut av brukerens hender (Merk: Husk å sette dette tilbake til dynamisk etter at berøringen er avsluttet). Linjene like etter det er like viktige. Der stopper vi hele ballens bevegelse når den berøres for å unngå det samme problemet vi hadde med tyngdekraften.

Hvis du kjører appen som den er nå, vil du sannsynligvis legge merke til at ballen mister all sin momentum så snart du slutter å berøre den. For å rette opp dette, må vi opprette en funksjon for å spore ballens hastighet, og deretter sette ballens hastighet på riktig måte etter at berøringen er ferdig.

 lokal speedX = 0 lokal hastighet = 0 lokal prevTime = 0 lokal prevX = 0 lokal prevY = 0 funksjon sporVelocity (event) lokal timePassed = event.time - prevTime prevTime = prevTime + timePassed speedX = (ball.x - prevX) / (timePassed / 1000) speedY = (ball.y - prevY) / (timePassed / 1000) prevX = ball.x prevY = ball.y slutt Runtime: addEventListener ("enterFrame", trackVelocity)

Vi lager trackVelocity som en lytter til enterFrame-hendelsen, så det kalles hver gang skjermen er oppbrukt. Hva det gjør er å finne endringen i fart over tidskiftet for å finne ballens hastighet i piksler per sekund. Det er egentlig ikke mye til det. Legg til følgende linje i dra-funksjonen for å korrekt angi ballens lineære hastighet.

 ball: setLinearVelocity (speedX, speedY)

Trinn 5: Opprette Hoop og Scoring Mechanism

Vi begynner med litt mer visuelt arbeid, men nå skal du være en pro på rektangler, så det bør være smertefritt. Følgende kode skaper feltet. Legg merke til at midtparten av felgen ikke kommer til å være en del av det fysiske systemet fordi vi vil at ballen skal passere fritt.

 lokal rimBack = display.newRect (110, 55, 5, 7) rimBack: setFillColor (207, 67, 4) lokal rimFront = display.newRect (110, 92, 5, 3) rimFront: setFillColor (207, 67, 4) lokal rimmiddle = display.newRect (110, 62, 5, 30) rimMiddle: setFillColor (207, 67, 4) physics.addBody (rimBack, "static", staticMaterial) physics.addBody (rimFront, "static", staticMaterial)

Deretter trenger vi en måte å vite når ballen har gått gjennom målet. Den enkleste måten å oppnå dette på er å angi en liten patch av skjermen nær felgen som en "poengsone". Når ballen er i denne sonen kan vi øke poengsummen. For å forhindre at poengsummen mislykkes når ballen drar rundt randen, holder vi oversikt over tidspunktet for det siste målet, og sikrer at det er tilstrekkelig skille mellom hvert suksessivt mål. En sekund forsinkelse skal fungere pent.

 scoreCtr = 0 lokal sisteGoalTime = 1000 funksjonsmonitorScore (event) hvis event.time - lastGoalTime> 1000 så hvis ball.x> 103 og ball.x < 117 and ball.y > 62 og ball.y < 92 then scoreCtr = scoreCtr + 1 print(score) lastGoalTime = event.time score.text = "Score: "… scoreCtr end end end Runtime:addEventListener("enterFrame", monitorScore)

Konklusjon

Selv om denne appen kunne ha blitt opprettet med standardversjonen av Corona SDK, ville det ha vært fjell mer arbeid som forsøker å holde styr på kollisjoner, friksjon, tyngdekraft etc. Corona Game Edition tar seg av de vanskeligere fysikkoppgaver, forlater du med mer tid til å fokusere på innholdet og spillingen av spillet ditt.