On aika päästää irti näppäimistöstä ja napata tuo pieni karvainen esine pöydällesi. Ei sitä, tietokoneen hiiri. Vaikka sankarin liikuttaminen näppäimillä on hienoa ja sitä on tapahtunut jo pitkään, meidän pitäisi myös ymmärtää, miksi hiiri on niin suosittu. Hiiri on niin pirun kätevä, klikkaa tästä, klikkaa sieltä:
Ennen kuin hyppäämme hiiren päälle, yksi asia pitäisi tehdä selväksi. Toistaiseksi sankarimme on pystynyt liikkumaan pikselin täydellisesti, ei niin hiirellä. Hiiren ohjaus tarkoittaa myös, että sankari astuu yhden laatan keskeltä seuraavan keskelle, eikä hän voi pysähtyä jonnekin kahden laatan väliin, katsoa ympärilleen, viheltää hyvää sävelmää. Siirtyminen laatalta toiseen on paljon yksinkertaisempaa kuin pikselin täydellinen paikannus. Emme tarvitse törmäysten havaitsemista esimerkiksi, kun haluamme kävellä seuraavan laatan päällä, tarkistamme vain, onko se kävelykelpoinen, ja sitten se on onnellinen kävely, kunnes saavutamme keskustan.
Hiiren tekeminen
Piirrä suorakulmio, joka edustaa hiirtä, tee siitä elokuvaleike ja aseta sen linkin nimeksi “hiiri”. Varmista, että hiiren grafiikka on kohdistettu samalla tavalla kuin laatat – vasen yläkulma.
Kiinnitä nyt hiiri lavalle, kaikkien laattojen yläpuolelle. Kirjoita buildMap-funktiossa.
_root.attachMovie(“hiiri”, “hiiri”, 2);
Kaikki muu buildMap-toiminnossa pysyy ennallaan, joten en aio käydä sitä uudelleen läpi. Jotta hiiren osoitin päivittää sijaintinsa oikein, luo uusi funktio, jota kutsutaan työksi:
function work() {
game.xmouse=Math.round((_root._xmouse-game.tileW/2)/game.tileW);
game.ymouse=Math.round((_root._ymouse-game.tileH/2)/game.tileH);
_root.mouse._x=peli.xhiiri*peli.tileW;
_root.mouse._y=peli.hiiri*peli.tileH;
}
Laskemme ominaisuudet xmouse ja hiiri peliobjektissa, joka tietää missä hiiri on. Tarkemmin sanottuna laatan numero on ohi. Char-objektissa meillä oli samanlaisia ominaisuuksia nimeltä xtile ja ytile. Kaksi viimeistä riviä vie hiiren ruudun päälle.
Tätä toimintoa kutsutaan jokaisessa ohjaimen elokuvaleikkeen ruudussa lavalla:
onClipEvent (enterFrame) {
_root.work();
}
Koska emme käytä näppäimiä, voit poistaa detectKeys-toiminnon, jos sinulla on sitä jäljellä edellisestä luvusta.
Nyt kun hiiri liikkuu kuten pitääkin, lisäämme tavan klikata lavalla. Kirjoita tämä ohjaimeen mc:
onClipEvent (mouseUp) {
_root.getTarget();
}
Kun hiiren vasen painike vapautetaan, kutsumme funktiota getTarget. Käyttämällä leiketapahtumaa “mouseUp” kutsumme funktiota vain, kun hiiren painike vapautetaan, ei kun sitä painetaan. Jos haluat sen toisin, korvaa se mouseDown-tapahtumalla. Kirjoita getTarget-funktio:
function getTarget() {
if(peli[“t_”+peli.hiiri+”_”+peli.xhiiri].käveltävä){
peli.targetx=peli.xhiiri;
peli.targety=peli.hiiri;
char.moving=true;
}
}
Täällä varmistamme, että pelaaja todella napsauttaa kävelettävää ruutua. Tiedät kuinka pelaajat ovat, he napsauttavat kaikkialla ja kun kysyt heiltä kohteliaasti “Miksi jumalan nimessä sinun piti klikata siellä?”, he sanovat vain “En tiedä, näytti hyvältä paikalta”. Joka tapauksessa varmistamme, että he voivat edelleen napsauttaa missä tahansa haluavat, mutta toimintomme jättää huomioimatta kaikki ei-kävelykelpoisten laattojen napsautukset. Jos pelaaja kuitenkin jollain ihmeellä onnistuu napsauttamaan kävelettävää laatta, asetamme hiiren alla oleville laatoille ominaisuudet “targetx” ja “targety”. Ja asetamme muuttujan “char.moving” arvoon tosi.
Siirretään sankari oikealle laatalle
GetTarget-funktiossa asetimme muuttujan “moving” arvoon tosi ja niin kauan kuin muuttuja on tosi, sankarimme yrittää liikkua. Koska emme halua sankarin liikkuvan pelin alkaessa, aseta liikkuvan muuttujan arvoksi false char-objektissa:
char={xtile:2, ytile:1, speed:2, moveing:false};
Lisää koodia työn lopetustoimintoon:
var ob=char;
if (!ob.moving) {
ob.clip.char.gotoAndStop(1);
} muu {
liikkuaChar(ob);
ob.clip.char.play();
}
Kunnes liikkuva muuttuja on epätosi, sankari seisoo paikallaan eikä toista animaatioita. Mutta kun liikkuminen on totta, toistamme kävelyanimaatiota ja kutsutoimintoa liikuttaaksemme merkkiä. Älä huoli, sillä liikkuminen laatasta ruutuun on MoveChar-toimintomme paljon yksinkertaisempi:
function moveChar(ob) {
if((ob.x-game.tileW/2)%game.tileW==0 ja (ob.y-game.tileH/2)%game.tileH==0){
ob.xtile = Math.floor(ob.x/peli.tileW);
ob.ytile = Math.floor(ob.y/peli.tileH);
if(game[“t_”+ob.ytile+”_”+(ob.xtile+1)].walkable ja game.targetx>ob.xtile){
ob.dirx=1;
ob.diry=0;
}else if(game[“t_”+ob.ytile+”_”+(ob.xtile-1)].walkable ja game.targetx<ob.xtile){
ob.dirx=-1;
ob.diry=0;
}else if(game[“t_”+(ob.ytile+1)+”_”+ob.xtile].walkable ja game.targety>ob.ytile){
ob.dirx=0;
ob.diry=1;
}else if(game[“t_”+(ob.ytile-1)+”_”+ob.xtile].walkable ja game.targety<ob.ytile){
ob.dirx=0;
ob.diry=-1;
}muu{
ob.moving=false;
palata;
}
}
ob.y += ob.speed*ob.diry;
ob.x += ob.speed*ob.dirx;
ob.clip._x = ob.x;
ob.clip._y = ob.y;
ob.clip.gotoAndStop(ob.dirx+ob.diry*2+3);
}
Ensimmäinen rivi funktiossa tarkistaa, seisooko sankari parhaillaan laatan keskellä ja tämä tarkoittaisi, että hän on valmis liikkumaan, jos hän vain tiesi minne mennä ja miksi mennä sinne. X- ja y-paikka tarkistetaan modulo “%” avulla. Tämä pohjimmiltaan tarkistaa jäljellä olevan jakomerkkien sijainnin ruudun koon mukaan. Kun x ja y ovat laatan keskellä, jakamalla ne laatallaW, saadaan jäännös 0 ja alamme valita uuden suunnan.
Edistyneitä polunhakualgoritmeja on saatavana myös Flashille, pääasiassa A*. Useimmat niistä vievät paljon aikaa laskea polku pisteestä A pisteeseen B. Menetelmämme tässä on hyvin yksinkertainen eikä löydä polkuja, sankari liikkuu yhteen suuntaan kunnes se saavuttaa kohdekoordinaatin tai seinän. Sitten hän liikkuu pystysuunnassa samalla tavalla.
Jotta tiedät, mihin suuntaan kääntyä, katsotaanpa oikeaa päätöstä:
if(game[“t_”+ob.ytile+”_”+(ob.xtile+1)].walkable ja game.targetx>ob.xtile){
Tarkistamme, onko ruudulla, joka on 1 askeleen päässä nykyisestä heros-ruudusta, kävelykelpoinen ominaisuus asetettu tosi. Ja tarkistamme myös, napsautettiinko hiirtä suoraan sankarista.
Siinä kaikki tänään sankarin ohjaamisesta hiirellä.
Voit ladata lähdekoodin ja kaikki koodit ja elokuvat täältä.
