Toistaiseksi olemme pitäneet pelimme tiukasti kaksiulotteisena. Tämä tarkoittaa, että jos jokin laatta on toisen laatan edessä, se pysyy edessä riippumatta siitä, mitä pelissä tapahtuu. Ja niille köyhille onnettomille taustalle sijoitetut laatat eivät koskaan pääse eturiviin. Onneksi takana olevien laattojen ja ehkä ei niin onneksi tällä hetkellä edessä olevien laattojen osalta, voimme muuttaa tilanteen. Jotta pelimme näyttäisi paremmalta, tuomme “syvyyden” luoden illuusion kohteista, jotka ovat lähempänä tai kauempana. Tässä on esimerkki (siirrä sankari saman mustan seinälaatan alle ja yläpuolelle):
Useita Flashin tasoja
Olen varma, että olet huomannut, kuinka jotkut Flashiin piirtämäsi asiat peittävät muita asioita. Jos objektit ovat samalla tasolla, myöhemmin piirtämäsi asiat sijoitetaan eteen. Voit myös muuttaa saman tason objektien järjestystä Muokkaa>>Järjestä-valikon “tuo eteen/lähetä taakse” -komennoilla.
Flash on myös ystävällisesti tarjonnut meille kerroksia. Tasot sopivat hienosti kohteiden järjestämiseen, kun piirrät jotain tasolle toisen kerroksen yläpuolelle, se jää aina toisen kerroksen objektien eteen.
Kuvassa sininen neliö ja punainen neliö on molemmat piirretty tasolle1. Sininen neliö piirrettiin viimeisenä, joten se on punaisen neliön edessä. Keltainen neliö on kerroksen 2 päällä ja koska kerros2 on kerroksen 1 yläpuolella, keltainen neliö kattaa sekä sinisen että punaisen neliön.
Seuraavassa kuvassa punaiset ja vihreät neliöt ovat elokuvaleikkeessä “mc1”, siniset ja keltaiset neliöt ovat elokuvaleikkeen “mc2” sisällä.
Sininen ja keltainen neliö peittävät aina punaisen ja vihreän, koska emo-mc2 on mc1:n yläpuolella. Elokuvaleikkeiden sisällä voit järjestää neliöiden järjestyksen, mutta et voi sijoittaa sinistä neliötä punaisen eteen ja samalla keltaista punaisen taakse.
Toistaiseksi kaikki katsomamme on sijoitettu suoraan Flash-ympäristöön. Kuten tiedät, laattapohjaisissa peleissä ei ole laattoja piirretty suoraan lavalla. Nonono, emme voi tehdä mitään niin yksinkertaista! Sen sijaan käytämme “attachMovie”-komentoa elokuvaleikkeiden sijoittamiseen lavalle dynaamisesti. attachmovie-komennolla on syntaksi
anyMovieClip.attachMovie(idName, uusinimi, syvyys);
Sen syntaksiin on jo kirjoitettu syvyys. Mikä on tarkalleen tuo “syvyys” sen syntaksissa? Kaikki, mitä piirrät suoraan vaiheessa, sijoitetaan tasolle _level0. Se on pisimmälle menevä. Kaikki dynaamisesti liittämäsi (käyttäen attachmovie-, duplicateMovieClip- tai loadMovie-sovellusta) sijoitetaan ylemmille tasoille, _level0:n yläpuolelle. Jatkossa käsittelemme vain lavalle liitettyjä elokuvapätkiä. Flashin muut tasot esitettiin vain muistin virkistämiseksi ja hämmennyksen lisäämiseksi.
Oikean syvyyden löytäminen
Kuvassa A sankari peittää osan seinästä, joten sankari näyttää olevansa lähempänä katsojaa kuin seinää, mutta kuvassa B osa seinästä peittää sankarin nostamassa sankaria kauemmaksi.
Mitä eroa näillä kahdella kuvalla on sankari-/seinäpeitekuvauksen lisäksi? Sankari ja seinä ovat samat. Seinä on samassa paikassa. Kyllä, sankari on siirtynyt ylöspäin. Nyt tulemme erittäin tärkeään johtopäätökseen: objekti liikkuu lähemmäksi, kun sen y-koordinaatti kasvaa. On myös syytä muistaa, että harkitsemme korkeampaa syvyyttä lähempänä katsojaa.
Kuinka voisimme muuttaa sankarin syvyyttä? Flashilla on komento sille: “swapDepths”. Voimme muuttaa minkä tahansa elokuvaleikkeen syvyyttä, kunnes tiedämme, mikä sen syvyyden tulisi olla. Yllä olevasta kuvasta voidaan sanoa, että useimmissa perustason kohteissa syvyys on sen y-koordinaatti:
mc.swapDepths(mc._y)
Koska meillä on rivejä laattoja, kaikki täsmälleen samassa y-koordinaatissa, meidän tulisi myös ottaa huomioon x-koordinaatit, sillä kahdella elokuvaleikkeellä ei ole samaa syvyyttä Flashissa. Jos vaihdatDepth-elokuvaleikkeen syvyyteen, jossa toinen elokuvaleike jo istuu, he vaihtavat syvyyttä (hm, siitä tulee nimi swapDepths), emmekä halua sitä.
mc.swapDepths(mc._y*movie_width+mc._x)
Vasemmassa yläkulmassa oleva laatta on kauimpana, laattojen syvyys kasvaa (ne ovat lähempänä) liikuttaessa oikealle ja alas.
z-lajittelu
z-lajittelu on hienompi nimi sille, mitä olemme tehneet tähän mennessä syvyyksien kanssa. Se tulee 3D-maailmasta, jossa jokaisella pisteellä on x-, y- ja z-koordinaatit. z-koordinaatti määrittää, kuinka lähellä tai kaukana piste on katsojasta. Teemme kaikista laatoistamme oikean syvyyden ja kun sankari liikkuu, muutamme sen syvyyttä sen mukaan, missä hän seisoo.
Varmista, että sekä laatoilla että sankarilla on rekisteröintipiste vasemmassa yläkulmassa. Piirrä osat, jotka haluat peittää muiden laattojen kanssa kohdistuskohdan yläpuolelle.
Ilmoitetaan nyt char-objekti:
char = {xtile: 2, ytile: 1, nopeus: 4, leveys: 20, korkeus: 20};
Leveyden ja korkeuden tulee olla ennalta määrättyjä, eikä niitä saa lukea käyttämällä _korkeutta, koska haluamme sankarin kävelevän osittain seinien yli.
Nyt buildmap-toimintoon:
function buildMap (kartta) {
_root.attachMovie(“tyhjä”, “laatat”, 1);
_root.tiles.attachMovie(“tyhjä”, “takaisin”, 0);
Kiinnitämme ylimääräisen elokuvaleikkeen laattoihin mc. Sinne sijoitamme kaikki maalaatat, jotka eivät voi mennä päällekkäin sankarin kanssa. Laatat, kuten seinät ja puut, jotka voivat olla myös sankarin edessä, sijoitetaan laatat mc suoraan. Koska “takaisin” -elokuvaleike on tasolla 0 “laattojen” mc:n sisällä, se on aina kaikkien muiden esineiden takana, mukaan lukien sankari, puut ja seinät. Ja kaikki “takaisin” -elokuvaleikkeen sisällä on myös kaikkien muiden esineiden takana, jotka on sijoitettu suoraan “laattoihin” mc.
Käytä tätä koodia laattojen luomiseen silmukassa:
var nimi = “t_”+i+”_”+j;
peli[nimi]= uusi peli[“Tile”+kartta[i][j]];
if(peli[nimi].kävelykelpoinen){
var clip=game.clip.back;
}muu{
var clip=game.clip;
}
peli[nimi].depth= i*peli.tileH*300+j*peli.tileW+1;
clip.attachMovie(“tile”, nimi, peli[nimi].depth);
leikkeen[nimi]._x = (j*peli.tileW);
leike[nimi]._y = (i*peli.tileH);
leike[nimi].gotoAndStop(peli[nimi].kehys);
Kun olemme luoneet laattaobjektin, tarkistamme, onko se kävelykelpoinen laatta (maatyyppi) ja jos on, asetamme sen takaosassa olevaan elokuvaotteeseen. Seuraavaksi laskemme laatan syvyyden. Lisäämme syvyyteen 1, jotta vältetään laatta kohdassa x=0, y=0 liitetään tasoon 0, jossa meillä on “takaisin” elokuvaleike. Jos sallimme tämän, “tile0_0” korvaisi “back”-elokuvaleikkeen.
Lasketaan nyt myös sankarin syvyys:
ob.depth=ob.y*300+ob.x+1;
game.clip.attachMovie(“char”, “char”, ob.depth);
Ja koska sankari muuttaa syvyyttään joka vaiheessa, lisää moveChar-funktion loppuun:
ob.depth=ob.y*300+ob.x+1;
ob.clip.swapDepths(ob.depth);
palauttaa (tosi);
Nyt joka kerta, kun moveChar-toiminto suoritetaan, kohteen syvyys päivitetään. Jos satut käyttämään muita liikkuvia kohteita, myös ne päivittäisivät syvyytensä oikeaan arvoon. Mutta jos lisäät liikkuvia objekteja, varmista, että niillä ei voi olla täsmälleen sama x/y-koordinaatti.
