Bouw een eindeloos runnerspel tegen krassen Bossgevechten

We hebben al een lange weg afgelegd in het bouwen van ons eindeloze runnerspel. Op dit punt in de serie zou je al een speelbare en plezierige ervaring moeten hebben, maar deze tutorial leert je hoe je nog een keer kunt toevoegen: eindbaasgevechten!

Inmiddels begint ons spel er echt uit te zien als een echt spel! We hebben een aanstuurbaar personage met verschillende soorten obstakels die willekeurig worden gegenereerd, we hebben parrallax-scrollen geïmplementeerd in drie verschillende lagen en we hebben een basisscoresysteem dat onze spelers een gevoel van voldoening geeft. Tot nu toe, zo goed. Misschien is dit genoeg voor het soort game dat je aan het ontwerpen bent en dit is alles wat je nodig hebt. Laten we echter zeggen dat je je spel wat leuker wilt maken met iets nieuws. Iets als ... een baasgevecht !!! Hoewel de meeste eindeloze schuifspellen geen enkele soort van bazig gevecht hebben, is het een goede gewoonte om te kijken naar hoe we dit soort evenementen zouden gaan ontwerpen. Dus laten we beginnen!

U zult merken dat we opnieuw hetzelfde formaat volgen met een oude map in de bijgevoegde download die het volledige project bevat dat we tot nu toe hebben gemaakt en een nieuwe map met het project nadat we deze tutorial hebben voltooid. Het eerste wat u moet doen, is zorgen dat de afbeeldingen in de juiste map staan. Je kunt boss.png en bossSpit.png uit de nieuwe map in het bijgevoegde downloadbestand halen. Merk op dat de baas niet geanimeerd is en slechts een enkele afbeelding is. Als je een geanimeerde baas wilt en je bent vergeten hoe je een sprite in Corona moet animeren, bekijk dan de tutorial voor sprite-animatie die eerder in deze serie is uitgebracht.

Nu we die in dezelfde map hebben als ons main.lua-bestand, ga je gang en open main.lua in je favoriete teksteditor. Ik ga niet heel veel uitleggen wat er hier aan de hand is (lees de opmerkingen voor hints en kleine uitleg!) Omdat we op dit punt al verschillende keren over alles hebben gesproken en ik weet zeker dat je gewoon sla het toch over. Dit zal ons ook helpen om de tutorial snel door te nemen, aangezien alles wat we hier doen we eerder hebben gedaan, dus het zijn maar een paar kleine veranderingen. Dus laten we beginnen.

Het eerste dat we zullen doen is onze afbeeldingen in het spel laden. Nogmaals, dit moet allemaal bekend voorkomen. Voeg deze code toe bovenaan waar we alle andere afbeeldingen laden. Zorg er wel voor dat bossSpits wordt gedeclareerd voordat je iets erin probeert te zetten!

 local boss = display.newImage ("boss.png", 150, 150) boss.x = 300 boss.y = 550 boss.isAlive = false boss.health = 10 boss.goingDown = true boss.canShoot = false --spitCycle is het enige dat niet zelfverklaard is - telkens als we een grondstuk terug naar rechts van het scherm verplaatsen, updaten we de score met één. Nu werken we ook de --spite-cyclus bij. Elke keer dat spitCycle een veelvoud van drie is, schiet de baas op zijn projectiel. Dit houdt gewoon bij - van dat voor ons! boss.spitCycle = 0 voor a = 1, 3, 1 do bossSpit = display.newImage ("bossSpit.png") bossSpit.x = 400 bossSpit.y = 550 bossSpit.isAlive = false bossSpit.speed = 3 bossSpits: insert ( bossSpit) einde

Voeg ze dan toe aan het scherm naast de andere toevoegingen, een goede plaats om ze te plaatsen zou zijn vlak voordat je de botsing invoegt..

 scherm: invoegen (baas) scherm: invoegen (bossSpits)

Bewaar dat en voer het uit. Ga je gang en bekijk het in de iPhone 4-versie en je zou zoiets als dit moeten zien:

Laten we ze nu iets laten doen. De manier waarop we met de baas omgaan, is dat we nogal willekeurig in het spel komen zoals de andere evenementen dat we willen dat dit op een specifiek tijdstip gebeurt. Voor dit voorbeeld gaan we het naar een laag getal instellen zodat het snel naar het evenement gaat, maar je zult het waarschijnlijk een redelijkere tijd in je spel willen maken. Dus wat er zal gebeuren is elke keer dat je monster een afstand moet lopen die gelijk is aan een veelvoud van 10. De baas zal spawnen. Terwijl we de baas spawnen, maken we de grond plat op de grond. We stoppen ook spoken en spijkermuren om op die manier te paaien, er zijn geen afleidingen van het gevecht! Wanneer hij spawnt zal hij de scène vanaf de top betreden en op en neer gaan dobberen terwijl hij hitte zoekt naar gele ballen ... van de dood!

