Building Frogger med Flixel: Bevegelse, Kollisjon og Distribusjon
Del
Del
Del
Del
Dette Cyber mandag Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av.
Dette er den andre av to tutorials detaljering hvordan du bruker Flixel å bygge Frogger for web og AIR på Android.
Innledning
Velkommen til den andre av to tutorials som viser hvordan å bygge Frogger for Web og AIR på Android. I forrige del snakket jeg om hvordan du setter opp Flixel, endre statene og vi bygde vår første nivå for Frogger. Dessverre er det ikke mye vi kan gjøre med vårt spill uten en spiller. Denne opplæringen vil dekke grunnleggende bevegelse, dueller, administrerende spillet staten og distribusjon av vår kode til Android. Det er mye å dekke så la oss komme i gang
Endelig resultat Forhåndsvisning
Her er en forhåndsvisning av hva vi vil bygge i denne opplæringen!
Trinn 1: Opprette Spilleren
Vår spiller representerer den siste skuespilleren klassen vi trenger for å bygge. Lag en frosk klasse og konfigurere det slik:
Du må også legge til følgende kode i vår nye klasse:
packagecom.flashartofwar.frogger.sprites {import com.flashartofwar.frogger.enum. GameStates; import com.flashartofwar.frogger.states.PlayState; import flash.geom.Point; import org.flixel.FlxG; import org.flixel.FlxSprite; public class Frog strekker FlxSprite {private Var startposisjonen: Point; private Var Movex: int; private Var maxMoveX: int; private Var maxMoveY: int; private Var targetX: Number; private Var targetY: Number; private Var animationFrames: int = 8; private Var moveY: Number; private Var tilstand: PlayState; offentlig Var isMoving: Boolean; /** * The Frog representerer hoved spillerens karakter. Denne klassen inneholder alle farten, animasjon, * og noen spesiell kollisjon logikk for Frog. * *param X start X *param Y starte Y * /public funksjon Frog (X: Antall, Y: Number) {super (X, Y); //Lagre startposisjon som skal brukes senere når du starter startposisjonen = new Point (X, Y); //Beregn mengden av piksler for å flytte hver tur Movex = 5; moveY = 5; maxMoveX = Movex * animationFrames; maxMoveY = moveY * animationFrames; //Set frosk mål x, y startposisjon slik at han kan flytte targetX = X; targetY = Y; //Sett opp sprite grafikk og animasjoner loadGraphic (GameAssets.FrogSpriteImage, true, false, 40, 40); addAnimation ("tomgang" + UP, [0], 0, false); addAnimation ("tomgang" + HØYRE, [2], 0, false); addAnimation ("tomgang" + NED, [4], 0, false); addAnimation ("tomgang" + VENSTRE, [6], 0, false); addAnimation ("walk" + UP, [0,1], 15, true); addAnimation ("walk" + HØYRE, [2,3], 15, true); addAnimation ("walk" + NED, [4,5], 15, true); addAnimation ("walk" + VENSTRE, [6,7], 15, true); addAnimation ("die", [8, 9, 10, 11], 2, false); //Set vendt stilling vendt = FlxSprite.UP; //Lagre en forekomst av PlayState å hjelpe til med dueller og bevegelse state = FlxG.state som PlayState; } /** * Denne styre hvilken retning frosken står overfor. Det endrer også markeringsrammen rundt sprite. * *param Verdi * /styre offentlig funksjon ligger vendt (verdi: uint): void {super.facing = verdi; if (verdi == UP || verdi == NED) {width = 32; height = 25; offset.x = 4; offset.y = 6; } Else {width = 25; height = 32; offset.x = 6; offset.y = 4; }} /** * Hoved Frog oppdatering loop. Dette håndterer tastaturet bevegelse, kollisjon og flagging id bevegelse. * /Overstyre offentlig funksjon oppdateringen (): void {//Standard objekt fysikk oppdatering super.update (); } /** * Bare spiller død animasjon * /public funksjon død (): void {} /** * Denne tilbake verdier av Frog eksempel. * /Public funksjon restart (): void {} /** * Dette håndterer flytte frosken i samme retning som noen eksempel den hviler på. * *param Hastighet hastigheten i piksler frosken bør flytte *param vendt retning frosken vil flyte i * /public funksjon float (hastighet: int, overfor: uint): void {}}}
Jeg er ikke kommer til å gå gjennom all koden siden det er kommentert, men her er noen viktige punkter å sjekke ut. Først vi setup alle verdiene for frosk bevegelse i konstruktør sammen med sine animasjoner. Neste skaper vi en setter til å håndtere skiftende frosken orientering når vi endrer retning. Til slutt har vi noen hjelpemetoder for å håndtere oppdateringen loop, død, restart, og flytende.
Nå kan vi legge vår spiller til spillet nivå. Åpne opp PlayState klassen og sette inn følgende kode i mellom stokkene og biler vi oppsett i del en.
//Lag Playerplayer = legge til (ny Frog (calculateColumn (6), calculateRow (14) + 6)) som Frog;
Du må også importere Fog klassen og legge til følgende eiendom:
private Var spiller: Frog;
Det er viktig å plassere spilleren i riktig dybde nivået i spillet. Han trenger å være over loggene og skilpadder ennå under bilene så når han blir påkjørt så han ikke dukker opp på toppen av en bil. Vi kan nå teste at vår spiller er på nivå med rekompileres spillet. Her er hva du bør se.
Det er ikke mye vi kan gjøre med spilleren før vi legge til noen tastaturkontrollene, så la oss gå videre til neste trinn
Trinn 2 : Tastaturkontroller
I Frogger spilleren kan gå til venstre, høyre, opp og ned. Hver gang spilleren beveger seg, hopper frosken til neste posisjon. I normale flis baserte spill dette er enkelt å sette opp. Vi bare finne ut neste brikke for å flytte til og legge til x eller y-verdien til den når den nye destinasjonen. Frogger legger imidlertid noen kompleksitet til bevegelse når det kommer til logger og skilpadder du kan flyte på. Siden disse objektene ikke beveger seg i henhold til rutenettet vi må betale ekstra oppmerksomhet til hvordan snøbrettkjørere på vårt nivå arbeid.
La oss komme i gang med grunnleggende kontroller. Åpne opp Frog klassen og legg til følgende blokk med kode til vår oppdatering () metoden før super.update ():
if (state.gameState == GameStates.PLAYING) {//Test for å se om TargetX og Y er lik. I så fall er Frog fri til å bevege seg. if (x == targetX & & y == targetY) {//Sjekker å se hva nøkkel ble bare trykket og setter målet X eller Y til den nye posisjonen //sammen med hvilken retning til ansikt if ((FlxG. keys.justPressed ("venstre")) & & x > 0) {targetX = x - maxMoveX; vendt = VENSTRE; } Else if ((FlxG.keys.justPressed ("HØYRE")) & & x < FlxG.width - frameWidth) {targetX = x + maxMoveX; vendt = HØYRE; } Else if ((FlxG.keys.justPressed ("UP")) & & y > frameHeight) {targetY = y - maxMoveY; vendt = UP; } Else if ((FlxG.keys.justPressed ("DOWN")) & & y < 560) {targetY = y + maxMoveY; vendt = NED; } //Se om vi er i bevegelse if (x! = TargetX || y! = TargetY) {//Ser ut som vi beveger oss så spille av lyd, flagg isMoving og legge ved å score. FlxG.play (GameAssets.FroggerHopSound); //Når dette flagget er satt, vil frosken ikke ta keyboard input til den har reacged sitt mål isMoving = true; } Else {//Nope, vi er ikke i bevegelse så flagget isMoving og vise Idle. isMoving = false; }} //Hvis isMoving er sant vi kommer til å oppdatere den faktiske posisjon. if (isMoving == true) {if (vendt == VENSTRE) {x - = Movex; } Else if (vendt == HØYRE) {x + = Movex; } Else if (vendt == UP) {y - = moveY; } Else if (vendt == NED) {y + = moveY; } //Spill gang animasjon spill ("walk" + vendt); } Else {//ingenting skjer så gå tilbake til hvilemodus animasjon spill ("tomgang" + vendt); }}
Det er mye kode her så la oss gå gjennom det blokkere ved blokken starter med vår første betinget. Vi trenger en måte å vite om spillet staten er satt til å spille. Hvis du ser på slutten av Frog klassens konstruktør vil du se at vi sparer en referanse til gjeldende spille tilstand i en lokal variabel. Dette er et godt triks vi kan bruke til å hjelpe våre spill objekter lese spillet staten fra den aktive FlxState. Siden vi vet at frosken er alltid kommer til å bli brukt i PlayState det er trygt å anta at den riktige tilstanden i spillet er satt til PlayState. Jeg ønsker nå at vi har denne FlxState vi kan sjekke spillets faktiske tilstanden før du gjør noe i FrogClass
. Bare for å ta et sekund å klare opp noen terminologi. Ordet state Så tilbake til vår frosk. Hvis spillet staten er satt til å "spille", så det er trygt å oppdage eventuelle bevegelser forespørsel om frosken og også oppdatere sin animasjon. Du vil se senere om hvordan vi håndterer dødsanimasjoner og frysing spilleren basert på kollisjoner. Vår første blokk med kode avgjør om Frog har nådd en targetX og targetY posisjon. Den andre kodeblokk faktisk håndterer økende frosken x og y-verdiene. Nå kan vi snakke om hvordan du faktisk flytte frosken. Dette er neste betinget innen ut targetX /Y blokk. Når et tastetrykk har blitt oppdaget, og de nye targetX /Y-verdiene er satt kan vi umiddelbart bekrefte at vi er i bevegelse. Hvis så vi trenger å spille frosken hop sound og satt frosken isMoving flagget til sann. Hvis disse verdiene har ikke endringene vi ikke beveger seg. Etter dette er satt kan vi håndtere bevegelse logikk i det siste betinget. Til slutt tester vi om isMoving er sant og se hvilken retning vi må flytte basert på hvilken vei frosken står overfor. Frosken kan bare bevege seg i én retning om gangen, så dette gjør det svært enkelt å sette opp. Vi kaller også avspilling () metode for å animere frosken. Det siste du bør vite er hvordan vi beregner Movex og moveY vales. Hvis du ser i konstruktør vil du se at vi fastslå at frosken vil flytte X antall piksler enn Y antall bilder. I dette tilfellet ønsker vi vår animasjon til siste 8 rammer så for å flytte de 40 piksler vi trenger hver gang, vil vi flytte ved 5px hver ramme for 8 rammer. Dette er hvordan vi får det glatte hop animasjon og holde spilleren fra kontinuerlig å trykke på tastene og avbryte animasjonen Flixel håndterer alle kollisjonen logikk vi trenger for oss. Dette er et enormt tidsbesparende og alt du trenger å gjøre er å be FlxU klassen for å oppdage eventuelle overlapp sprites. Hva er bra med denne metoden er at du kan teste FlxSprites eller FlxSpriteGroups. Hvis du husker vi satt opp våre biler i sin egen carGroup som vil gjøre det utrolig enkelt å teste om de har kollidert med frosken. For å få dette i gang trenger vi å åpne opp PlayState og legge til følgende kode: Twitter /** * Dette er hovedspillet loop. Det går gjennom, analyserer spillet staten og utfører dueller. * /overstyre offentlig funksjon oppdateringen (): void {if (gameState == GameStates.GAME_OVER) {} else if (gameState == GameStates.LEVEL_OVER) {} else if (gameState == GameStates.PLAYING) {//gjøre kollisjon påvisninger FlxU.overlap (carGroup, spiller, carCollision); } Else if (gameState == GameStates.DEATH_OVER) {} //Oppdater hele spillet super.update ();} Dette inkluderer litt mer av kjernen spillet staten logikk som vi vil fylle ut i de neste trinnene men la oss ta en titt på koden under "Gjør kollisjon påvisninger" kommentar. Som du ser har vi en ny klasse kalt FlxU som bidrar til å administrere dueller i spillet som jeg hadde nevnt ovenfor. Denne klassen aksepterer targetA, targetB og en tilbakeringing metode. Overlapp () metoden vil teste alle barn targetA mot barn targetB deretter passere resultatene til din levert tilbakeringing metoden. Nå må vi legge til carCollision tilbakeringing til klassen vår: Twitter /** * Dette håndterer kollisjon med en bil. *param Target dette tilfellet som har kollidert med spilleren *param spiller en referanse til spilleren * /private funksjon carCollision (mål: FlxSprite, spiller: Frog): void {if (gameState = GameStates.COLLISION!) {FlxG. spille (GameAssets.FroggerSquashSound); killPlayer (); }} Vi tar noen friheter med denne tilbakeringing siden vi vet at den første param vil være en FlxSprite og at den andre er en frosk. Normalt er dette en anonym og utypet metode når det kalles når en kollisjon er oppdaget. En ting du vil legge merke til er at vi teste at gameStates er satt til kollisjon. Vi gjør dette fordi når en kollisjon skjer hele spillet fryser for å tillate en død animasjon å spille, men teknisk sett frosken er fortsatt kolliderer med carGroup. Hvis vi ikke legger i dette betinget vi ville bli sittende fast i en uendelig løkke mens animasjonen prøvde å spille. Nå trenger vi bare å legge den logikken for å drepe spilleren. Dette vil gå i en killPlayer () metoden, og her er koden: Twitter /** * Dette dreper spilleren. Spillet staten er satt til kollisjonen så alt kjenner til pause og et liv er fjernet. * /private funksjon killPlayer (): void {gameState = GameStates.COLLISION; player.death ();} Til slutt må vi fylle på død () logikk i vår Frog klasse. Legg til følgende kode i døden metode: Her vi forteller frosken sprite å spille terningen animasjonen vi setup i konstruktøren. Nå kompilere spillet og test at spilleren kan kollidere med noen av biler eller lastebil Nå som vi har vår første settet med kollisjon deteksjon på plass sammen med døden animasjon, trenger vi en måte å starte spillet nivå slik at spilleren kan fortsette å prøve igjen. For å gjøre dette må vi legge en måte å varsle spillet når døden animasjonen er over. La oss legge til følgende til vår Frog oppdateringen () -metoden like ovenfor der vi teste om gameState er lik spilletid: Legg merke til den etterfølgende annet, som bør kjøre inn if (state.gameState == GameStates.PLAYING) slik at vi tester for kollisjon deretter spille staten. Nå må vi gå tilbake til vår PlayState klassen og legge til følgende metode kall til else if ( gameState == GameStates.DEATH_OVER): Nå kan vi legge til en restart metode: Twitter /** * Dette håndterer tilbakestille spillet verdier når en frosk dør, eller et nivå er fullført. * /private funksjon restart (): void {//Change spillet staten til å spille slik animasjon kan fortsette. gameState = GameStates.PLAYING; player.restart ();} Det siste vi trenger å gjøre er å legge til denne koden til Frog Class restart metode Nå bør vi være klar til å kompilere og teste at alt dette fungerer. Her er hva du bør se, når en bil treffer spilleren alt fryser mens død animasjon spiller. Når animasjonen er over alt skal starte og spilleren vil dukke opp nederst på skjermen igjen. Når du har det satt opp er vi klare til å jobbe ut vannet dueller Med et solid system på plass for å håndtere kollisjon, død animasjon og starte det skal være veldig lett å legge i de neste trinnene av dueller. Vannet påvisning er litt annerledes likevel. Siden vi vet alltid hvor vannet er, kan vi teste mot spillerens y posisjon. Hvis spillerens y-verdien er større enn der landet slutter, kan vi anta at spilleren har kollidert med vannet. Vi gjør dette for å bidra til å kutte ned på mengden av dueller vi trenger å gjøre hvis vi testet hver åpen plass med vann når frosken lander. La oss legge til følgende til vår PlayState etter hvor vi tester for en bil kollisjon: Du må også legge til to eiendommer, den første lar oss få vite hvor vannet begynner på Y-aksen og den andre er en boolsk å gi oss beskjed om spilleren er flytende. Vi skal bruke denne flytende boolsk i neste trinn Bestemme start koordinere av vannet er lett vurderer alt er en del av rutenett. Neste må vi legge våre waterCollision () -metoden: Twitter /** * Dette kalles når spilleren dør i vann. * /private funksjon waterCollision (): void {if (gameState = GameStates.COLLISION!) {FlxG.play (GameAssets.FroggerPlunkSound); killPlayer (); }} Utarbeide og test at hvis vi går i vannet spilleren dør. Neste vi vil se nærmere på hvordan du kan tillate frosken å flyte på loggene og skilpadder når de er i vannet området nivået For å finne ut om Frog kan flyte vi trenger å teste for en kollisjon på logGroup eller turtleGroup. La oss legge til følgende kode i vår PlayState klassen rett under der vi teste for bilen kollisjon. Sørg for at det er over vannet kollisjon betinget. Dette er viktig fordi hvis vi teste for spilleren i vannet før de logger eller skilpadder vi aldri kunne håndtere den flytende korrekt Her er de to metodene vi trenger for å håndtere en kollisjon: Twitter /** * Dette håndterer flytende spilleren sprite med målet den er på. *param Target dette er forekomsten som kolliderte med spilleren *param spiller en forekomst av spiller * /private funksjon float (mål: WrappingSprite, spiller: Frog): void {playerIsFloating = true; hvis {player.float (target.speed, target.facing) ((FlxG.keys.LEFT || FlxG.keys.RIGHT)!); }} /** * Dette kalles når en spiller er på en logg for å indikere frosken må flyte *param target dette er forekomsten som kolliderte med spilleren *param spiller en forekomst av spiller * /private funksjon turtleFloat (mål: TimerSprite, spiller: Frog): void {//Test for å se om målet er aktiv. Hvis den er aktiv spilleren kan flyte. Hvis ikke spilleren //er i vannet hvis (target.isActive) {float (mål, spiller); } Else if (player.isMoving!) {WaterCollision (); }} Du må også importere WrappingSprite og TimerSprite. Når du har det på plass må vi gå tilbake til vår Frog klasse og legg følgende til vår float () metode: Vi har akkurat lagt mye kode og jeg kommenterte det meste av det, men jeg ønsket å snakke om denne siste delen her. Denne koden faktisk håndterer flytte frosken i samme retning med samme hastighet som loggen eller turtle spilleren er på. Vi bruker noen triks for å være sikker på at når spilleren forsøker å bevege seg flytende objekt de ikke overstyres av hva de flyter på. En stor del av spillutvikling er statlig styring og bruk av flagg som isMoving å hjelpe la andre deler av koden vet hva som kan og ikke kan gjøres er en stor hjelp. La oss samle spillet og sjekke ut hvis spilleren er i stand til å flyte på loggene. En ting du kanskje har lagt merke til er at når du lander på en stokk eller skilpadde vil du ikke lenger drukne. Det er fordi vi trenger å nullstille playerIsFloating flagget før vi gjør alle våre dueller. Gå tilbake til PlayState og legge til følgende like før vi begynne å teste for bilen kollisjon Så testblokken skal se slik ut:. Som jeg allerede har nevnt, det er en hårfin balanse mellom å opprettholde staten og sørge for at du satt og usatt disse statlige flagg til rett tid for å spare deg for masse frustrasjon når du bygger dine egne spill. Nå kan du gjøre en ny kompilering å kontrollere at alt fungerer som det skal, og vi kan gå til neste skritt Legge i dueller for hjemmebaser bør være veldig rett frem. Legg til følgende kollisjon test til slutten av dueller kode på PlayState klasse og oppover der vi teste om spilleren har hoppet i vannet: Nå er vi trenger for å lage vår baseCollision () metode for å håndtere hva som skjer når du lander på et hjem: Twitter /** * Dette håndterer kollisjon med en base. *param Target dette tilfellet som har kollidert med spilleren *param spiller en referanse til spilleren * /private funksjon baseCollision (mål: Home, spiller: Frog): void {//Sjekk for å være sikker på at vi ikke har kommet i en okkupert utgangspunkt hvis {//Økning antall frosker lagrede safeFrogs ++ (target.mode = Home.SUCCESS!); //Flag målet som suksess å vise det er okkupert nå target.success (); } //Test for å se om vi har alle frosker, hvis så da nivået er fullført. Hvis ikke starter. if (safeFrogs == bases.length) {levelComplete (); } Else {restart (); }} Vi må også legge til følgende egenskapen til klassen vår: Her kan du se vi tester for å se om hjemmelaget er allerede kommet inn, neste vi teste om alle boliger har frosker i dem og til slutt vi bare utløse restart på en vellykket landing på hjemmebasen. Det er viktig å merke seg at i denne opplæringen skal vi ikke teste for tilstanden i hjemmet. Husk det er en bonus flue og en alligator du kan lande på. . Senere hvis du ønsker å legge til at i kan du gjøre det her Nå må vi legge noen logikk for når et nivå er fullført: Twitter /** * Dette kalles når et nivå er fullført * /private funksjon levelComplete (): void {//Change spillet staten for å la systemet vite nivå er gjennomført gameState = GameStates.LEVEL_OVER; //Skjul spilleren siden nivået er over og vente på at spillet skal starte på player.visible = false;} Vi må legge til følgende kode i omstarten () metoden ovenfor der vi nullstille spillet staten: Til slutt må vi legge en resetBases () metoden til vår PlayState klasse: Twitter /** * Denne looper gjennom baser og sørger for at de er satt til tom. * /private funksjons resetBases (): void {//Loop skjønt baser og tømme dem for hver (Var basen: Hjemme i baser) {base.empty (); } //Tilbake trygge frosker safeFrogs = 0;} Når alle baser har blitt landet på vi sløyfe gjennom dem og ringe tom () metode som vil nullstille grafisk og førstehåndsverdi. Til slutt må vi sette froskene som er lagret til null. La oss samle spillet og teste hva som skjer når du lander i alle baser. Når du lander i en base det bør endres til en frosk ikon som indikerer at du har landet der allerede. Som du ser, når vi har lagret alle frosker nivået fryser fordi det er ingen logikk å starte nivå igjen. Vi må også legge til noen spill meldinger for å la spilleren vet hva som skjer og skal brukes som et varslingssystem i kampen så vi klarer da å starte alle animasjonene igjen. Dette er hva vi vil legge i neste trinn Mye skjer i spillet, og en av de beste måtene å kommunisere til spilleren hva som skjer er ved å legge i spillet meldinger. Dette vil bidra til å informere spilleren når spillet pauser for å aktivere et spill stat som et nivå komplett eller et dødsfall. I vår PlayState klasse, legge til følgende kode ovenfor der vi skaper våre hjemmebaser i lag () metode: Du må også legge til følgende egenskaper: Du må også importere FlxText klassen. Nå la oss gå inn i vår oppdatering () -metoden og legge til følgende kode i gameState == GameStates.LEVEL_OVER betinget: Den grunnleggende ideen her er at vi bruker en timer for å telle ned hvor lenge et spill meldingen skal vises. Når nedtellingen når null vi kan starte nivået. Dette gir spilleren litt tid til å hvile mellom nivåene. Også vi må legge neste blokk med kode rett under der vi teste vannet kollisjonen rundt linje 203: Her er vi i stand til å håndtere synligheten av spillet meldingen. I vår baseCollision () metoden må vi legge til følgende kode nedenfor der vi tester for target.mode = Home.success betinget rundt linje 317:! Legg følgende egenskaper som vi faktisk skal bruke i neste trinn: Deretter legger denne linjen med kode rundt linje 328 inne i betinget rett under der vi kaller suksess () på målet: Dette gir oss muligheten til å beregne den totale tiden det har tatt å fullføre en etikett som vi vil koble i neste trinn. Nå i resetBases () legge til følgende kode på slutten like under der vi satt safeFrogs til 0: Compile spillet, og du skal nå se spillet statusmeldinger når du lander i et hjem eller starte nivået Nå er vi klare å legge logikken for spillet timer. I PlayState klassens skape () -metoden legge til følgende kode i henhold til hvor vi skape bg bilde: Du trenger følgende eiendom og konstant: Og under den siste bilen lagt til carGroup legge til følgende: Du må også følgende egenskaper: Nå la oss legge til følgende kode i vår oppdateringsfunksjonen ovenfor der vi klarer å skjule gameMessage on line 234: Og dette er den metoden som blir kalt når tiden er ute: Twitter /** * Dette kalles når tiden renner ut. * /private funksjon timeUp (): void {if (gameState = GameStates.COLLISION!) {FlxG.play (GameAssets.FroggerSquashSound); killPlayer (); }} Til slutt må vi nullstille tidtakeren når tiden går opp, de spiller lander på en base eller nivået på nytt. Vi kan gjøre denne metoden i vår omstart () like før vi kaller player.restart (): Du kan kompilere spillet nå å validere alt dette fungerer. Vi har nettopp lagt mye kode, men forhåpentligvis koden og kommentarer er rett frem nok til at vi ikke trenger å forklare det for mye Hva spillet ville være komplett uten liv? I Frogger får du 3 liv. La oss legge til følgende funksjon samtale i vår skaper () metoden under der vi setter opp timeAlmostOverWarning = TIMER_BAR_WIDTH * 0,7 on line 69: Og her er de metoder som vil administrere liv for oss : Twitter /** * Denne sløyfen skaper X antall liv. *param Verdi antall liv for å skape * /private funksjons createLives (verdi: int): void {var i: int; for (i = 0; i < verdi; i ++) {addLife (); }} /** * Dette legger et liv sprite til skjermen og skyver den til teh lifeSprites array. *param Verdi * /private funksjon addLife (): void {var flxLife: FlxSprite = new FlxSprite (LIFE_X * totalLives, LIFE_Y, GameAssets.LivesSprite); legge (flxLife); Takk for lesing :)
har flere konnotasjoner i vår FlxFrogger spillet. Det er FlxStates med representerer gjeldende skjermen eller visning av spillet, og så er det spillet staten. Spillet staten representerer den faktiske aktiviteten spillet er i. Hver av spill stater kan bli funnet i GameState klassen innsiden av com.flashartofwar.frogger.enum pakken. Jeg vil gjøre mitt beste for å holde de to anvendelser av staten så klart som mulig.
Trinn 3:. Car Kollisjon Detection
spille ("die");
Trinn 4:. Restar etter dødsfall
//Test for å se om frosken er død og i siste døds frameif (state.gameState == GameStates .COLLISION & & (ramme == 11)) {//Flag spillet staten at døden animasjonen er over og spillet kan utføre en omstart state.gameState = GameStates.DEATH_OVER;} else
restart ();
isMoving = false;. x = startPosition.x; y = startPosition.y; targetX = startposisjonen. x; targetY = startPosition.y; vendt = UP, spille ("tomgang" + vendt); if (synlig!) synlig = true;
Trinn 5:. Vann Collision Detection
//Hvis ingenting har kollidert med spilleren, for å teste om de er utenfor banen når du er i vannet zoneif (player.y < vassen ) {if (player.isMoving &! &! playerIsFloating) waterCollision (); if ((player.x > FlxG.width) || (player.x < -TILE_SIZE)) {waterCollision (); }}
privat Var vassen. Int = TILE_SIZE * 8; privat Var playerIsFloating: Boolean;
Trinn 6:. Flytende Collision Detection
FlxU.overlap (logGroup, spiller, float),. FlxU.overlap (turtleGroup, spiller, turtleFloat);
if (! IsMoving = true) {x + = (vendt == HØYRE)? hastighet: speed; targetX = x; isMoving = true;}
//Tilbake flytende flagg for player.playerIsFloating = false;
Trinn 7:. Hjem Collision Detection
FlxU.overlap (homeBaseGroup, spiller, baseCollision);
private Var safeFrogs: int = 0;
//Test for å se om nivå er over, hvis så null hele bases.if (gameState == GameStates.LEVEL_OVER) resetBases ();
Trinn 8:. Legge Spill Meldinger
//Lag spill melding, håndterer dette spillet over, tid, og begynne melding for playergameMessageGroup = new FlxGroup (); gameMessageGroup.x = (480 * 0,5) - (150 * 0,5); gameMessageGroup.y = calculateRow (8) + 5; legge til (gameMessageGroup); //svart bakgrunn for messagevar messageBG: FlxSprite = new FlxSprite (0, 0 ); messageBG.createGraphic (150, 30, 0xff000000); gameMessageGroup.add (messageBG);. //Message textmessageText = new FlxText (0, 4, 150, "TIME 99") setFormat (null, 18, 0xffff00000, "center "); gameMessageGroup.visible = false; gameMessageGroup.add (messageText);
private Var messageText: FlxText; private Var gameMessageGroup: FlxGroup; private Var hideGameMessageDelay: int = -1;
if (hideGameMessageDelay == 0) {omstart ();} else {hideGameMessageDelay - = FlxG.elapsed;}
//Administrere gjemmer gameMessage basert på timerif (hideGameMessageDelay > 0) {hideGameMessageDelay - = FlxG.elapsed; if (hideGameMessageDelay < 0) hideGameMessageDelay = 0;} else if (hideGameMessageDelay == 0) {hideGameMessageDelay = 1; gameMessageGroup.visible = false;}
//Uansett om basen var tom eller opptatt vi fortsatt vise den tiden det tok å få theremessageText.text = "TIME" + String (Gametime /FlxG.framerate - timeLeftOver); gameMessageGroup.visible = true; hideGameMessageDelay = 200;
private Var Gametime: int = 0; privat Var timer: int = 0;
Var timeLeftOver : int = Math.round (timer /FlxG.framerate);
//Sett melding å fortelle spilleren de kan restartmessageText.text = "START"; gameMessageGroup.visible = true; hideGameMessageDelay = 200 .;
Trinn 9: Spill Timer
//Sett opp hovedvariabel propertiesgameTime = 60 * FlxG.framerate; timer = Gametime;
private Var timeAlmostOverWarning: int; privat konst TIMER_BAR_WIDTH: int = 300;
//Opprett Tid texttimeTxt = new FlxText (bg. bredde - 70, LIFE_Y + 18, 60, "TIME") setFormat (null, 14, 0xffff00, "rett."); legge til (timeTxt); //Opprett timer graphictimerBarBackground = new FlxSprite (timeTxt.x - TIMER_BAR_WIDTH + 5, LIFE_Y + 20), timerBarBackground.createGraphic (TIMER_BAR_WIDTH, 16, 0xff21de00), tilsett (timerBarBackground); timerBar = new FlxSprite (timerBarBackground.x, timerBarBackground.y); timerBar.createGraphic (1, 16, 0xFF000000); timerBar.scrollFactor. x = timerBar.scrollFactor.y = 0; timerBar.origin.x = timerBar.origin.y = 0; timerBar.scale.x = 0; legge til (timerBar);
privat konst LIFE_X: int = 20; privat konst LIFE_Y: int = 600; privat konst TIMER_BAR_WIDTH: int = 300; privat Var timerBarBackground: FlxSprite; private Var timeTxt: FlxText; private Var timerBar: FlxSprite; private Var timeAlmostOverFlag: Boolean = false;
//Dette sjekker for å se om tiden har løpt ut. Hvis ikke vi redusere tiden basert på hva som har gått //sinus siste oppdatering. if (timer == 0 & & gameState == GameStates.PLAYING) {timeUp ();} else {timer - = FlxG.elapsed; timerBar.scale.x = TIMER_BAR_WIDTH - Math.round ((timer /Gametime * TIMER_BAR_WIDTH)); if (timerBar.scale.x == timeAlmostOverWarning & & timeAlmostOverFlag!) {FlxG.play (GameAssets.FroggerTimeSound); timeAlmostOverFlag = true; }}
timer = Gametime; timeAlmostOverFlag = false;
Trinn 10:. Lives
createLives (3);