Hyppääminen

Home » Blogi » Hyppääminen

Käännetään pelimme ylhäältä sivunäkymään, jotta voimme lisätä hyppäämistä. Tässä esimerkissä katsomme peliä sivulta ja sankarimme voi kävellä vasemmalle ja oikealle nuolinäppäimillä. Hän pystyy myös hyppäämään välilyöntinäppäimellä. näin:

Hyppäämisen perusteet

Jokainen hyppy alkaa punnerruksella. Kuten muistat, Flash-vaiheessa y-koordinaatti pienenee. Joten laskemme uusi_y=nykyinen_y-hyppynopeus. Jos teemme sen vain kerran, niin sankari liikkuu hyppynopeudella ylöspäin ja pysähtyy siihen. Kyllä, meidän on jatkettava uuden y-paikan laskemista niin kauan kuin sankari hyppää, mutta meidän on myös muutettava hyppynopeutta tai sankarimme vain lentää taivaalle eikä koskaan palaa.

Hyppynopeuden muuttamiseen julistamme uuden muuttujan “painovoima”. Painovoima vetää sankaria takaisin maahan, se on alas. Jokaisessa vaiheessa lisäämme painovoiman hyppynopeuteen: jumpspeed=hyppynopeus+painovoima. Voit muuttaa painovoiman arvoa, kun vähennät painovoimaa, sankari lentää korkeammalle (ilmapallotyyppi), kun lisäät painovoimaa, sankari ponnahtaa alas nopeammin (kivityyppinen). Koska meillä on paljon esineitä ja hahmo on myös esine, voit itse asiassa antaa eri painovoiman eri esineille.

Katsotaanpa yksi esimerkki. Hyppynopeuden aloitusarvo on -10 ja painovoima on 2. Ensimmäinen askel, sankaria siirretään ylöspäin 10 pikseliä ja hyppynopeus saa arvon 8. Seuraava askel, 8 ylöspäin, nopeus=6. Muutaman askeleen jälkeen hyppynopeus saa arvon 0, mikä tarkoittaa, että sankari ei enää nouse. Seuraavan askeleen hyppynopeudella on positiivinen arvo ja sankari alkaa liikkua alaspäin.

Mutta mitä tehdä, kun sankari osuu kiinteään laattaan (seinään) hyppääessään. Jos sankari hyppää ylös ja osuu seinän yläpuolelle, asetamme hyppynopeudeksi 0 ja sankari alkaa pudota. Jos sankari osuu kiinteään laattaan alla, hän on laskeutunut ja hyppy on ohi.

Laattapohjaisessa pelissä on aina tärkeää, ettei nopeus saa kasvaa laatan kokoa suuremmaksi. Jos sankarilla on liian suuri nopeus, hän ei tarkista seuraavaa ruutua ja saattaa liikkua seinien läpi. Vaikka jotkut taikurit voivat liikkua seinien läpi, normaalissa pelissä se on vain virhe.

Kuten näet, hyppääminen ei vaikuta vaakasuoraan liikkeeseen. Se tehdään edelleen täsmälleen samalla tavalla kuin ennenkin. Meidän täytyy vain tarkistaa sankarin siirtämisen jälkeen vasemmalle/oikealle, onko hän kävellyt pois alla olevasta kiinteästä laatasta ja saattaa alkaa pudota.

Ole sankarini

Lisäämme hahmoomme joitain ominaisuuksia:

char={xtile:2, ytile:1, speed:4, jumpstart:-18, gravity:2, jump:false};

Kiinteistön nopeus määrittää nopeuden liikuttaessa vasemmalle tai oikealle. Jumpstart on hyppynopeuden aloitusarvo. Painovoima vetää sankarin takaisin maahan ja ominaisuuden “hypyä” käytetään tarkistamaan, hyppääkö sankari parhaillaan (sitten hyppää = totta) vai seisoo/kävelee/juoksee/istuo/taistelee kiinteällä alustalla (hyppy=false).

Seuraava muutettava rivi on buildmap-funktiossa, kun asetamme sankarin aloituspaikan. Aikaisemmissa esimerkeissä asetimme sankarin laatan keskelle, mutta se näyttää oudolta, koska sankari alkaa aina kaatua uuden kartan luomisen jälkeen. Panemme sankarin seisomaan aloitusruudun alareunaan (älä unohda siirtää tätä riviä char.heightin ilmoittavan rivin jälkeen):

char.y = ((char.ytile+1)*game.tileH)-char.height;

Functions changeMap ja getMyCorners eivät tarvitse muutoksia.

Anna minulle siivet

Aloitetaan detektioavaimet-toiminnolla. Meidän on lisättävä koodi tarkistaaksemme välilyöntinäppäimen, ja voimme poistaa ylös/alas-nuolinäppäimet.

function detectKeys() {

var ob = _root.char;

var keyPressed = false;

if (Key.isDown(Key.SPACE) ja !ob.jump) {

ob.jump = tosi;

ob.jumpspeed = ob.jumpstart;

}

if (Key.isDown(Key.RIGHT)) {

keyPressed=_root.moveChar(ob, 1, 0);

} else if (Key.isDown(Key.LEFT)) {

keyPressed=_root.moveChar(ob, -1, 0);

}

if (ob.jump) {

keyPressed=_root.jump(ob);

}

if (!keyPressed) {

ob.clip.char.gotoAndStop(1);

} muu {

ob.clip.char.play();

}

}

