CoronaSDK Creëer een onderhoudend stuitergame

In deze zelfstudie laat ik je zien hoe je een stuitergame kunt maken met de Corona SDK. U leert meer over de teken-API, tiptoetsen en willekeurige nummers. Het doel van dit spel is om een ​​paddle te gebruiken om te voorkomen dat ballen de grond raken. Lees verder voor meer informatie!

1. Toepassingsoverzicht

We gebruiken vooraf gemaakte afbeeldingen om een ​​opwindend spel te coderen met Lua en Corona SDK API's.

Na voltooiing gebruikt de speler het aanraakscherm op het apparaat om een ​​paddle te besturen. De parameters in de code kunnen worden aangepast om het spel aan te passen.


2. Doelapparaat

Het eerste dat we moeten doen is het platform selecteren waarop we onze app willen gebruiken. Op deze manier kunnen we de grootte kiezen voor de afbeeldingen die we zullen gebruiken.

Het iOS-platform heeft de volgende kenmerken:

  • iPad 1/2 / Mini: 1024x768px, 132 ppi
  • iPad Retina: 2048 x 1536, 264 ppi
  • iPhone / iPod Touch: 320 x 480 px, 163 ppi
  • iPhone / iPod Retina: 960x640 px, 326 ppi
  • iPhone 5 / iPod Touch: 1136x640, 326 ppi

Omdat Android een open platform is, zijn er veel verschillende apparaten en resoluties. Enkele van de gebruikelijke schermkenmerken zijn:

  • Asus Nexus 7 Tablet: 800x1280px, 216 ppi
  • Motorola Droid X: 854x480 px, 228 ppi
  • Samsung Galaxy SIII: 720x1280px, 306 ppi

In deze zelfstudie concentreren we ons op het iOS-platform met het grafische ontwerp, specifiek om te ontwikkelen voor distributie naar een iPhone / iPod touch, maar de hier gepresenteerde code is ook van toepassing op Android-ontwikkeling met de Corona SDK.


3. Interface

Er zal een eenvoudige en vriendelijke interface worden gebruikt. Dit omvat meerdere vormen, knoppen, bitmaps en meer.

De interface grafische hulpmiddelen die nodig zijn voor deze tutorial zijn te vinden in de bijgevoegde download.


4. Grafieken exporteren

Afhankelijk van het apparaat dat u hebt geselecteerd, moet u mogelijk de afbeeldingen in de aanbevolen PPI exporteren. U kunt dat doen met uw favoriete foto-editor.

Ik gebruikte de Grootte aanpassen ... functie in de Preview-app op Mac OS X.

Vergeet niet om de afbeeldingen een beschrijvende naam te geven en deze in uw projectmap op te slaan.


5. App-configuratie

We zullen een extern bestand gebruiken om de applicatie op meerdere apparaten op volledig scherm te laten verschijnen (de config.lua het dossier). Dit bestand toont de oorspronkelijke schermgrootte en de methode die wordt gebruikt om die inhoud te schalen in het geval de app in een andere schermresolutie wordt uitgevoerd.

 toepassing = content = width = 320, height = 480, scale = "letterbox",

2. Main.lua

Laten we de applicatie schrijven!

Open de Lua-editor van uw voorkeur (elke teksteditor werkt, maar u hoeft geen syntax te markeren) en bereid u voor op het schrijven van uw geweldige app. Vergeet niet om het bestand op te slaan als main.lua in je projectmap.


7. Codestructuur

We zullen onze code structureren alsof het een Klasse is. Als u ActionScript of Java kent, vindt u de structuur vertrouwd.

 Noodzakelijke klassenvariabelen en constanten Declare Functions contructor (Hoofdfunctie) class methods (other functions) call Hoofdfunctie

8. Verberg Statusbalk

 display.setStatusBar (display.HiddenStatusBar)

De bovenstaande code verbergt de statusbalk. De statusbalk is de balk boven op het scherm van het apparaat die de tijd, het signaal en andere indicatoren toont.


9. Achtergrond

