The Power of Finite State Machines: Søknad og Extension

The Power of Finite State Machines: Søknad og Extension
Del
Del
Del
Del

Dette Cyber ​​mandag Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av.

Her er den avsluttende delen av vår veiledning om å opprette en multi-state bil med endelig tilstandsmaskin
. I denne delen, vil du se hvor enkelt det er å legge til flere stater samt nye funksjoner til bilen. Når du er ferdig, vil du vite nøyaktig hvordan å strukturere kontrollen for FSM Object, som vil bli demonstrert når vi legger til animasjon og lyd.



Endelig resultat Forhåndsvisning

Sjekk ut den endelige resultat vi skal jobbe mot:



Trinn 1: Fortsetter der vi slapp - Tilleggs States

Her er staten Transition Table (STT) vi trakk i den første delen av tutorial:

Når du trenger å legge til flere stater, alltid starte med STT. Her er de nye statene vi skal jobbe mot, med plass til å legge til de nye tiltakene som kreves.

Prøv å sette i de riktige handlingene for de nylig lagt statene

Jeg antar at det har vært en stund siden du leser den første delen av denne opplæringen, så ta deg tid. Når du er ferdig, sammenligne STT med bildet vist nedenfor



Trinn 2:. Retusjering den iState Interface

Den neste tingen du trenger å gjøre er å legge de to nye statlige tiltak til iState grensesnitt.

Åpne IState.as i FD og inkluderer koden under. Jeg vil legge det rett etter driveForward () -metoden
funksjon driveBackward (). Void; funksjon driveReallyFast (). Void;

Nå kjører programmet, og se hva som skjer videre

Enhver endring til iState inteface må gjenspeiles i alle klassene som implementerer den. Dette er den store fordelen med å bruke et grensesnitt; Jeg liker hvordan det minner deg på å legge dem for hver eksisterende stat klasse.

Legg til følgende kode i alle de eksisterende statlige klasser. Sett det rett under driveForward () -metoden. La oss ha dem ringe print (dette + "gjelder handling her") for å minne oss om at vi trenger å komme tilbake til dem etter å skape de andre to stats klasser
offentlig funksjon driveBackward (). Void {_car.print (dette + "gjelder handling her");} offentlig funksjon driveReallyFast (). void {_car.print (dette + "gjelder handling her");}

du bør ikke bli mere feil når du kjører programmet på nytt



Trinn 3:. Opprette de to statlige Classes

åpne bilen klassen, navigere til initializeStates () -metoden og legge koden under
_engineDriveBackwardState = new EngineDriveBackward (denne); _ engineDriveReallyFastState = ny EngineDriveReallyFast (denne);

Verken variablene eller de klassene finnes, men vi skal fikse det. Først får inne i ordet "EngineDriveBackward", og trykk "CTRL + SHIFT + 1"; Marker "Opprett ny klasse" trykk "Enter".

