Tässä luvussa liikutamme sankariamme nuolinäppäimillä 4 suuntaan. Hän osoittaa kasvonsa liikkeen suuntaan ja näyttää kävelyanimaatiota liikkuessaan. Animaatio pysähtyy seistessä. Kokeile täällä:
Törmäystunnistusta ei ole, joten sankari voi kävellä ulos lavalta, mutta älä huoli siitä, korjaamme sen seuraavassa luvussa.
Luodaan ensin sankarihahmomme. Luo 3 uutta elokuvaleikettä. Tarvitset yhden elokuvaleikkeen hahmon liikkumiseen vasemmalle (tai oikealle, valitsin vasemmalle), yhden elokuvaleikkeen hahmon liikkumiseen ylös ja viimeisen elokuvaleikkeen liikkumiseen alaspäin. Sijoita näiden elokuvaleikkeiden sisään animaatiot hahmosi liikkumisesta.
Näihin elokuvaleikkeisiin ei tarvita koodia.
Muokkaa nyt “char”-elokuvaleikettä ja luo siihen yhteensä 5 avainkehystä:
Aseta avainkehykseen 1 elokuvaleike “char_up”, avainkehykseen 2 “char_left”, avainkehys 4 saa “char_right” ja avainkehys 5 “char_down”. Voit käyttää samaa elokuvaleikettä sekä vasemmalle että oikealle liikkeelle, käännät vain yhden esiintymistä vaakasuunnassa. Varmista nyt, että jokaisella liikeanimaatiolla on ilmentymän nimi “char”. Tarkista kehykset 1, 2, 4 ja 5 uudelleen. Ne kaikki ovat nimeltään “char”? Älä huoli, jos et vielä ymmärrä miksi tietyn liikkeen oletetaan olevan tietyssä kehyksessä, selitämme sen, kun katsomme liikekoodia.
Ok, aika käsikirjoittaa toimet.
Koodaus
Sankarimme liikkuu ja liike tarvitsee nopeutta, joten lisää nopeusominaisuus sankariobjektiin:
char={xtile:2, ytile:1, speed:4};
Nopeus on pikselien lukumäärä, jonka sankarimme liikkuu näytöllä, suurempi nopeus tarkoittaa, että hän liikkuu nopeammin ja hitaampi saa hänet liikkumaan kuin etana. Sen hyvä käytäntö on käyttää kokonaislukua nopeudena tai saatat saada outoja tuloksia, etkä kuitenkaan näe eroa 10 ja 10 056 873 pikselin välillä.
Kuten muistat (jos et muista, katso edellisestä luvusta), olemme luoneet objektin _root.char säilyttämään char-tiedot, ja olemme sijoittaneet “char” -elokuvaleikkeen “laatat” -elokuvaleikkeeseen. Jotta sankarimme herää ja alkaa liikkumaan, tarvitsemme vielä kaksi toimintoa ja ohjaimen elokuvaleikkeen tarkistaaksemme näppäimet kussakin vaiheessa.
Vedä “tyhjän” elokuvaleikkeen esiintymä lavalle. Voit sijoittaa sen näkyvän alueen ulkopuolelle. Se kutsuu vain funktiota, joten sillä ei ole väliä missä se on. Kirjoita koodi tälle mc:lle:
onClipEvent (enterFrame) {
_root.detectKeys();
}
Voit nähdä, että jokaisessa kehyksessä kutsumme funktiota detectKeys. Nyt kirjoitetaan:
function detectKeys() {
var ob = _root.char;
var keyPressed = false;
if (Key.isDown(Key.RIGHT)) {
keyPressed=_root.moveChar(ob, 1, 0);
} else if (Key.isDown(Key.LEFT)) {
keyPressed=_root.moveChar(ob, -1, 0);
} else if (Key.isDown(Key.UP)) {
keyPressed=_root.moveChar(ob, 0, -1);
} else if (Key.isDown(Key.DOWN)) {
keyPressed=_root.moveChar(ob, 0, 1);
}
if (!keyPressed) {
ob.clip.char.gotoAndStop(1);
} muu {
ob.clip.char.play();
}
}
Ensin julistamme kaksi muuttujaa. Asetamme muuttujan ob osoittamaan arvoa _root.char (muista, että siellä säilytämme kaikki tiedot herosta) ja asetamme muuttujan keyPressed arvoon false. Muuttuva näppäinPainalla tarkistamme, onko funktion lopussa painettu joitain nuolinäppäimiä vai ei.
Seuraavaksi meillä on 4 samanlaista if-lausetta. Jokainen niistä tarkistaa, onko jokin nuolinäppäimistä painettuna. Jos näppäin on alhaalla, he kutsuvat toista toimintoa moveChar käyttämällä rivejä, kuten:
keyPressed=_root.moveChar(ob, 1, 0);
Tämä rivi kutsuu funktiota moveChar käyttäen 3 argumenttia. Ensimmäinen argumentti on muuttuja ob, joka osoittaa char-objektiimme. Kaksi viimeistä argumenttia asetetaan aina -1, 1 tai 0. Ne määrittävät, pitäisikö sankaria siirtää vaakasuunnassa muuttamalla sen x-koordinaattia (toinen argumentti) vai pystysuunnassa muuttamalla y-koordinaattia (kolmas argumentti). Viimeiseksi asetamme funktion moveChar palautusarvon muuttujaksi keyPressed. Voit pian nähdä, että moveChar-funktio palauttaa aina “true”, joten jos jotain nuolinäppäimistä painetaan, muuttuja keyPressed asetetaan arvoon tosi.
Viimeinen koodinpätkä tarkistaa, onko muuttuja keyPressed epätosi, eli nuolinäppäimiä ei ole painettu, jolloin liikeanimaatio pysäytetään komennolla gotoAndStop(1). Jos muuttuja keyPressed on kuitenkin tosi, jatkamme liikeanimaatioiden toistamista.
Nyt toinen toiminto:
function moveChar(ob, dirx, diry) {
ob.x += dirx*ob.speed;
ob.y += diry*ob.speed;
ob.clip.gotoAndStop(dirx+diry*2+3);
ob.clip._x = ob.x;
ob.clip._y = ob.y;
palauttaa (tosi);
}
Katso, moveChar-funktio hyväksyy 3 argumenttia, muuttuja ob on siirrettävä kohde, dirx ja diry ovat arvoja, jotka siirretään x- tai y-suunnassa. Tämä on hyvin universaali toiminto, jonka avulla voimme siirtää kaikkea pelissä. Jos meillä olisi luotilento, voisimme kutsua MoveChariksi luotien suunnalla, jos viholliskävely, voimme taas käyttää samaa toimintoa sen siirtämiseen.
Seuraavat kaksi riviä lisäävät ob.speed-arvon objektien x tai y muuttujaan. Jälleen, jos meillä olisi erilaisia esineitä (luoti, vihollinen), niillä jokaisella voi olla omat nopeudet. Joten, kun havaitsimme oikean nuolinäppäimen ja kutsuimme moveChar-funktiota käyttämällä 1, 0 sitten dirx=1 ja diry =0. Nyt x kasvaa nopeudella, kun taas y pysyy samana. Jos kutsuisimme moveChar-funktiota käyttämällä 0, -1:tä (sitä ylösnuoli käyttää), y pienenisi nopeudella ja x pysyy samana.
Huomaa, että jos meillä olisi enemmän liikejuttuja, kuten törmäys tai painovoima, laskemme x:n ja y:n arvot tässä, ennen kuin edes korvaamme varsinaiset elokuvaleikkeet. Se on paljon parempi tapa kuin käyttää yksinkertaista mc.hitTest-menetelmää.
Linja
ob.clip.gotoAndStop(dirx+diry*2+3);
lähettää hahmon elokuvaleikkeen oikeaan kuvasta kasvoille suuntaan, johon se liikkuu. Voit laskea kaikki dirx/diry-muunnelmat (on 4 eri paria, joten tarkistaminen ei kestä kauan) ja näet, että hahmoelokuvaleike lähetetään oikeaan ruutuun, kuten teimme sen aiemmin.
Eikö sinulla ole laskinta? Katsotaan toimiiko: oikeaa nuolinäppäintä painettiin, dirx = 1, diry = 0. Etsi kehys. diry * 2 = 0. dirx + 0 + 3 = 1 + 3 = 4. Se näyttää kehyksen 4. Ja kehys 4 on paikka, johon laitoimme char_right -animaatiomme.
Seuraavat kaksi riviä asettavat hahmoelokuvaleikkeen _x/_y-ominaisuudet x/y-muuttujien arvoiksi.
Ja lopuksi palautamme “true”, jotta saamme muuttujan keyPressed oikean arvon.
Törmäys seiniin seuraa seuraavassa luvussa. Se on hauskaa 🙂
