Creating "Flux": en enkel flash spill med en Gravity Mechanic
Del
Del
9
Del
Dette Cyber mandag Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av.
I denne opplæringen, vil jeg forklare de store skritt og arbeidsflyt for å lage en enkel plass overlevelse spill, basert på alvoret mekaniker forklart i en tidligere opplæringen. Dette spillet er skrevet i AS3 bruker FlashDevelop.
Play the Game
Bruk venstre og høyre piltastene til å manøvrere skipet ditt, opp og ned piltastene for å øke eller redusere størrelsen av det magnetiske feltet frembringer den, og space for å reversere polariteten. Samle de hvite krystaller for å øke drivstofftilførsel - men unngå de røde, fordi de bruker det opp. ! Ikke traff en stein, eller er det game over
I denne opplæringen, vil vi ikke faktisk lage hele spillet vises ovenfor; vi må bare komme i gang med det, ved å lage en veldig enkel versjon med primitive grafikk og bare én type objekt. Men på slutten, du burde ha lært nok til å kunne legge til de andre funksjonene selv
Selve spillet er svært enkel i sin nåværende tilstand - ta en titt på denne kritikken for tips om hvordan du kan ta det fra en enkel demo til en full kamp!
La oss komme i gang!
Sett opp en ny AS3 prosjekt i FlashDevelop, og sette dens dimensjoner til 550x600px.
pakke {[SWF (width = "550", height = "600")] public class Hoved strekker Sprite {}}
Trinn 1: Identifisere spillobjektene
det er seks objekter i partikkel at du kan identifisere fra å spille spillet ovenfor:
Energiforsyning - representert ved en hvit oval form objekt
asteroide - representert ved en stein-lignende objekt
forbruker av energi - representert ved en rød stjerne avgrenset med grønt lys
Stars -. bakgrunnen
Range indikator - representert ved en hvit sirkel
Ship - spiller objekt
Selvfølgelig kan du legge inn en annen gjenstand for å gjøre spillet mer interaktiv eller legge til en ny funksjon. For denne opplæringen vil vi bare gjøre
Trinn 2: Energiklasse
Fra de objektene vi identifisert, fire av dem faktisk fungerer på akkurat samme måte: ved å falle fra toppen til bunn
De er:.
stjerner
Energiforsyning
Energi forbruker
asteroide
i denne opplæringen, vi bare kommer til å gjøre de "energiforsynings" objekter, ut av de fire ovenfor. Så la oss begynne med å lage disse stedene og gjøre dem falle ned, med en tilfeldig gyting posisjon og hastighet
Start med å lage en Energiklasse:
pakke {import flash.display.MovieClip;. import flash.events.Event; public class Energy utvider MovieClip {private Var rSpeed: Antall = 0; offentlig funksjon Energy (hastighet: Number) {graphics.beginFill (0x321312); graphics.drawCircle (0, 0, 8); rSpeed = hastighet; } //Vi vil kalle dette hver ramme offentlig funksjon flytte (): void {this.y + = rSpeed; //Rotasjonshastighet er knyttet til flytting hastighet this.rotation + = rSpeed /8; }}}
Trinn 3:. Den GameScreen Class
Denne klassen vil etter hvert kontrollere de fleste av de aspektene av spillet vårt, inkludert spilleren bevegelse og spillet sløyfe
Opprett klassen:
pakke {public class GameScreen strekker MovieClip {offentlig funksjon GameScreen () {}}}
det er alt vi trenger for nå
Trinn 4:. Oppdater den største klassen
Vi vil nå opprette en forekomst av GameScreen innen Hovedbilde:
pakke {import flash.display.Sprite; import flash.events.Event; [SWF (width = "550", height = "600")] public class Hoved strekker Sprite {private Var spillet: GameScreen; offentlig funksjon main (): void {//ikke vise en gul firkant på skjermen ved oppstart stage.stageFocusRect = false; Spillet = new GameScreen (); addChild (spill); //Gi tastaturet fokus til spillet skjermen umiddelbart stage.focus = spillet; }}}
Hvorfor bry seg? Vel, på denne måten, vil det være lettere å legge til ekstra skjermer senere hvis vi ønsker å (som en preloader, en tittel skjerm, en game over skjermen ...)
Trinn 5:. Introduksjon en leder klasse
for å unngå GameScreen klasse blir for mye av et rot, vil vi bruke egne klasser for å håndtere hvert objekt.
hver leder klassen vil inneholde alle funksjoner som er knyttet til, og samhandle med, et bestemt objekt. Her er Energy klasse:
pakke {import flash.display.MovieClip; public class Energy {//denne Vector vil lagre alle forekomster av Energiklasse privat Var energyList: Vector < Energy >. privat Var gameScreen: GameScreen; offentlig funksjon Energy (GS: GameScreen) {gameScreen = gs; energyList = new Vector. < Energy >; }}}
Merk at vi trenger en referanse til GameScreen sendes til konstruktøren, og vi lagrer denne referansen i en privat variabel. Vi har også satt opp en vektor til å lagre referanser til alle energi objektene
Så langt klassen inneholder ingen andre funksjoner.; vi vil legge dem i senere
Trinn 6:. Opprette Energy
Legg den under funksjon for å lage energi, dette er bare en funksjon; vi vil kalle funksjonen senere fra GameScreen Klasse:
offentlig funksjon createEnergy (Nummer: int): void {var energi: Energi; for (var i: int = 0; i < nummer, i ++) {energi = new Energy (4); gameScreen.addEnergyToScreen (energi); energyList.push (energi); energy.x = Calculation.generateRandomValue (30, 520); energy.y = Calculation.generateRandomValue (-150, -20); }}
Vi skaper en ny energiforsyning med en hastighet på 4, legg den til visningslisten (via GameScreen), legge den til i Vektor av alle energi objekter som vi nettopp opprettet, og sette sin posisjon til en tilfeldig punkt innenfor visse grenser.
Calculation.generateRandomValue (#, #) er en statisk funksjon vi ikke har skrevet ennå, så la oss gjøre det nå. Opprett en ny klasse kalt Beregning og legge til denne funksjonen:
public static funksjon generateRandomValue (min: Antall, max: Number): Antall {var randomValue: Number = min + (Math.random () * (max - min)); tilbake randomValue; }
Denne funksjonen vil generere et tilfeldig tall mellom de to verdiene som sendes til den. For mer informasjon om hvordan det fungerer, se denne Quick Tips. Siden dette er en statisk funksjon, trenger vi ikke å opprette en forekomst av beregning for å kalle det.
Nå, hva er det addEnergyToScreen () -funksjonen? Vi har ikke definert det ennå, så la oss gjøre det nå. Legg dette til GameScreen:
offentlig funksjon addEnergyToScreen (energi: Energi): void {addChild (energi); }
Det legger bare gått forekomst av energi til visningslisten. La oss også gjøre en tilsvarende funksjon for å fjerne en gitt energi objekt fra skjermen:
offentlig funksjon removeEnergyFromScreen (energi: Energi): void {if (energy.parent == denne) {removeChild (energi); }}
Trinn 7: Gytingen Energy
La oss sette en timer som definerer intervallet for hver gyting. Denne koden går i GameScreen konstruktør funksjon:
energyM = ny Energy (dette); //Husk å passere en referanse til spillet skjermen Var spawnTimer: Timer = new Timer (3000, 0); spawnTimer.addEventListener (TimerEvent.TIMER, spawnEnergy), spawnTimer.start ();
Så, hvert tredje sekund, timeren vil kalle spawnEnergy (). La oss skrive at funksjon nå:
privat funksjon spawnEnergy (e: Timerevent): void {energyM.createEnergy (4); //Oppretter 4 energier}
Trinn 8: Lage Player
La oss bruke et annet, større sirkel for å representere spilleren. Føl deg fri til å importere et bilde som skal brukes i stedet:
offentlig funksjon Player () {graphics.beginFill (0x7ebff1); graphics.drawCircle (0, 0, 20);
Legg denne koden for å GameScreen å legge spilleren til skjermen:
//i variabelen definitionspublic Var spiller: Spiller; //i konstruktøren functionplayer = ny spiller; addChild (spiller); player.x = 275; player.y = 450;
Så langt vi bør ha noen energiforsyning falle i noen sekunder, og spilleren vises i midten av skjermen:
Trinn 9: flytte spilleren
det er i utgangspunktet to måter å anvende bevegelse:
- Basert på disse Booleans, faktisk flytte spilleren hver ramme:
Ikke glem å først opprette en funksjon høre fra angir rammen hendelsen, "oppdatering":
//kaller dette fungere hver frameprivate funksjon oppdateringen (e: Hendelses): void if (moveRight == true) {player.x + = 6; } If (moveLeft == true) {player.x - = 6; }Hold spilleren innenfor grensene av skjermen:
if (player.x > = 525) {moveRight = false; } If (player.x < = 20) {moveLeft = false; }
Her er hvordan alle som ser, på plass:
pakke {import flash.display.MovieClip; import flash.events.Event; import flash.events.TimerEvent; import flash.ui.Keyboard; import flash.utils.Timer; import flash.events.KeyboardEvent; public class GameScreen {public Var spiller: Spiller; privat Var energyM: Energy; privat Var moveRight: Boolean = false; privat Var moveLeft: Boolean = false; privat Var isGravityPushing: Boolean = true; privat Var returnedPower: int = 0; privat Var scoreText: Tekst; privat Var totalScore: int = 0; privat Var poengsum: Tekst; offentlig funksjon GameScreen () {scoreText = ny tekst ( "Resultat:"); addChild (scoreText); energyM = ny Energy; Var spawnTimer: Timer = new Timer (3000, 0); spawnTimer.addEventListener (TimerEvent.TIMER, spawnEnergy); spawnTimer.start (); Spilleren = ny spiller; addChild (spiller); player.x = 275; player.y = 450; addEventListener (Event.ENTER_FRAME, oppdatering); addEventListener (KeyboardEvent.KEY_DOWN, KeyDownHandler); addEventListener (KeyboardEvent.KEY_UP, KeyUpHandler); } Private funksjon KeyDownHandler (e: KeyboardEvent): void {if (e.keyCode == Keyboard.RIGHT) {moveRight = true; } If (e.keyCode == Keyboard.LEFT) {moveLeft = true; } If (e.keyCode == Keyboard.SPACE) {if (isGravityPushing == true) {isGravityPushing = false; } Else if (isGravityPushing == false) {isGravityPushing = true; }}} Private funksjon KeyUpHandler (e: KeyboardEvent): void {if (e.keyCode == Keyboard.RIGHT) {moveRight = false; } If (e.keyCode == Keyboard.LEFT) {moveLeft = false; }} Private funksjon oppdateringen (e: Hendelses): void {if (player.x > = 525) {moveRight = false; } If (player.x < = 20) {moveLeft = false; } If (moveRight == true) {player.x + = 6; } If (moveLeft == true) {player.x - = 6; }}}}
Trinn 10: bevege energien utstyr BusinessI øyeblikket energiforsyninger er gyting, men ikke i bevegelse. Vi bruker GameScreen.update () -funksjonen for å få dem til å flytte, siden det går hver ramme
Legg denne koden til GameScreen.update ().
EnergyM.moveAll (); //Vil gjøre vårt ytte energi objekt flytteNå selvfølgelig må vi gjøre EnergyManager.moveAll () -funksjonen, så legg dette til EnergyManager.as:
offentlig funksjon moveAll (): void {for (var i: int = 0; i < energyList.length; i ++) {var Energys: Energi = energyList [i]; energyS.move (); }}
Trinn 10: Kollisjon Detection
Vi må sjekke for kollisjoner mellom hver energi objekt og spilleren. (Hvis du utvikle spillet videre, må du sjekke dette for asteroider og energiforbrukere, men ikke for stjerner.)
Det beste stedet å håndtere disse kontrollene er inne i Energy, utløst hver ramme av GameScreen
En ting å vurdere. kollisjons sjekker vil være mellom to sirkler, så hitTestObject () er ikke ideelt. I stedet vil vi være å bruke metoden forklart i denne opplæringen
Vi kan skrive funksjonen som nedenfor:.
Offentlig funksjon checkCollision (p: Player): int {//energi overført på grunn av kollisjon Var energyTransfer: int = 0; for (var i: int = 0; i < energyList.length; i ++) {var Energys: Energi = energyList [i]; Var newX: Number = p.x - energyS.x; Var newy: Number = p.y - energyS.y; Var distanse: Antall = Math.sqrt (newX * newX + newy * newy); if (avstand < = 28) {gameScreen.removeEnergyFromScreen (Energy); energyList.splice (i, 1); //For dette enkle spillet, vil vi alltid overføre en enhet //men du kan endre dette basert på hastighet kollisjon //eller noen annen faktor energyTransfer = 1; }} Returnere energyTransfer; }
- Linje 32: oppmerksom på at vi passerer i en referanse til spilleren, slik at vi kan få tilgang til sin posisjon
Linje 38:.. Energys er en forkortelse for Energiforsyning
Linje 40 & 41:. Finne forskjellen i x- og y-koordinater mellom spilleren og energiforsyning vi nå sjekker
Linje 43:. Beregne avstanden mellom objektene via Pythagoras
Linje 45 : se etter kollisjon; 28 er summen av de to objektenes radier (spiller radius er 20, energi radius er 8)
Linje 46 &.; 47:. Fjerne energiforsyning fra skjermen og fra Vector
Linje 51:. Legge til maksimalt én enhet av energi per ramme
Du kan endre linje 51 til energyTransfer + = 1 , for å tillate spilleren å absorbere mer enn ett objekt energi samtidig. Det er opp til deg - prøve det ut og se hvordan det påvirker spillet
Trinn 11:. Call Collision Detection Rutine
Vi må sjekke for kollisjoner hver ramme, så vi burde kaller funksjonen vi nettopp skrev fra GameScreen.update ().
Først må vi opprette et heltall variabel til å lagre energi overføringsverdi fra dueller funksjon. Vi vil bruke denne verdien for å øke skipets energi og legge til spillerens poengsum
privat Var returnedPower. Int = 0; returnedPower = energyM.checkCollision (spiller);
Trinn 12: Newtons lov gravitasjon
Før vi går inn i å skape den spillmekanikk for "Push" og "Pull" -funksjonen på skipet, vil jeg gjerne introdusere fysikk konsept som mekaniker er basert på.
ideen er å tiltrekke objektet mot spilleren ved hjelp av en kraft
. Newtons gravitasjonslov gir oss en god (og enkel) matematisk formel vi kan bruke til dette, hvor kraften er selvfølgelig gravitasjonskraft:
G er bare et tall, og vi kan sette den til hva vi liker. På samme måte kan vi sette massene av hvert objekt i spillet til noen verdier som vi liker. Gravity skjer over uendelige avstander, men i spillet vårt, vil vi ha en cut-off point (merket med hvite sirkelen i demoen fra starten av opplæringen).
De to viktigste tingene å merke seg om denne formelen er:
styrken i kraft avhenger av kvadrat
av avstanden mellom de to objektene (så hvis objektene er dobbelt så langt unna, er kraften . en fjerdedel så sterk)
retning av kraften er langs direkte linje som forbinder de to objektene gjennom rommet
Trinn 13:. Revidere matematiske begreper
Før vi begynner koding spillmekanikken for "push" og "pull" funksjon, la oss være klare på hva vi vil den skal gjøre:
i hovedsak ønsker vi A (spilleren) til å utøve . en viss kraft på B (en krystall), og flytte B mot A basert på at makt
Vi bør revidere noen begreper:
Flash fungerer i radianer i stedet for grader.
Flash koordinatsystem har sin y-aksen reversert: går ned betyr en økning i y
Vi kan få vinkelen på linjen som forbinder A til B ved hjelp Math.atan2 (By - Ay. , Bx - Ax)
Vi kan bruke trigonometri for å finne ut hvor mye vi trenger å flytte B langs hver akse, basert på denne vinkelen og kraften:
Bx + = (force *. Math.cos (vinkel));
Ved + = (Force * tak i Math.sin (vinkel));
Vi kan bruke Pythagoras teorem til å finne ut avstanden mellom de to objektene:
for mer informasjon, se tutorials Gravity in Action og trigonometri for Flash Game Developers
Trinn 14:. Implementering Push og Pull
Basert på tidligere forklaring, kan vi komme opp med en disposisjon for vår kode som tiltrekker hver krystall til skipet:
- Linje 53:
få en henvisning til spilleren Linje 55:. Vi sløyfe gjennom hver energi objekt
Linje 61:. Finne vinkelen mellom skipet og energien
Linje 63:.. finne avstanden mellom dem, også
Linje 65:. sjekke om energi ligger innenfor skipets kraftfelt
Linje 67: bruke formelen:..
4 = G, den "gravitasjonskonstanten" jeg har valgt
50 = m1, massen av skipet spilleren
10 = m2 , massen av energien objektet
Linje 69:. gjelde bevegelse
Her er en timelapse som viser hvordan dette ser ut.
Merk at energien beveger seg raskere jo nærmere den kommer til skipet, takket være r-squared sikt
Vi kan implementere skyve funksjon bare ved å gjøre styrken negative.
offentlig funksjon gravityPull (p: spiller ): void {for (var i: int = 0; i < energyList.length; i ++) {var Energys: Energi = energyList [i]; Var nX: Number = (p.x - energyS.x); Var NY: Antall = (p.y - energyS.y); Var vinkel: Number = Math.atan2 (NY, NX); var r: Number = Math.sqrt (NX * nX + NY * NY); if (R '= 250) {var f: Nummer = (4 * 50 * 10) /(r * r); energyS.x - = f * Math.cos (vinkel); energyS.y - = f * tak i Math.sin (vinkel); }}}Her objektet beveger seg saktere som det blir lenger borte fra spilleren, siden kraften blir svakere
Trinn 15:. Påfør Mechanic
Selvfølgelig at du trenger denne funksjonen som skal kjøres hver ramme av GameScreen - men før det, må vi bruke en boolsk funksjon for å veksle mellom de to funksjonene:
privat Var isGravityPushing: Boolean = true; //Treffer plass veksler detVi skal bruke sann for 'Push' og usant for "pull"
Inside KeyDownHandler ().
If (e.keyCode == Keyboard.SPACE ) {if (isGravityPushing == true) {isGravityPushing = false; } Else if (isGravityPushing == false) {isGravityPushing = true; }}Deretter må du sjekke den boolske hver ramme. Legg dette til å oppdatere ():
if (isGravityPushing == true) {energyM.gravityPull (spiller); } If (isGravityPushing == false) {energyM.gravityPush (spiller); }
Trinn 16: Endring
Du kan finne at bevegelsen ikke ser så fint. Dette kan være fordi styrken er ikke helt ideelt, eller på grunn av r-squared sikt
Jeg ønsker å endre formelen slik:.
Var f: Number = (0,8 * 50 * 10) /r;.Som du ser, jeg har redusert verdien av "G" til 0,8, og endret kraft til å avhenge bare av avstanden mellom objektene, snarere enn avstanden squared
< p> Prøv det ut og se om du liker endringen. Du kan alltid endre det slik du vil
Trinn 17:. Tekst Class
Vi må vise litt tekst på skjermen, for å vise resultatet og skipets gjenværende strøm .
For dette formålet, vil vi bygge en ny klasse, Tekst:
pakke {import flash.display.MovieClip; import flash.text.TextField; import flash.events.Event; import flash.text.TextFormat; import flash.text.TextFormatAlign; public class Tekst strekker MovieClip {public Var _scoreText: Textfield = new Textfield (); offentlig funksjon tekst (string: String) {var myScoreFormat: tekstformat = ny tekstformat (); //Format foranderlig myScoreFormat.size = 24; myScoreFormat.align = TextFormatAlign.LEFT; myScoreFormat.color = (0x131313); _scoreText.defaultTextFormat = myScoreFormat; _scoreText.text = streng; addChild (_scoreText); } Offentlig funksjon updateText (string: String) {_scoreText.text = streng; }}}Det er veldig enkelt; det er i utgangspunktet en MovieClip med et tekstfelt inne
Trinn 18:. Legge strøm for Player
For å gi spillet noen utfordring, vil vi gjøre skipets makt blir brukt opp sakte , slik at spilleren har til å samle energi objekter for å lade.
for å gjøre skipets makt vises på skipet selv, vi kan bare legge til en forekomst av tekst til skipet objektets visningslisten.
Erklærer disse variablene innenfor Skipsklasse klasse~~POS=HEADCOMP:
offentlig Var totalPower: Antall = 100; //Skipet begynner med dette mye powerprivate Var powerText: Tekst;Vi trenger å holde mengden strøm (både lagres og vises) oppdateres hver ramme, så legge til denne nye funksjonen til spiller:
først i konstruktøren:
//legge til en ny tekstobjekt hvis den ikke allerede finnes hvis {powerText = ny tekst (String (int (totalPower))); (powerText!) addChild (powerText); powerText.x - = 20; //Juster posisjon powerText.y - = 16; }Og så ...
offentlig funksjon updatePower (): void {//fps = 24, så dette gjør makt reduksjon på 1 /sek totalPower - = 1/24; powerText.updateText (String (int (totalPower))); }Strømmen vil redusere hver ramme med 1 /24th av en enhet, noe som betyr at det vil minske med en hel enhet hvert sekund.
Vi trenger å gjøre dette kjøres hver ramme, så legge denne linjen til GameScreen.update ():
player.updatePower ();
Trinn 19: Gjør Energy Øk strøm
Når skipet kolliderer med en energi objekt, ønsker vi å øke sin makt .
i GameScreen.update (), legger den markerte linjen:
returnedPower = energyM.checkCollision (spiller); player.totalPower + = returnedPower;Husk at du kan endre hvor mye strøm returneres i EnergyManager.checkCollision () -funksjonen
Trinn 20:. Sette opp Score
igjen vil vi trenge teksten klassen. . Denne gangen viser vi "Score" og deretter verdien
Her vil vi trenge tre variabler:
"Score" tekst
stillingen verdi
tekst
En variabel til å lagre selve poengsum
Erklærer disse i GameScreen klasse:
privat Var scoreText:.. tekst; privat Var totalScore: int = 0; privat Var poengsum: Tekst;i konstruktøren, legg denne koden:
scoreText = ny tekst ( "Score:"); addChild (scoreText), poengsum = ny tekst (String (totalScore)); addChild (score); score.x = scoreText.x + 100; //Plassere den ved siden av "Score:" Text.score.y + = 2;Nå, i oppdateringen () -funksjonen, legge til denne:
score.updateText (String (totalScore));det var det - vi har laget en basisversjon av ovennevnte spillet
Ta en titt (du må kanskje laste siden på nytt):
Ekstra funksjoner og polering
!
Space bakgrunn
Kanskje du ønsker også en bakgrunn med et innebygd bilde og stjerner. Legg dette til din viktigste klassen: product: [Embed (kilde = "/../lib/SpaceBackground.jpg")] //legge privat Var backgroundImage: Klasse; //Denne linjen må komme umiddelbart etter embed privat Var bgImage: Bitmap = new backgroundImage (); private Var numOfStars: int = 70;
Nå opprette Stjerneklasse:
pakkemidlene {import flash.display.MovieClip; import flash.events.Event; public class Stjerne strekker MovieClip {private Var hastighet: Number; offentlig funksjon Star (alfa: Antall, størrelse: Antall, speed1: Number) {graphics.beginFill (0xCCCCCC); graphics.drawCircle (0, 0, størrelse); speed = speed1; } //Må du ringe dette hver ramme privat funksjon moveDown (): void {this.y + = hastighet; if (this.y > = 600) {this.y = 0; }}}}I hoved () konstruktør, legger dette til å skape stjernene:
for (var i: int = 0, jeg < numOfStars; i ++) {createStars ();}Her er selve createStars () -funksjonen:
privat funksjons createStars (): void {var stjerne: stjerne~~POS=TRUNC = ny Star (Math.random (), Calculations.getRandomValue (1, 2), Calculations.getRandomValue (2, 5)); //Tilfeldig alfa, størrelse og hastighet addChild (stjerne); star.x = Calculations.getRandomValue (0, 550); star.y = Calculations.getRandomValue (0, 600);.}Med tilfeldig alpha, størrelse, posisjon og hastighet, en pseudo-3d bakgrunn kan genereres
Range indikator
En rekke indikator sirkel kan gjøres ganske enkelt ved å opprette en ny sirkel og legge det til skipets visningslisten, akkurat som hvordan du la strømindikatoren teksten. . Kontroller at sirkelen er sentrert på skipet, og har en radius lik skipets push /pull utvalg
Legg transparang (alfaverdi) til sirkelen med under-kode:
graphics.beginFill ( 0xCCCCCC, 0,1);Prøv å legge til ekstra kontroller som gjør området økning eller reduksjon når opp og ned piltastene trykkes
Konklusjon
jeg håper du likte dette. tutorial! Vennligst la dine kommentarer
Neste.! Les denne kritikken for en guide til å ta Flux fra en enkel demo til en full kamp
Previous:Workshop: FluxNext Page:err http://fy
Finn forskjellen på x og y mellom skipet og en gitt krystall .
Finn vinkelen mellom dem, i radianer.
Finn avstanden mellom dem, ved hjelp av Pythagoras.
Sjekk om objektet er innenfor skipets gravitasjonsfelt.
Hvis ja, beregne gravitasjonskraft, og ...
... bruke makt, endre x- og y-verdier over det krystall
Eksempelkoden koden~~POS=HEADCOMP.:
offentlig funksjon gravityPull (p: Player): void {for (var i: int = 0; i < energyList.length; i ++) {var Energys: Energi = energyList [i]; Var nX: Number = (p.x - energyS.x); Var NY: Antall = (p.y - energyS.y); Var vinkel: Number = Math.atan2 (NY, NX); var r: Number = Math.sqrt (NX * nX + NY * NY); if (R '= 250) {var f: Nummer = (4 * 50 * 10) /(r * r); energyS.x + = f * Math.cos (vinkel); energyS.y + = f * tak i Math.sin (vinkel); }}}
- Linje 53:
Bruk boolske (true /false) verdier - sant = flytte, false = ikke flytting. Når høyre piltast trykkes, verdien for "flytte rett" endres til sann. I hver ramme oppdatering, "flytte rett" er sant, øker vi objektets x-verdi.
Ved hjelp av direkte oppdatering hver ramme - når høyre piltast trykkes, et objekt beskjed om å flytte til høyre umiddelbart, ved å øke sin x-verdi.
Den andre metoden ikke fører til jevn bevegelse når tasten er trykket inn, men den første metoden -. så vi skal bruke den første metoden
Det er tre enkle trinn å gjøre dette:
Lag to boolske variabler, en for å flytte til høyre og en til å flytte venstre. privat Var moveRight: Boolean = false; privat Var moveLeft: Boolean = false;
Slå boolsk når taster trykkes eller slippes: addEventListener (Event.ENTER_FRAME, oppdatering); addEventListener (KeyboardEvent.KEY_DOWN, KeyDownHandler); addEventListener (KeyboardEvent.KEY_UP, KeyUpHandler); } Private funksjon KeyDownHandler (e: KeyboardEvent): void {if (e.keyCode == Keyboard.RIGHT) {moveRight = true; } If (e.keyCode == Keyboard.LEFT) {moveLeft = true; } If (e.keyCode == Keyboard.SPACE) {if (isGravityPushing == true) {isGravityPushing = false; } Else {isGravityPushing = true; }}} Private funksjon KeyUpHandler (e: KeyboardEvent): void {if (e.keyCode == Keyboard.RIGHT) {moveRight = false; } If (e.keyCode == Keyboard.LEFT) {moveLeft = false; }}