Dus terwijl de baas op de speler schiet, moet de speler de baas doden door hem tien keer neer te schieten. De speler kan zich ook verdedigen tegen het spit door ze neer te schieten. Dus de basisstrategie om te winnen, is springen en zijn schietvaardigheden spammen! Een paar andere dingen om op te merken is dat ik in deze game besloot om de score niet bij te werken terwijl de baas nog leeft, op die manier wordt de speler gedwongen om de baas te verslaan om hogere scores te krijgen. Het laatste ding voordat we verder gaan is dat ik de baas heb ingesteld om elke drie blockUpdates een shot te schieten. Dit heeft weer het voordeel dat de moeilijkheid automatisch schalen met het spel. Het biedt ook een eenvoudige manier om consistente foto's te maken. Niets is te gek, maar over het algemeen voegt het een leuke draai aan het spel toe.

Om meer ruimte voor de baas op het scherm te krijgen, heb ik de speler iets verder terug op het scherm geplaatst. Ik start de held nu als volgt uit:

 monster.x = 60

Dit opent het niveau een beetje. Het volgende dat we moeten doen, is doorgaan en onze functies ploffen, die de baas en het spuug van de baas zullen updaten:

 function updateBoss () --controleer of de baas niet is gedood als (boss.health> 0) dan - controleer of de baas van richting moet veranderen (boss.y> 210) en dan baas wordt. goingDown = false end if (boss.y < 100) then boss.goingDown = true end if(boss.goingDown) then boss.y = boss.y + 2 else boss.y = boss.y - 2 end else --if the boss has been killed make him slowly disappear boss.alpha = boss.alpha - .01 end --once the monster has been killed and disappear officially --kill him off and reset him back to where he was if(boss.alpha <= 0) then boss.isAlive = false boss.x = 300 boss.y = 550 boss.alpha = 1 boss.health = 10 inEvent = 0 boss.spitCycle = 0 end end function updateBossSpit() for a = 1, bossSpits.numChildren, 1 do if(bossSpits[a].isAlive) then (bossSpits[a]):translate(speed * -1, 0) if(bossSpits[a].y > monster.y) dan bossSpits [a] .y = bossSpits [a] .y - 1 end if (bossSpits [a] .y < monster.y) then bossSpits[a].y = bossSpits[a].y + 1 end if(bossSpits[a].x < -80) then bossSpits[a].x = 400 bossSpits[a].y = 550 bossSpits[a].speed = 0 bossSpits[a].isAlive = false; end end end end

Met degenen die zich daar bevinden, hoeven we slechts enkele aanpassingen aan sommige van onze andere functies aan te brengen en deze toe te voegen aan onze update () -functie:

 updateBossSpit () als (boss.isAlive == true) en updateBoss () eindigen

Voeg die toe in de updatefunctie en ga vervolgens naar de checkEvent () functie en waar je de code ziet die er zo uitziet:

 if (inEvent> 0 en eventRun> 0) en dan - Doe niets anders

Rechts onder die else-opdracht leeg je alles wat zich daar bevond en verander je dit:

 --dit is waar we de baas na elke 10 blokken spawnen - ook de baas van de gezondheid van hier controleren als (boss.isAlive == false en score% 10 == 0) dan boss.isAlive = true boss.x = 400 boss.y = -200 boss.health = 10 end - als de baas nog in leven is, houd je het evenement op 15 - dit zal voorkomen dat de andere gebeurtenissen paaien als (boss.isAlive == true) dan inEvent = 15 anders - alles hier beneden moet hetzelfde zijn als vóór check = math.random (100) if (vink> 80 aan en vink aan < 99) then inEvent = math.random(10) eventRun = 1 end if(check > 98) en vervolgens inEvent = 11 eventRun = 2 einde indien (vink> 72 aan en vink aan < 81) then inEvent = 12 eventRun = 1 end if(check > 60 en vink aan < 73) then inEvent = 13 eventRun = 1 end end

Er mag daar niets te gek zijn. Als u niet vertrouwd bent met programmeren, kent u misschien niet het modulus-symbool:%. Wat dit doet, is elke getallen die je hebt nemen en verdeelt het eerste getal met het tweede getal en geeft de rest terug. Dus als de score 15 is, scoor% 10 dan 5, wat niet 0 is, dus het zal de boss-gebeurtenis niet spawnen. Hetzelfde geldt voor elk nummer dat geen veelvoud is van 10. Op deze manier kunnen we gemakkelijk bepalen hoe vaak iets spawnt. De volgende stap is terug in updateBlocks (). Recht onder de if-verklaring die zegt:

 if ((blokken [a]). x < -40) then