Een eenvoudige vector wordt gebruikt als achtergrond voor de applicatie-interface. De volgende regel code maakt het.

 -- Graphics - [Background] local bg = display.newRect (0, 0, display.contentWidth, display.contentHeight) bg: setFillColor (52, 46, 45)

10. Titelweergave

Dit is de titelweergave, het is het eerste interactieve scherm dat in onze game verschijnt. Deze variabelen slaan de componenten op:

 -- [Title View] lokale titel local playBtn local creditsBtn local titleView

11. Credits bekijken

Deze weergave toont de credits en copyright van het spel. Deze variabele wordt gebruikt om het op te slaan:

 -- [CreditsView] local creditsView

12. Instructiebericht

Een instructiebericht verschijnt aan het begin van het spel en wordt na 2 seconden getweend. U kunt de tijd later in de code wijzigen.

 -- Instructies lokale ins

13. Kleurcirkels

Hier zijn de cirkels of ballen. Het doel van het spel is om te voorkomen dat ze de onderkant van het scherm raken.

 -- Kleurcirkels lokale kringen = display.newGroup ()

14. Alert

Dit is de waarschuwing die wordt weergegeven wanneer een bal de grond raakt. Het zal de score weergeven en het spel beëindigen.

 -- Lokale alert melden

15. Geluiden

We gebruiken Geluidseffecten om het spelgevoel te verbeteren. De geluiden die in deze game worden gebruikt, zijn gemaakt in as3sfxr.

 -- Klinkt lokaal bounceSnd = audio.loadSound ('bounce.wav') local loseSnd = audio.loadSound ('lose.wav')

16. Variabelen

Dit zijn de variabelen die we zullen gebruiken. U kunt de opmerkingen in de code lezen om meer over hen te weten te komen.

 -- Variabelen lokale circleTimer - voegt elke keer een nieuwe cirkel toe, lokale kleuren = 71, 241, 255, 255, 204, 0, 245, 94, 91, 0, 255, 204,  250, 140, 254, - Mogelijke kleuren voor de cirkels (R, G, B)

17. Declareer functies

Vervolgens verklaren alle functies als lokaal aan het begin.

 -- Lokale functies = lokale startbuttonListeners =  lokale showCredits =  lokale hideCredits =  lokale showGameView =  lokale gameListeners =  lokale verplaatsingBar =  lokale addCircle =  lokale onCollision =  lokale waarschuwing =  

18. Constructor

Tijdens deze stap maken we de functie die de spellogica initialiseert:

 functie Main () - code ... einde

19. Titelweergave toevoegen

Nu plaatsen we de TitleView in de fase en bel een functie die de tik luisteraars naar de knoppen.

 function Main () title = display.newImage ('title.png') playBtn = display.newImage ('playBtn.png', 130, 248) creditsBtn = display.newImage ('creditsBtn.png', 125, 316) titleView = display.newGroup (title, playBtn, creditsBtn) startButtonListeners ('add') end

20. Startknop Luisteraars

Deze functie voegt de nodige luisteraars toe aan de TitleView toetsen:

 function startButtonListeners (action) if (action == 'add') then playBtn: addEventListener ('tap', showGameView) creditsBtn: addEventListener ('tap', showCredits) else playBtn: removeEventListener ('tap', showGameView) creditsBtn: removeEventListener ( 'tik', showCredits) einde

21. Credits tonen

Het credits scherm wordt getoond wanneer de gebruiker op de wat betreft knop, a tik luisteraar is toegevoegd aan de weergave credits om deze te verwijderen.

 functie showCredits: tik op (e) playBtn.isVisible = false creditsBtn.isVisible = false creditsView = display.newImage ('credits.png', 0, display.contentHeight) transition.to (creditsView, time = 300, y = display. contentHeight - (creditsView.height - 40), onComplete = function () creditsView: addEventListener ('tap', hideCredits) end) einde

22. Verberg tegoed