Huomaa, kuinka emme anna hahmon hypätä uudelleen, kun hän jo hyppää (!ob.jump). Välilyönti lasketaan uuden hypyn aloittamiseen vain, jos muuttujan hyppy on epätosi. Mutta jos välilyöntinäppäintä painetaan ja sankari ei vielä hypännyt, asetamme muuttuvan hypyn arvoon tosi ja annamme sankarille aloitusnopeuden.

Vasemman/oikean nuolinäppäimen jälkeen tarkistetaan onko muuttujan hyppy tosi ja jos on, kutsumme uutta “hyppy”-funktiota (funktio “jump” ei ole sama asia kuin muuttuja “hyppy”, huono nimivalinta minulta, anteeksi ). Tätä toimintoa kutsutaan joka askeleella, kunnes muuttujahyppy on tosi, joten sankarimme jatkaa hyppäämistä myös välilyöntinäppäimen vapauttamisen jälkeen.

Hyppytoiminto lisää painovoimaa nykyiseen hyppynopeuteen. Sen jälkeen se tarkistaa, onko hyppynopeus kasvanut liian suureksi ja jos on, asettaa nopeudeksi ruudun koon, jota on vähennetty merkin korkeudella. Viimeiset rivit kutsuvat moveChar-funktiota:

function hyppy (ob) {

ob.hyppynopeus = ob.hyppynopeus+ob.gravity;

if (ob.jumpspeed>game.tileH-char.height) {

ob.jumpspeed = peli.tileH-char.height;

}

if (ob.hyppynopeus<0) {

liikkuaChar(ob, 0, -1, -1);

} else if (ob.jumpspeed>0) {

liikkuaChar(ob, 0, 1, 1);

}

palauttaa (tosi);

}

Meidän on myös muutettava moveChar-toimintoa. Aiemmissa luvuissa käytimme ob.speed-funktiota objektien sijainnin vaihtamiseen, mutta nyt meillä on myös hyppynopeus, joka muuttuu joka askeleella. Muuta moveChar-funktion alkua:

function moveChar(ob, dirx, diry, hyppy) {

if (Math.abs(jump)==1) {

nopeus=ob.hyppynopeus*hyppy;

} muu {

nopeus=ob.nopeus;

}

Hyppyargumentti on 1 tai -1 vain, jos moveChar-funktiota kutsutaan hyppyfunktiosta ja sitten muuttuvalla nopeudella on arvo hyppynopeudesta. Kun sitä kutsutaan vasemmalla/oikealla näppäimellä, tunnistusmuuttuva nopeus on yhtä suuri kuin ob.speed. Muuta aiemmin muuttujaa ob.speed käyttäneiden moveChar-funktioiden rivit “speediksi”, jotta käytetään oikeaa arvoa.

Nousevassa koodissa muutamme hyppynopeuden nollaan, jos osumme yllä olevaan seinään:

ob.y = ob.ytile*game.tileH+ob.height;

ob.hyppynopeus = 0;

Ja alaosassa asetamme hyppyn arvoon false, jos havaitsemme seinän alla:

ob.y = (ob.ytile+1)*game.tileH-ob.height;

ob.jump = false;

Vasemmalle ja oikealle liikkeelle lisäämme rivin tarkistamaan tilanteen, kun sankari kävelee laiturin reunan yli ja sen pitäisi alkaa pudota:

ob.x += nopeus*dirx;

pudota (ob);

Joten viimeinen uusi toiminto, jota tarvitsemme, on syksy:

function fall (ob) {

if (!ob.jump) {

getMyCorners (ob.x, ob.y+1, ob);

if (ob.downleft ja ob.downright) {

ob.hyppynopeus = 0;

ob.jump = tosi;

}

}

}

Emme voi alkaa kaatumaan, jos olemme jo hyppäämässä, joten tarkistamme ensin, onko muuttujahyppy väärä (sankari seisoo tällä hetkellä). Jos seisomme, kutsumme getMyCorners-funktiota saadaksemme sankarin kulmapisteet. Käytämme koordinaattia ob.y+1 tarkistaaksemme, onko pisteen 1 pikseliä pienempi kuin merkkien nykyinen sijainti käveltävissä. Jos molemmat kulmapisteet sankarin alla (alas ja alas) ovat käveleviä (on arvo tosi), se tarkoittaa, että rakas sankarimme seisoo ilmassa.

Korjataksemme “sinä-ei-seiso-ilmassa” -tilanteen pakotamme sankarin hyppäämään asettamalla muuttujan jump=true. Mutta toisin kuin välilyöntinäppäintä painettaessa, asetamme hypyn aloitusnopeudeksi 0, joten sankari alkaa pudota.

Bugikorjaus 16.01. Olen päivittänyt maksimihyppynopeuden säätimen hyppytoiminnossa. Korjatun koodin pitäisi olla

if (ob.jumpspeed>game.tileH-char.height) {

ob.jumpspeed = peli.tileH-char.height;

}