Je gaat het gedeelte scoreText nemen en het in een if-statement plaatsen dat controleert of de baas nog leeft (we gaan de score niet bijwerken terwijl hij nog leeft!) Als onderdeel van de if-statement ben je gaat een ander toevoegen dat de baas iets van zijn gedrag geeft). Maak die sectie er als volgt uit:

 --update alleen de score als de baas niet leeft als (boss.isAlive == false) dan scoort = score + 1 scoreText.text = "score:" ... score scoreTekst: setReferencePoint (display.CenterLeftReferencePoint) scoreText.x = 0 scoreText. y = 30 anders - heb de baas elke drie blokken spuugs doorgespeeld boss.spitCycle = boss.spitCycle + 1 if (boss.y> 100 en boss.y < 300 and boss.spitCycle%3 == 0) then for a=1, bossSpits.numChildren, 1 do if(bossSpits[a].isAlive == false) then bossSpits[a].isAlive = true bossSpits[a].x = boss.x - 35 bossSpits[a].y = boss.y + 55 bossSpits[a].speed = math.random(5,10) break end end end end if(inEvent == 15) then groundLevel = groundMin end

Nog steeds niets te verschrikkelijk moeilijk, zoals ik al zei. Er zou hier niet veel nieuw materiaal moeten zijn. Het volgende deel is gewoon meer hetzelfde en dan zijn we klaar. Het volgende ding dat we gaan toevoegen is de botsingsdetectiecontrole om moorden te zien. Laten we beginnen met de ontploffing van het monster, we moeten zowel tegen het spuug van de baas als tegen het monster zelf controleren.

Voeg deze regels toe aan de updateBlasts () -functie:

 --controleer op botsingen met de baas als (boss.isAlive == true) dan if (blasts [a] .y - 25> boss.y - 120 en blasts [a] .y + 25 < boss.y + 120 and boss.x - 40 < blasts[a].x + 25 and boss.x + 40 > ontploffingen [a] .x - 25) en dan ontploffingen [a] .x = 800 ontploffingen [a] .y = 500 ontploffingen [a] .isAlive = vals - alles is hetzelfde slechts 1 treffer zal de baas niet doden dus gewoon een beetje gezondheid wegnemen boss.health = boss.health - 1 end end - check voor botsingen tussen de ontploffingen en de bossSpit voor b = 1, bossSpits.numChildren, 1 do if (bossSpits [b] .isAlive == true) dan als (blasts [a] .y - 20> bossSpits [b] .y - 120 en blasts [a] .y + 20 < bossSpits[b].y + 120 and bossSpits[b].x - 25 < blasts[a].x + 20 and bossSpits[b].x + 25 > ontploffingen [a] .x - 20) en vervolgens ontploffingen [a] .x = 800 ontploffingen [a] .y = 500 ontploffingen [a] .isAlive = false bossSpits [b] .x = 400 bossSpits [b] .y = 550 bossSpits [b] .isAlive = false bossSpits [b] .speed = 0 end end end

Nog een botsingsdetectie om te gaan en dat is het spugen van de baas tegen onze speler controleren. Voeg dit toe aan de functie checkCollisions ():

 --zorg ervoor dat de speler niet geraakt werd door het spit van de baas! voor a = 1, bossSpits.numChildren, 1 do if (bossSpits [a] .isAlive == true) then if (((((monster.y-bossSpits [a] .y))<45)) and ((  ((monster.y-bossSpits[a].y))>-45)) en ((((monster.x-bossSpits [a] .x))> - 45))) - stop dan de monstersnelheid = 0 monster.isAlive = false - dit pauzeert gewoon het huidige animatiemonster: pause () gameOver.x = display.contentWidth * .65 gameOver.y = display.contentHeight / 2 end end end

Nogmaals, dat zou allemaal behoorlijk bekend moeten voorkomen. Het laatste dat we moeten doen, is onze restartGame () -functie gebruiken en deze bijwerken met de informatie van de baas samen met zijn speeksel..

Merk ook op dat, omdat we de positie monster.x hebben veranderd in deze tutorial, het belangrijk is dat we in plaats van het opnieuw instellen van monster.x naar 110 nu het monster.x bijwerken om zijn nieuwe positie weer te geven, namelijk 60.

 --reset de baas boss.isAlive = false boss.x = 300 boss.y = 550 - reset het spit van de baas voor a = 1, bossSpits.numChildren, 1 do bossSpits [a] .x = 400 bossSpits [a] .y = 550 bossSpits [a] .isAlive = false end

Bewaar dat, voer het uit en geniet van de nieuwe toevoeging aan het spel! Je zou nu zoiets moeten rocken:

en

Zoals ik al verschillende keren zei, was er niet echt een hoop gekke nieuwe content, maar ik dacht dat het een goede oefening zou zijn om je te laten zien hoe gemakkelijk het is om je game te updaten met nieuwe content. Ook toont het nieuwe benaderingen voor het toevoegen van gebeurtenissen, zodat ze meer op aanvraag zijn die willekeurig zijn. De meeste van deze spellen zullen waarschijnlijk een combinatie van beide implementeren. Een goed voorbeeld van een game die dit goed doet, is bit.trip runner. Bekijk het om een ​​goed idee te krijgen van wat er met deze stijl van spel kan worden gedaan. Als we iets te snel hebben doorlopen en je hebt nog vragen, laat het me dan weten, zo niet maak je klaar om ons spel de volgende keer een beetje beter georganiseerd te krijgen met een leuk nieuw menusysteem dat deze game compleet zal maken. Bedankt voor het volgende en we zien je de volgende keer!