Wanneer het creditsscherm wordt aangebroken, wordt het uit het werkgebied geschud en verwijderd.

 function hideCredits: tik op (e) transition.to (creditsView, time = 300, y = display.contentHeight + 40, onComplete = function () creditsBtn.isVisible = true playBtn.isVisible = true creditsView: removeEventListener ('tap', hideCredits ) display.remove (creditsView) creditsView = nil end) end

23. Game-weergave tonen

Wanneer de Spelen knop is aangetikt, de TitleView wordt getweend en verwijderd, waardoor de GameView. Er zijn veel onderdelen betrokken bij deze weergave, dus we zullen ze opsplitsen in de volgende paar stappen.

 functie showGameView: tik op (e) transition.to (titleView, time = 300, x = -titleView.height, onComplete = function () startButtonListeners ('rmv') display.remove (titleView) titleView = nil end)

24. Instructies Bericht

De volgende regels voegen het instructiesbericht toe:

 ocal ins = display.newImage ('ins.png', 160, 355) transition.from (ins, time = 200, alpha = 0.1, onComplete = function () timer.performWithDelay (2000, function () transition.to ( ins, time = 200, alpha = 0.1, onComplete = function () display.remove (ins) ins = nil end) end) end)

25. Paddle toevoegen

Met deze stap wordt de paddle gemaakt en op het podium geplaatst. Een naam kan later worden toegevoegd voor eenvoudiger toegang.

 -- Add Bar bar = display.newRoundedRect (70, 340, 160, 10, 3) bar.name = 'bar'

26. Muren

Nu maken we muren rond het scherm om te voorkomen dat de ballen het podium verlaten.

 -- Wanden links = display.newLine (0, 240, 0, 720) left.isVisible = false right = display.newLine (320, 240, 320, 720) right.isVisible = false bottom = display.newLine (160, 480, 480 , 480) bottom.isVisible = false

27. Score

Hier is een score TextField rechtsboven op het podium maken:

 -- Score score = display.newText ('0', 300, 0, 'Futura', 15)

28. Natuurkunde

Vervolgens moeten we fysica aan onze objecten toevoegen. Hier gebruiken we de Filter eigenschap die voorkomt dat bepaalde objecten met elkaar botsen. Dit voorkomt dat onze cirkels botsen terwijl botsingen tussen de muren en paddle blijven. U kunt een eenvoudige uitleg van zijn gedrag vinden op de Corona-site.

 -- Physics physics.addBody (bar, 'static', filter = categoryBits = 4, maskBits = 7) physics.addBody (links, 'static', filter = categoryBits = 4, maskBits = 7) natuurkunde .addBody (rechts, 'static', filter = categoryBits = 4, maskBits = 7) physics.addBody (bottom, 'static', filter = categoryBits = 4, maskBits = 7) gameListeners (' voeg ') toe

29. Spelluisteraars

De volgende functie voegt de nodige luisteraars toe om de spellogica te starten:

 functie gameListeners (actie) if (action == 'add') en vervolgens bg: addEventListener ('touch', moveBar) circleTimer = timer.performWithDelay (2000, addCircle, 5) bar: addEventListener ('collision', onCollision) onderaan: addEventListener ('botsing', waarschuwing) else bg: removeEventListener ('touch', moveBar) timer.cancel (circleTimer) circleTimer = nil bar: removeEventListener ('collision', onCollision) onderaan: removeEventListener ('botsing', waarschuwing) einde

30. Verplaats de peddel

Het aanraken van de achtergrond roept de volgende functie op die de beweging van de paddle afhandelt. Het volgt de vinger en blijft daar bovenop.

 functie moveBar (e) if (e.phase == 'verplaatst') en vervolgens bar.x = e.x bar.y = e.y - 40 end - Houd balk 1/3 vanaf de top als (bar.y < 160) then bar.y = 160 end end

31. Voeg een cirkel toe

