Rinteet

Home » Blogi » Rinteet

Tällä kertaa katsotaan kuinka rinteitä lisätään:

Monet ihmiset ovat kysyneet minulta “Kuinka saan sankarini kävelemään kaltevilla laatoilla?”. Ja minä yleensä vastaan ​​”Miksi ihmeessä haluat sankarisi kävelevän kaltevilla laatoilla? Etkö ole tyytyväinen suorakaiteen muotoisiin laattoihin? Eikö sankarisi voi vain hypätä korkeampien laattojen päälle?” Ja sitten he sanovat “Ei, minulla on täytynyt olla kalteva laatta”.

Rinne antaa sankarimme nousta korkeammalle (tai alemmalle) korkeudelle yksinkertaisesti kävelemällä oikealle (tai vasemmalle) hyppäämättä (tai putoamatta). Joten kaltevuus, josta puhumme, yhdistää 2 laatta, joilla on eri korkeus:

Kun vasemman kuvan sankari haluaa jatkaa liikkumista oikealle, hänen on hypättävä korkeammalle laatalle. Mutta kaltevuuden ansiosta oikean kuvan sankari ei ole pakotettu hyppäämään. Toki, jos sankarimme on hyppääjätyyppinen sankari, hän voisi silti hypätä oikeaan kuvaan, mutta normaalit sankarit ovat erittäin onnellisia, jos he voivat välttää hyppäämisen.

Ongelmia

Heti kun haluamme lisätä viistolaattoja, kohtaamme useita ongelmia (lyön vetoa, ettet odottanut mitään ongelmia). Ensinnäkin sankarin sijoittaminen kaltevalle laatalle. Jos muistat, sankarimme on pohjimmiltaan suorakulmio, kaikki liikkeet ja törmäykset perustuvat hänen kulmapisteisiinsä. Emme voi käyttää samaa ideaa rinteessä, koska useimmat sankarit päätyvät seisomaan rinteessä ilman, että heidän jalat koskettaisivat maata. Sen sijaan meidän on asetettava sankarin keskus kaltevalle maalle ja siirrettävä osa sankarista maan sisään.

Seuraavaksi pelimme rinteiden tulee aina olla laatan yhdestä kulmasta vastakkaiseen kulmaan ja sinun tulee olla varovainen, kuinka rinteet sijoitat. Et voi tehdä rinteitä jollain muulla kulmalla tai muodolla, etkä voi tehdä outoja karttoja rinteillä.

Koodataan se

Aloita opetusohjelman 7 Jumping koodilla.

Ilmoita uudet laattojen prototyypit:

peli.Tile4= funktio () {};

game.Tile4.prototype.walkable=true;

peli.Tile4.prototype.slope=1;

game.Tile4.prototype.frame=4;

peli.Tile5= funktio () {};

game.Tile5.prototype.walkable=true;

peli.Tile5.prototype.slope=-1;

game.Tile5.prototype.frame=5;

Tile4:n kaltevuus liikkuu ylöspäin (/) ja laatta5:n kaltevuus liikkuu alaspäin (\). Piirrä kaltevuus kehyksiin, jotka olet asettanut kehyksen ominaisuudella.

Uudet toiminnot ovat niin mukavia asioita. Ne ovat tuoreita, tuoksuvat hyvältä ja tekevät asioita, joita et koskaan voisi tehdä. Tehdään checkForSlopes-toiminto:

function checkForSlopes (ob, diry, dirx) {

if (peli[“t_”+(ob.ytile+1)+”_”+ob.xtile].kaltevuus ja !ob.hyppy){

ob.ytile += 1;

ob.y += peli.tileH;

}

if (peli[“t_”+ob.ytile+”_”+ob.xtile].kaltevuus ja diry != -1){

if (diry == 1){

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

}

var xpos = ob.x-ob.xtile*game.tileW;

ob.onSlope = peli[“t_”+ob.ytile+”_”+ob.xtile].slope;

ob.jump = false;

if(peli[“t_”+ob.ytile+”_”+ob.xtile].kaltevuus == 1){

ob.addy = xpos;

ob.clip._y = (ob.ytile+1)*game.tileH-ob.height-ob.addy;

}muu{

ob.addy = game.tileW-xpos;

ob.clip._y = (ob.ytile+1)*game.tileH-ob.height-ob.addy;

}

}muu{

if((ob.onSlope == 1 ja suunta == 1) tai (ob.onSlope == -1 ja suunta == -1)){

ob.ytile – = 1;

ob.y – = peli.tileH;

ob.clip._y = ob.y;

}

ob.onSlope = false;

}

}

Tämä toiminto kutsutaan moveChar-funktiosta liikemuuttujilla dirx ja diry. Ensin if-lause tarkistaa nykyisen ruudun alapuolella olevan laatan kaltevuuden. Tämä on tilanne, jossa sankari seisoo tällä hetkellä kävelemättömällä laatalla, mutta liikkuu vasemmalle tai oikealle ja hänen nykyiseltä korkeudeltaan laskeutuu rinne. Jos sankarin alapuolella on kaltevuus, lisäämme ytileä ja y:tä. Emme kuitenkaan tarkista sitä, jos sankari hyppää.

Seuraavaksi jos lauseke tarkistaa laattasankarin kaltevuuden tällä hetkellä on. Diry!=-1 osa jättää tarkistuksen huomioimatta, jos SPACE-näppäintä on painettu ja sankari hyppää ylös.

Jos olisimme kaatumassa (diry==1), asetamme y-ominaisuuden ikään kuin sankari olisi laskeutunut alla olevalle laatalle. Asetamme hyppyominaisuuden arvoksi false ja onSlope-ominaisuuden, joka on yhtä suuri kuin nykyisen ruudun kaltevuusarvo (1 tai -1).

xpos on arvo, kuinka kaukana sankarimme nykyisen ruudun vasemmasta reunasta on:

Jos kaltevuus nousee, siirrämme sankaria ylöspäin xpos-arvon verran, jos se laskee, niin tileW-xpos-arvon verran. Huomaa, että jos et käytä neliön muotoista ruutua, sinun on löydettävä xpos prosentteina tileW:stä.

Viimeinen osa muun jälkeen tarkistaa, seisoimmeko rinteessä, mutta nyt olemme siirtyneet siitä korkeammalle laatalle.

Ota seuraavaksi moveChar-toiminto. Muokkaa sekkiä vasemmalle ja oikealle siirtymistä varten:

//vasen

if ((ob.downleft ja ob.upleft) tai ob.onSlope) {

//oikein

if ((ob.upright ja ob.downright) tai ob.onSlope) {

Tässä ohitamme periaatteessa kaikki törmäystarkastukset vasemmalle/oikealle liikkeelle niin kauan kuin sankari on rinteessä. Muista, että rinteessä hän seisoo osittain seinän sisällä, joten emme voi käyttää normaalia törmäystä hänen kulmiinsa.

Kun olet sijoittanut sankarielokuvaleikkeen, kutsu checkForSlopes-toiminto:

ob.clip._x = ob.x;

ob.clip._y = ob.y;

checkForSlopes(ob, diry, dirx);

Kun hyppäämme seisten rinteessä, meidän on päivitettävä sankarin y-koordinaatti. Muokkaa detectKeys-toimintoa:

if (Key.isDown(Key.SPACE)) {

if (!ob.jump){

//jos olimme rinteessä, päivitä

if (ob.onSlope) {

ob.y -=ob.addy;

ob.ytile = Math.floor(ob.y/peli.tileH);

}

ob.jump = tosi;

ob.jumpspeed = ob.jumpstart;

}

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

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

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

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

}

Jos sankarin onSlope-ominaisuuden arvo on tosi, päivitämme ensin sen y-ominaisuuden ja laskemme ytilelle uuden arvon.