Sørg for å matche all info ovenfor før du klikker på "OK". Du bør ha noe som ligner på koden under. Ikke glem å legge til _car variabel før konstruktøren og legger til at "$" symbolet for parameteren. Så gjør oppdraget inne i konstruktøren
pakken com.activeTuts.fsm {public class EngineDriveBackward implementerer iState {private Var _car. Car; offentlig funksjon EngineDriveBackward ($ bil: bil) {_car = $ bil; } /* INTERFACE com.activeTuts.fsm.IState * /public funksjon turnKeyOff (): void {} offentlig funksjon turnKeyOn (): void {} offentlig funksjon driveForward (): void {} offentlig funksjon driveBackward (): void {} public funksjon driveReallyFast (): void {} offentlig funksjon fylle bensin (): void {} offentlig funksjon oppdatering ($ kryss: Number): void {} offentlig funksjon toString (): String {}}}

OK. Nå gå tilbake til bilen klassen der vi slapp og sette markøren inne i _engineDriveBackwardState variabel og trykk "CTRL + SHIFT + 1"; velg "Erklærer privat variabel" og trykk "Enter". Dette vil legge det som den siste variabel før konstruktøren. Endre type til "iState". Jeg vil flytte den til der de andre statlige variablene er, men det er valgfritt.

Følg samme fremgangsmåte for å lage EngineDriveReallyFast klasse.

Du får en feilmelding hvis du kjører programmet om toString () metode for de to nye klasser ikke returnere en verdi.

bilen må også gi ekstern tilgang til å kontrollere for de to nye handlinger. . Legg inn koden under etter driveForward () -metoden
offentlig funksjon driveBackward (e: Handling = null): void {_currentState.driveBackward ();} offentlig funksjon driveReallyFast (e: Handling = null): void {_currentState.driveReallyFast ();}

til slutt, legger eksplisitte getters i den nedre delen av bilen klassen rett over changeState () -metoden
offentlig funksjon getEngineDriveBackwardState (). iState {return _engineDriveBackwardState; } Offentlig funksjon getEngineDriveReallyFastState (): iState {return _engineDriveReallyFastState; }



Trinn 4: EngineDriveBackward State

Se tilbake til STT og begynne å legge inn koden fra toppen av iState metoden implementeringer. Du vil kjøre inn i en ulempe et sted, men prøver å gjøre det likevel. Du kan også bruke dine egne ord for print () -metoden. Når du er ferdig, sammenligne koden med klassen oversikt nedenfor
pakke com.activeTuts.fsm {public class EngineDriveBackward implementerer iState {private Var _car. Car; offentlig funksjon EngineDriveBackward ($ bil: bil) {_car = $ bil; } /* INTERFACE com.activeTuts.fsm.IState * /public funksjon turnKeyOff (): void {_car.print ( "klikk ... rulle til en stopp i revers ... motoren er slått av."); _car.changeState (_car.getEngineOffState ()); } Offentlig funksjon turnKeyOn (): void {_car.print ( "! Du kjører i revers, trenger ikke å skru tenningen"); } Offentlig funksjon driveForward (): void {_car.print ( "klikk, bytte fra revers for å drive ..."); _car.changeState (_car.getEngineDriveForwardState ()); } Offentlig funksjon driveBackward (): void {_car.print ( "... allerede kjører i revers."); } Offentlig funksjon driveReallyFast (): void {_car.print ( "klikk, giring fra revers til turbo !!!"); _car.changeState (_car.getEngineDriveReallyFastState ()); } Offentlig funksjon fylle bensin (): void {if (_car.hasFullTank () == false) {_car.print ( "stoppe bilen fra å kjøre i revers, girskifte å parkere, vri nøkkelen til av-stillingen, komme seg ut av bilen, og legge til "+ nummer (_car.refillWithFuel ()) toFixed (2) +.» gallon (r) av drivstoff. "); _car.changeState (_car.getEngineOffState ()); }} Offentlig funksjon oppdatering ($ kryss: Number): void {_car.engineTimer + = $ tick; if (_car.engineTimer > = Car.ONE_SIXTH_SECONDS) {_car.engineTimer - = Car.ONE_SIXTH_SECONDS; _car.consumeFuel (Car.REVERSE_FUEL_CONSUMPTION); ///25 sekunder gassforsyning}} offentlig funksjon toString (): String {return kjøring bakover '; }}}

Oppdateringen () metoden krever en ekstra eiendom for Car. Plasser markøren i REVERSE_FUEL_CONSUMPTION, trykker du "CTRL + SHIFT + 1", velg "Erklærer konstant", og trykk "Enter". Dette legger konstant på toppen av bilen klasse med standardtypen String. Endre type til nummer og tilordne den en verdi på 0,0066. Dette gir 25 sekunder med kjøring i revers med en full tank med en gallon. Du kan flytte den til å være med de andre drivstofforbruk konstanter.

Mens du er der, kan du like godt legge TURBO_FUEL_CONSUMPTION konstant med verdien av 0,016 (10 sekunder på turbo for en gallon). Vi vil bruke det senere for EngineDriveReallyFast staten klasse.

Det er så enkelt. Gå videre og gjøre ferdig EngineDriveReallyFast klassen. Hvis du får problemer, gå tilbake og sjekke med din STT. Eller du kan bare åpne den ferdige klassen inne i "StatePatternPartial2" -mappen følger med kilden nedlasting og se hva du gikk glipp



Trinn 5:. Mer Testing

Legg til nye statlige tiltak (_car.driveBackward () og _car.driveReallyFast () i test delene i "Main" class deretter kjøre programmet.

Sjekk din skrive ut mot test handlinger hvis de passer.

Legg merke til hvor det står "off gjelder handling her?" det forteller oss at vi glemte å komme tilbake og legge atferd for de nylig lagt Bil funksjonene til de andre stats klasser. tilbake til hver av dem og bruke atferd basert på STT.

programmet skal kjøre perfekt nå. Hvis du vil, kan du fortsatt matche arbeidet med klassene følger med kilden nedlasting. Som nevnt tidligere, de er inne i "StatePatternPartial2" -mappen.
< hr>
Trinn 6: Legge media Eiendeler

med kilden nedlastingen er en mappe som heter "media", drar det inn i "bin" mappen på CarFSM prosjektet den inneholder alle lydeffekter og grafikk. .

Neste, også med kilde nedlastingen, finner du en mappe som heter "code", kommer inn som og inn i "StatePatternComplete" -mappen. Ikke rør noe annet enn "Media.as" -klassen. Dra den inn i "com.activeTuts.fsm" -mappen sammen med resten av klassene du har gjort.

Det er viktig at du vet hvordan denne klassen fungerer slik at du kan legge til det senere bør du velge å prøve lekser for å legge til en annen bil funksjonalitet for å returnere tilbake til park. Så gå over den minst én gang; Jeg vil også forklare sitt ansvar:

Det tar vare på stort sett alt media-messig, fra innebygging medie eiendeler for å tillate kontroll over dem. Det første den gjør er legge inn alle grafiske og lydfiler inne i "media" -mappen. Animasjon, visuell effekt, og lyden er alle styrt av de ulike statlige klasser gjennom bilen eksempel som i sin tur sender forespørsel til media eksempel. Når startes, gjør denne klassen fem ting - Det legger seg som et barn av bilen, det skaper bilens visuelle eiendeler, lyder, knapper, og deretter visuelt resultat

Lyd manipulasjon er vanligvis håndteres med to funksjoner;. for eksempel når bilen er i gang, hvis du velger "drive" -knappen, kaller bilen playParkToDrive () som spiller lyden av bilen økende makt, så playPeakDrive () når lyden er ferdig for konstant hastighet kjøring lyd.



Trinn 7: Utvide Bil ansvar - variabler

Starter på toppen av Car klassen, legge til følgende kode etter _currentState variabeldeklarasjon. Disse egenskapene kom opp som funksjoner ble lagt til bilen. For eksempel, jeg ønsket å bringe tilbake utstyret til å parkere etter ett sekund når bilen er enten av eller tom for drivstoff, så det er det. Et annet eksempel vil være å rydde opp det visuelle produksjonen displayet etter 10 sekunder på utskrift av en uttalelse
public static konst ONE_SECOND. Int = 1; //Brukt for å flytte utstyret for å parkere når av /tom for drivstoff etter en andre private static konst TEN_SECONDS: int = 10; //Utløser rydde opp for visuell outputprivate Var _cleanUpTimer: Antall = 0; //Visuelt resultat rydde opp timerprivate Var _angle: Antall = 0; //For karosseriet animasjon når motoren er på og parkedprivate Var _reallyFastRollSpeed: Number = 63; //Roll hastighet når du er på turboprivate Var _driveRollSpeed: Number = 35; //Roll hastighet når du er på driveprivate Var _reverseRollSpeed: Number = -15; //Roll hastighet når du er på reverseprivate Var _currentRollSpeed: Antall = 0; //endringer basert på målet roll hastighet se siste tre eiendommer ovenfor, som brukes for rattutslag animationprivate Var _carBlurEffect: Sprite; //Turbofart uskarphet effectprivate Var _media: Media; //Henvisning til Media klasse for visuell /utgang /lyd manipulasjon

Husk å legge _media = new Media (denne); inne i init () -metoden rett etter initializeStates () -metoden call of



Trinn 8:. Utvide Bil ansvar - Bil funksjoner

Nå får inne i oppdateringen () -metoden og endring . det å matche koden som følger
offentlig funksjon oppdatering ($ kryss: Number): void {_currentState.update ($ hake); _media.setTitle (_currentState.toString ()); if (_currentState == _engineOutOfFuelState || _currentState == _engineOffState) {if (_currentRollSpeed ​​== 0) //eller legge denne testen for oppdateringen metoden for de to statene {_media.stopRollSound (); }} //Rydde opp i utgangspanelet etter 10 sekunder hvis ((_cleanUpTimer + = $ tick) > = TEN_SECONDS) {_cleanUpTimer - = TEN_SECONDS; _media.cleanUp (); }}

Husk - endringer i metoder, men kompleks, bare manipulere lyd og animasjon. Hvis du har planer om å gjøre lekser senere (tillater bilen å gå tilbake til parken fra noen av driv stater), her er metoden du må jobbe med. Lim den før turnKeyOn () -metoden. Denne metoden blir kalt når "park" radio knappen klikkes (hvis aktivert). Se addButtons () i Media klassen
offentlig funksjon returnToPark. (E: Handling = null): void {//lekser}

Fra turnKeyOn () hele veien ned for å fylle bensin () legge _cleanUpTimer = 0 før nåværende tilstand delegasjon. Og det er hvordan det visuelle utgang panel får klarert etter 10 sekunder

consumeFuel () og refillWithFuel () må også oppdateres, som vist her.
Offentlig funksjon consumeFuel ($ forbruk: Number): void {if ((_fuelSupply - = $ forbruk) < = 0) {_fuelSupply = 0; _cleanUpTimer = 0; stopEngine (); if (currentRollSpeed ​​= 0) {playRoll (); print ( "motoren har stanset, ikke mer drivstoff til å kjøre ... rulle til en stopp."); } Else print ( "motoren har stanset, ikke mer drivstoff til å kjøre ..."); _media.setColor (0xff0000); changeState (_engineOutOfFuelState); }} Offentlig funksjon refillWithFuel (): Antall {if (! _currentRollSpeed ​​= 0) playRoll (); Var neededSupply: Number = _fuelCapacity - _fuelSupply; _fuelSupply + = neededSupply; _media.setColor (); tilbake neededSupply;.}

Jeg bare fortsatte å legge uansett funksjon jeg kunne tenke på å vise statens Pattern fleksibilitet

Sett hva som er inne i print () -metoden med _media.print ($ tekst);.



Trinn 9:. Utvide Bil ansvar - lydkontroll

Gå en linje etter toString () metode i bunnen av klassen og lim listen nedenfor
///lyd controlpublic funksjon startEngine (): void {_media.startEngine ();} offentlig funksjon startEngineNoFuel (): void {_media.startEngineNoFuel ();} offentlig funksjon startEngineWhileRunning (): void {_media.startEngineWhileRunning ();} offentlig funksjon keyOffClick ( ): void {_media.keyOffClick (); } Offentlig funksjon stopEngine (): void {_media.stopEngine ();} offentlig funksjon playParkToDrive (e: Handling = null): void {_media.playParkToDrive (e);} offentlig funksjon playDriveToTurbo (e: Handling = null): void { _media.playDriveToTurbo (e);} offentlig funksjon playParkToReverse (e: Handling = null): void {_media.playParkToReverse (e);} offentlig funksjon playReverseToDrive (): void {_media.playReverseToDrive ();} offentlig funksjon playDriveToReverse (): void {_media.playDriveToReverse ();} offentlig funksjon playReverseToTurbo (): void {_media.playReverseToTurbo ();} offentlig funksjon playTurboToReverse (): void {_media.playTurboToReverse ();} offentlig funksjon playTurboToDrive (): void {_media.playTurboToDrive ();} offentlig funksjon playRoll (): void {_media.playRoll ();}

Siden egenskapene ikke endrer når du spiller lyd, vi bare delegere arbeid fra bil til media. For animasjon, blir eiendommene manipulert inne staten klasser som deretter påføres gjennom tilgang til media gjennom bilen

Det kan begynne å bli litt forvirrende, men bare tenk på det på denne måten -. Bilen er ditt sentral kontroll hub med sin logikk inneholdt innenfor de statlige klasser. Den nåværende tilstand har sin egen spesielle oppførsel for kalt action, som svar, så kaller det spesifikke funksjoner i bilen for å oppnå ønsket resultat.

Så kommer kontroll for "park" -knappen. Vi trenger disse metodene for å automatisk tilbake utstyret til å parkere hvis motoren er enten av eller tom for drivstoff (etter ett sekund). Ikke få det forvirret med returnToPark () metode som er utløst av radioknappen (se trinn 29). Lim inn koden neste. Du vil se hvordan disse metodene ble unnfanget da vi begynne å legge til staten klasser
offentlig funksjon switchToPark (): void {_media.parked = true;} offentlig funksjon isParked (). Boolean {return _media.parked;}



Trinn 10: Utvide Bil ansvar - Animasjon Kontroll

den koden under fullfører klasse. Legg det på slutten og lagre arbeidet
///Animasjon controlpublic funksjon få currentRollSpeed ​​(). Antall {return _currentRollSpeed; } Offentlig funksjon satt currentRollSpeed ​​($ verdi: Antall): void {_currentRollSpeed ​​= $ verdi;} offentlig funksjon får carFrontWheel (): Sprite {return _media.carFrontWheel; } Offentlig funksjon får carRearWheel (): Sprite {return _media.carRearWheel; } Offentlig funksjon får karosseri (): Sprite {return _media.carBody; } Offentlig funksjon får carBlurEffect (): Sprite {return _media.carBlurEffect; } Offentlig funksjon får vinkel (): Antall {return _angle; } Offentlig funksjon sett vinkel (verdi: Number): void {_angle = verdi; } Offentlig funksjon får reallyFastRollSpeed ​​(): Antall {return _reallyFastRollSpeed; } Offentlig funksjon får reverseRollSpeed ​​(): Antall {return _reverseRollSpeed; } Offentlig funksjon får driveRollSpeed ​​(): Antall {return _driveRollSpeed; }

Det var en masse ekstra kode. Sammenligne klassene med de som er inkludert med kilden nedlasting hvis du får feil når du tester app senere



Trinn 11:. Kontrollerende Media Fra EngineDriveReallyFast

For å legge til effekter (i dette tilfellet, håndtering visuell manipulasjon), har jeg lært å alltid starte der ting endrer seg mest. Vi kunne begynne å jobbe på standardtilstanden EngineOff - men så hvordan vet vi hva animasjon som skal skje der med mindre vi vet hva animasjon det kan komme tilbake fra? Hvis vi starter der, vi vet bare at hjulene ikke skal rulle i det hele tatt. Men bilen kan komme fra turbo

Gjennomgå og sammenligne iState metoden implementeringer for din nåværende EngineDriveReallyFast versjon med koden under
offentlig funksjon turnKeyOff ():.. Void {_car.print ( "klikk. .. ruller til en stopp fra turbo ... motoren er slått av. "); _car.stopEngine (); _car.keyOffClick (); if (_car.currentRollSpeed ​​= 0!) _car.playRoll (); _car.changeState (_car.getEngineOffState ());} offentlig funksjon turnKeyOn (): void {_car.print ( "! mann, vi er på turbo, ikke skru av tenningen"); _car.startEngineWhileRunning ();} offentlig funksjon driveForward (): void {_car.print ( "sakker til vanlig kjørehastighet ..."); _car.playTurboToDrive (); _car.changeState (_car.getEngineDriveForwardState ());} offentlig funksjon driveBackward (): void {_car.print ( "klikk, bytte tannhjul fra turbo å snu ..."); _car.playTurboToReverse (); _car.changeState (_car.getEngineDriveBackwardState ());} offentlig funksjon driveReallyFast (): void {_car.print ( "Vi kan ikke kjøre fortere enn dette, ingen endringer ...");} offentlig funksjon fylle bensin (): void {if (_car.hasFullTank () == false) {_car.stopEngine (); _car.print ( "treffe bremsene !, stoppe bilen, bytte utstyr til park, vri nøkkelen til av-stillingen, komme seg ut av bilen og legge til" + nummer (_car.refillWithFuel ()). toFixed (2) + "gallon (r) av drivstoffet."); _car.changeState (_car.getEngineOffState ()); }} Offentlig funksjon oppdatering ($ kryss: Number): void {_car.engineTimer + = $ tick; //Hvis hastigheten går over vanlig kjørehastighet, viser turbo blur effekt dersom (_car.currentRollSpeed ​​> _car.driveRollSpeed) {if (_car.carBlurEffect.alpha < 0,6) _car.carBlurEffect.alpha + = 0,01; if (_car.carBlurEffect.x > -30) _car.carBlurEffect.x + = -.01; //Rotere karosseriet klokken litt om (_car.carBody.rotation < 7) _car.carBody.rotation + = 0,05; //Flytte bilen kroppen litt til venstre hvis (_car.carBody.x > -5) _car.carBody.x + = -.02; } //Langsomt øke hastigheten hvis ikke maxed if (_car.currentRollSpeed ​​< _car.reallyFastRollSpeed) _car.currentRollSpeed ​​+ = 0,2; annet _car.currentRollSpeed ​​= _car.reallyFastRollSpeed; _car.carFrontWheel.rotation + = _car.currentRollSpeed; _car.carRearWheel.rotation + = _car.currentRollSpeed; //Dupper bevegelse _car.carBody.y = tak i Math.sin (_car.angle + = 0,05) * 2; if (_car.engineTimer > = Car.ONE_SIXTH_SECONDS) {_car.engineTimer - = Car.ONE_SIXTH_SECONDS; _car.consumeFuel (Car.TURBO_FUEL_CONSUMPTION); }}

Jeg har ekskludert konstruktøren samt toString () metode siden de ikke gjør noe med media.

Vi er ikke å gjøre noen endringer i de statlige klasser Vi re bare legge til funksjoner for å styre lyd og animasjon. Du kan kopiere plassering og erstatte alle disse metodene i din EngineDriveReallyFast tilstand eller du kan bare legge til de manglende bitene. Det er opp til deg. Den viktigste delen er vi har abstrahert logikken unna Car objekt. Nå kan vi gjøre det så komplisert som vi ønsker. Fokuset er skarp. Vi vet hva vi jobber med og det er ingen mix-up.

Animasjon håndteres gjennom oppdateringen () -metoden. Resten bare tar seg av å spille lyd



Trinn 12:.. Animasjon for EngineDriveBackward

Nå for den motsatte enden

Review, sammenlign deretter gjøre endringer akkurat som vi gjorde for EngineDriveReallyFast staten
offentlig funksjon turnKeyOff (): void {_car.print ( "klikk ... rulle til en stopp i revers ... motoren er slått av.."); _car.stopEngine (); _car.keyOffClick (); if (_car.currentRollSpeed ​​= 0!) _car.playRoll (); _car.changeState (_car.getEngineOffState ());} offentlig funksjon turnKeyOn (): void {_car.print ( "du kjører i revers, trenger ikke å skru av tenningen!"); _car.startEngineWhileRunning ();} offentlig funksjon driveForward (): void {_car.print ( "klikk, bytte fra revers for å drive ..."); _car.playReverseToDrive (); _car.changeState (_car.getEngineDriveForwardState ());} offentlig funksjon driveBackward (): void {_car.print ( "... allerede kjører i revers.");} offentlig funksjon driveReallyFast (): void {_car.print ( " klikk, giring fra revers til turbo !!! "); _car.playReverseToTurbo (); _car.changeState (_car.getEngineDriveReallyFastState ());} offentlig funksjon fylle bensin (): void {if (_car.hasFullTank () == false) {_car.stopEngine (); _car.print ( "stoppe bilen fra å kjøre i revers, girskifte å parkere, vri nøkkelen til av-stillingen, komme seg ut av bilen og legge til" + nummer (_car.refillWithFuel ()). toFixed (2) + " gallon (r) av drivstoff. "); _car.changeState (_car.getEngineOffState ()); }} Offentlig funksjon oppdatering ($ kryss: Number): void {_car.engineTimer + = $ tick; ///Visuell if (_car.carBlurEffect.alpha > 0) _car.carBlurEffect.alpha + = -.01; if (_car.carBlurEffect.x < 0) _car.carBlurEffect.x + = 0,01; if (_car.carBody.rotation > -5) _car.carBody.rotation + = -.03; if (_car.carBody.x < 3) _car.carBody.x + = 0,02; if (_car.currentRollSpeed ​​> _car.reverseRollSpeed) _car.currentRollSpeed ​​+ = -.4; annet _car.currentRollSpeed ​​= _car.reverseRollSpeed; _car.carFrontWheel.rotation + = _car.currentRollSpeed; _car.carRearWheel.rotation + = _car.currentRollSpeed; _car.carBody.y = tak i Math.sin (_car.angle + = 0,1) * 1; if (_car.engineTimer > = Car.ONE_SIXTH_SECONDS) {_car.engineTimer - = Car.ONE_SIXTH_SECONDS; _car.consumeFuel (Car.REVERSE_FUEL_CONSUMPTION); }}

Ikke noe fancy, vi bare gjør det virke som bilens går i revers. Siden forrige tilstand kan være EngineDriveReallyFast, må vi sørge for at turboen blur effekten er tatt bort (linje 51-52)



Trinn 13:. Den EngineDriveForward State
offentlig funksjon turnKeyOff ( ): void {_car.print ( "klikk ... rulle til en stopp ... motoren er slått av."); _car.stopEngine (); _car.keyOffClick (); if (_car.currentRollSpeed ​​= 0!) _car.playRoll (); _car.changeState (_car.getEngineOffState ());} offentlig funksjon turnKeyOn (): void {_car.print ( "du er ute og kjører, så ikke skru av tenningen!"); _car.startEngineWhileRunning ();} offentlig funksjon driveForward (): void {_car.print ( "allerede kjører - ikke nødvendig å endre noe ...");} offentlig funksjon driveBackward (): void {_car.print ( "klikk, endring av utstyr fra stasjonen for å snu ... "); _car.playDriveToReverse (); _car.changeState (_car.getEngineDriveBackwardState ());} offentlig funksjon driveReallyFast (): void {_car.print ( "bytte fra stasjonen til turbo !!!"); _car.playDriveToTurbo (); _car.changeState (_car.getEngineDriveReallyFastState ());} offentlig funksjon fylle bensin (): void {if (_car.hasFullTank () == false) {_car.stopEngine (); _car.print ( "stoppe bilen, skifte gir for å parkere, vri nøkkelen til av-stillingen, komme seg ut av bilen og legge til" + nummer (_car.refillWithFuel ()). toFixed (2) + "gallon (s) av drivstoff. "); _car.changeState (_car.getEngineOffState ()); }} Offentlig funksjon oppdatering ($ kryss: Number): void {_car.engineTimer + = $ tick; ///Visuell if (_car.carBlurEffect.alpha > 0) _car.carBlurEffect.alpha + = -.01; //Hvis du kommer fra turbo, fjerne blur effekt hvis (_car.carBlurEffect.x < 0) _car.carBlurEffect.x + = 0,01; if (_car.carBody.rotation < 5) _car.carBody.rotation + = 0,01; else if (_car.carBody.rotation > 5) _car.carBody.rotation + = -.01; if (_car.carBody.x > -3) _car.carBody.x + = -.01; else if (_car.carBody.x < -3) _car.carBody.x + = 0,01; if (_car.currentRollSpeed ​​< _car.driveRollSpeed) _car.currentRollSpeed ​​+ = 0,2; //Fra revers eller park else if (_car.currentRollSpeed ​​> _car.driveRollSpeed) _car.currentRollSpeed ​​+ = -.2; //Fra turbo annet _car.currentRollSpeed ​​= _car.driveRollSpeed; _car.carFrontWheel.rotation + = _car.currentRollSpeed; _car.carRearWheel.rotation + = _car.currentRollSpeed; _car.carBody.y = tak i Math.sin (_car.angle + = 0,1) * 2; if (_car.engineTimer > = Car.ONE_SIXTH_SECONDS) {_car.engineTimer - = Car.ONE_SIXTH_SECONDS; _car.consumeFuel (Car.DRIVE_FUEL_CONSUMPTION); }}

Her sjekker vi om bilen kom fra det motsatte, park, eller turbo staten og justere rulling av hjulene på riktig måte. Resten av endringene er lik de andre statene



Trinn 14:. Den EngineOn State
offentlig funksjon turnKeyOff (): void {_car.print ( "klikk ... motoren har blitt slått av fra park. "); ///Visuell _car.carBody.rotation = 0; _car.carBody.x = 0; _car.stopEngine (); _car.keyOffClick (); _car.changeState (_car.getEngineOffState ());} offentlig funksjon turnKeyOn (): void {_car.print ( "! motorens allerede kjører du ikke trenger å skru tenningen"); _car.startEngineWhileRunning ();} offentlig funksjon driveForward (): void {_car.print ( "klikk, giring for å kjøre ... nå skulle et ..."); _car.playParkToDrive (); _car.changeState (_car.getEngineDriveForwardState ());} offentlig funksjon driveBackward (): void {_car.print ( "klikk, giring fra park til å snu ..."); _car.playParkToReverse (); _car.changeState (_car.getEngineDriveBackwardState ());} offentlig funksjon driveReallyFast (): void {_car.print ( "klikk, går på turbo ... woohoo !!!"); _car.playDriveToTurbo (); _car.changeState (_car.getEngineDriveReallyFastState ());} offentlig funksjon fylle bensin (): void {if (_car.hasFullTank () == false) {_car.stopEngine (); _car.print (. "skru bilen av, komme seg ut og legge til" + nummer (_car.refillWithFuel ()) toFixed (2) + "gallon (r) av drivstoff."); _car.changeState (_car.getEngineOffState ()); }} Offentlig funksjon oppdatering ($ kryss: Number): void {_car.engineTimer + = $ tick; ///Visuell _car.angle + = 2; //Vibrasjon effekt _car.carBody.rotation = Math.cos (_car.angle) * 0,8; if (_car.carBlurEffect.alpha > 0) _car.carBlurEffect.alpha + = -.005; if (_car.carBlurEffect.x < 0) _car.carBlurEffect.x + = 0,01; if (_car.currentRollSpeed ​​> 0,3) _car.currentRollSpeed ​​+ = -.3; else if (_car.currentRollSpeed ​​< -.3) _car.currentRollSpeed ​​+ = 0,3; annet _car.currentRollSpeed ​​= 0; if (_car.currentRollSpeed ​​== 0) _car.switchToPark (); _car.carFrontWheel.rotation + = _car.currentRollSpeed; _car.carRearWheel.rotation + = _car.currentRollSpeed; if (_car.engineTimer > = Car.ONE_SIXTH_SECONDS) {_car.engineTimer - = Car.ONE_SIXTH_SECONDS; _car.consumeFuel (Car.IDLE_FUEL_CONSUMPTION); }}

Et mønster begynner å vise. Bli kjent med endringene deretter bruke dem til klassen



Trinn 15:. Ut av Fuel Animation
offentlig funksjon turnKeyOff (): void {_car.print ( "du allerede gjorde dette når drivstoff kjørte ut tidligere ... ");} offentlig funksjon turnKeyOn (): void {_car.print (".. ingen drivstoff - bilen vil ikke starte, få litt drivstoff før noe Retur nøkkelen til av-stillingen "); _car.startEngineNoFuel ();} offentlig funksjon driveForward (): void {_car.engineTimer = 0; _car.print ( "klikk, endre utstyr for å drive gjør ikke noe ... bilen har ingen drivstoff, tilbake utstyret til å parkere ...");} offentlig funksjon driveBackward (): void {_car.engineTimer = 0; _car.print ( "klikk, endre utstyr for å reversere vil ikke gjøre noe heller ... bilen har ingen drivstoff, tilbake utstyret til å parkere ...");} offentlig funksjon driveReallyFast (): void {_car.engineTimer = 0; _car.print ( "klikk, endret utstyr til turbo, ingen endring, bilen ikke kjører, prøv å få Som drivstoff, tilbake utstyret til å parkere.");} offentlig funksjon fylle bensin (): void {if (_car.hasFullTank () == false) {_car.print ( "komme ut av bilen og legge til" + _car.refillWithFuel () + "gallon (r) av drivstoff \\ n."); _car.changeState (_car.getEngineOffState ()); }} Offentlig funksjon oppdatering ($ kryss: Number): void {if (_car.currentRollSpeed ​​== 0) {if (! _car.isParked ()) {_car.engineTimer + = $ Tick; if (_car.engineTimer > = Car.ONE_SECOND) {_car.switchToPark (); }}} If (_car.carBlurEffect.alpha > 0) _car.carBlurEffect.alpha + = -.005; if (_car.carBlurEffect.x < 0) _car.carBlurEffect.x + = 0,01; if (_car.carBody.rotation > 0) _car.carBody.rotation + = -.02; else if (_car.carBody.rotation < 0) _car.carBody.rotation + = 0,02; if (_car.carBody.x < 0) _car.carBody.x + = 0,02; else if (_car.carBody.x > 0) _car.carBody.x + = -.02; if (_car.currentRollSpeed ​​> 0,3) _car.currentRollSpeed ​​+ = -.3; else if (_car.currentRollSpeed ​​< -0,3) _car.currentRollSpeed ​​+ = 0,3; annet _car.currentRollSpeed ​​= 0; _car.carFrontWheel.rotation + = _car.currentRollSpeed; _car.carRearWheel.rotation + = _car.currentRollSpeed ​​;; }

En State ... =)



Trinn 16: Animasjon når bilen er slått av
offentlig funksjon turnKeyOff (): void {_car.print ( "Bilens allerede av, kan du ikke vri nøkkelen mot klokken lenger ... ");} offentlig funksjon turnKeyOn (): void {_car.print (" slå bilen på ... motoren er nå i gang ");! _car.startEngine (); _car.changeState (_car.getEngineOnState ()); } Offentlig funksjon driveForward (): void {_car.engineTimer = 0; _car.print ( "klikk, endre utstyr for å drive gjør ikke noe ... bilen ikke kjører, tilbake utstyret til å parkere ...");} offentlig funksjon driveBackward (): void {_car.engineTimer = 0; _car.print ( "klikk, endre utstyr for å reversere gjør ingenting, er bilen ikke kjører, tilbake utstyret til å parkere ...");} offentlig funksjon driveReallyFast (): void {_car.engineTimer = 0; _car.print ( "klikk, endre utstyr til turbo, ingenting skjer, motorens av, returnere utstyret til å parkere ...");} offentlig funksjon fylle bensin (): void {if (_car.hasFullTank () == false .) {_car.print ( "komme ut av bilen og legge til" + nummer (_car.refillWithFuel ()) toFixed (2) + "gallon (r) av drivstoff."); }} Offentlig funksjon oppdatering ($ kryss: Number): void {if (_car.currentRollSpeed ​​== 0) {if (! _car.isParked ()) {_car.engineTimer + = $ Tick; if (_car.engineTimer > = Car.ONE_SECOND) {_car.switchToPark (); import flash.events.Event;