De circleTimer roept deze code. Het creëert een cirkel of bal aan de bovenkant van het scherm (die dan omlaag wordt bewogen door de zwaartekracht) en geeft het een willekeurig formaat en kleur uit onze kleuren Tafel. De kleurwaarden worden vervolgens opgeslagen in om de paddle ook te veranderen. Een kleine druk wordt toegevoegd in een willekeurige richting, berekend door de dir en r variabelen.

 functie addCircle () local r = math.floor (math.random () * 12) + 13 local c = display.newCircle (0, 0, r) cx = math.floor (math.random () * (display.contentWidth - (r * 2))) cy = - (r * 2) - lokale kleur van de cirkelkleur = math.floor (math.random () * 4) + 1 c.c1 = kleuren [kleur] [1] c. c2 = kleuren [kleur] [2] c.c3 = kleuren [kleur] [3] c: setFillColor (c.c1, c.c2, c.c3) physics.addBody (c, 'dynamic', radius = r , bounce = 0.95, filter = categoryBits = 2, maskBits = 4) circles: insert (c) - Move Horizontaal lokale richting als (r < 18) then dir = -1 else dir = 1 end c:setLinearVelocity((r*2) * dir, 0 ) end

32. Botsingen

Deze functie werkt als de paddle tegen een bal botst. Het speelt een geluid, verhoogt de score en verandert de paddle-kleur.

 function onCollision (e) audio.play (bounceSnd) bar: setFillColor (e.other.c1, e.other.c2, e.other.c3) score.text = tostring (tonumber (score.text) + 50) score: setTextColor (e.other.c1, e.other.c2, e.other.c3) score.x = 300 einde

33. Waarschuwing

De waarschuwingsfunctie maakt een waarschuwingsweergave, animeert deze en beëindigt het spel.

 function alert () audio.play (loseSnd) gameListeners ('rmv') alertView = display.newImage ('alert.png', 90, 200) transition.from (alertView, time = 200, alpha = 0.1) local score TF = display.newText (score.text, 145, 253, 'Futura', 17) scoreTF: setTextColor (255, 255, 255) - Wacht 100 ms om de natuurkunde te stoppen timer.performWithDelay (100, function () physics.stop ( ) einde, 1) einde

34. Hoofdfunctie oproepen

Om het spel te starten, de Hoofd functie moet worden gebeld. Met de bovenstaande code op zijn plaats, doen we dat hier:

 Hoofd()

35. Scherm laden

De Default.png bestand is een afbeelding die wordt weergegeven wanneer de toepassing start terwijl iOS de basisgegevens laadt die moeten worden weergegeven in het hoofdscherm. Voeg deze afbeelding toe aan uw projectbronmap en deze wordt vervolgens automatisch toegevoegd door de Corona-compilatie.


36. Pictogram

Met behulp van de afbeeldingen die u eerder hebt gemaakt, kunt u nu een goed uitziend pictogram maken. De pictogramgrootte voor het niet-retina-iPhone-pictogram is 57x57px, maar de netvliesversie is 114x114px. Houd er rekening mee dat de iTunes Store een 512x512px-versie vereist. Ik stel voor eerst de 512x512-versie te maken en vervolgens de overige formaten te verkleinen.

Het hoeft niet de afgeronde hoeken of de transparante schittering te hebben, iTunes en de iPhone doen dat voor u.


37. Testen in Simulator

Het is tijd voor de laatste test. Open de Corona Simulator, blader naar uw projectmap en klik vervolgens op Open. Als alles werkt zoals verwacht, bent u klaar voor de laatste stap!


38. Bouw

Ga in de Corona Simulator naar Bestand> Build en selecteer uw doelapparaat. Vul de vereiste gegevens in en klik op Bouwen. Wacht een paar seconden en uw app is gereed voor apparaattesten en / of verzending voor distributie!


Conclusie

In deze zelfstudie hebben we geleerd over het tekenen van API, timers, willekeurige getallen en andere vaardigheden die ongelooflijk nuttig kunnen zijn in een groot aantal games.

Experimenteer met het eindresultaat en probeer je eigen aangepaste versie van het spel te maken!

Ik hoop dat je deze tutorialserie leuk vond en vond het nuttig. Bedankt voor het lezen!