Voit tappaa vihollisia monin tavoin. Voit käyttää miekkaa, asetta tai sanoja (erittäin tehokas ase, jonka hallitseminen kestää kauan). Katsotaan kuinka voimme ampua vihollisen (käyttäkää SHIFT-näppäintä ampuaksesi):
Kun sanon “luoti”, tarkoitan mitä tahansa esinettä, joka lentää sankarilta, joka haluaa tappaa pahiksia. Se voi olla tykkipallo, nuoli, jäätelö, pingviini jne.
Ensinnäkin meidän pitäisi jälleen miettiä, mitä ammunta olettaa tekee ja miten luotimme käyttäytyvät. Kun näppäintä painetaan (SHIFT-näppäin), luotiobjekti ja elokuvaleike luodaan sankarin oikealle puolelle. Luodin pitäisi alkaa liikkua suoraan sankarin suuntaan. Jos luoti osuu seinään tai viholliseen, se tuhoutuu. Jos se osuu viholliseen, vihollinen myös tuhoutuu.
Luodin nopeuden tulee olla sankarin nopeutta suurempi, ellet halua antaa sankarille keinoa pysäyttää liikkuvia luoteja. Yleensä tyhmät viholliset eivät näe luoteja tulossa, mutta voit luoda vihollisia, jotka yrittävät välttää luoteja. Voit myös saada vihollisia ampumaan sankariin.
Valmistaudu ampumaan
Piirrä bullet-elokuvaleike ja varmista, että se viedään “bulletiksi”, jotta voimme kiinnittää sen lavalle. Bullet mc:n sisällä olevan grafiikan tulee olla kohdistettu keskelle.
Ilmoitetaan bullet-objekti:
peli.Bullet= funktio () {};
game.Bullet.prototype.speed=5;
game.Bullet.prototype.dirx=0;
game.Bullet.prototype.diry=-1;
game.Bullet.prototype.width=2;
game.Bullet.prototype.height=2;
Luodit liikkuvat nopeudella 5 pikseliä per rasti. Niiden leveys/korkeus on 2 pikseliä, mikä riittää viholliselle.
Nyt ominaisuudet dirx/diry saavat luodin liikkumaan. Ne ovat samoja asioita, joita käytimme moveChar-funktiossa. Jos dirx=1, luoti liikkuu oikealle, diry=-1 saa sen liikkumaan ylöspäin. Otamme itse asiassa dirx/diry-arvot char-objektista, mutta pelin alussa, kun merkkiä ei ole vielä siirretty, mutta pelaaja haluaa ampua, käytämme oletusarvoja saadaksemme luodin liikkumaan ylöspäin.
Lisää kaksi uutta ominaisuutta peliobjektiin:
peli={tileW:30, tileH:30, currentMap:1, bulletcounter:0};
peli.bullets= new Array();
Luotilaskuri laskee käyttämiemme luotien määrän ja auttaa antamaan jokaiselle uudelle luodille uuden nimen. Ensimmäinen luoti, jonka ammumme pelissä, on nimeltään bullet0, sitten bullet1 ja niin aina bullet100:aan asti. Sitten nollaamme luotilaskurin. Voisimme teoriassa antaa sen nousta ikuisesti, mutta kuka tietää, millaisia ikäviä asioita voi tapahtua silloin.
game.bullets taulukossa, joka sisältää viittauksen kaikkiin ympäriinsä lentäviin luodeihin. Alussa sen tyhjä joukko.
Lisää char-objektille shootspeed-ominaisuus, joka saa hänet pysähtymään laukausten välillä:
char={xtile:2, ytile:1, speed:4, shootspeed:1000};
Korkeampi ampumisnopeus tekee hiihtymisestä hitaampaa ja pienempi arvo nopeampaa. Arvo 1000 on tasan 1 sekunti laukausten välillä.
Jotta viholliset kuolisivat, meidän on poistettava heidät pelistä. Muuta vihollisten luontiosa buildMap-toiminnossa:
game.currentEnemies = [];
for (var i = 0; i<viholliset.pituus; ++i) {
var nimi = “vihollinen”+i;
peli[nimi]= uusi peli[“Vihollinen”+viholliset[i][0]];
peli[nimi].id=i;
peli.currentEnemies.push(peli[nimi]);
Ja korvaa rivi enemyBrain-funktiossa:
var nimi = “vihollinen”+i;
kanssa
var nimi = “vihollinen”+peli.nykyisetViholliset[i].id;
Käytämme currentEnemiesiä pitääksemme kaikkien lavalla olevien vihollisten nimet. Kun vihollinen tapetaan, poistamme hänet ryhmästä. Uusi ominaisuus “id” auttaa meitä tuhoamaan vihollisjoukkoon asetetun vihollisen esineen.
Lisää koodi detektioavaimet-toimintoon nuolinäppäimien tarkistamisen jälkeen:
if (Key.isDown(Key.SHIFT) ja getTimer()>ob.lastshot+ob.shootspeed) {
_root.shoot(ob);
}
Jos SHIFT-näppäintä painetaan ja on kulunut tarpeeksi aikaa, jotta sankari voi ampua uudelleen, kutsumme ammuntatoimintoa.
Lisää moveChar-funktion alkuun kaksi riviä nykyisen objektin suunnan tallentamiseksi:
ob.dirx=dirx;
ob.diry=diry;
Käytämme niitä määrittääksemme, mihin suuntaan luotimme liikkuvat.
Ampua
Luotien luomiseksi ja luotien antamiseksi kaikki tiedot, joita ne tarvitsevat onnistuneisiin tappaviin lentoihin, käytämme uutta toimintoa nimeltä “shoot”:
funktio ampua (ob) {
ob.lastshot=getTimer();
game.bulletcounter++;
if (game.bulletcounter>100) {
peli.bulletcounter=0;
}
var nimi = “bullet”+game.bulletcounter;
peli[nimi]= uusi peli.Bullet;
peli[nimi].id=peli.bulletcounter;
peli.bullets.push(peli[nimi]);
if (ob.dirx tai ob.diry) {
peli[nimi].dirx= ob.dirx;
peli[nimi].diry= ob.diry;
}
peli[nimi].xtile= ob.xtile;
peli[nimi].ytile= ob.ytile;
game.clip.attachMovie(“bullet”, nimi, 10100+game.bulletcounter);
peli[nimi].clip=peli.leike[nimi];
peli[nimi].x = (ob.x+peli[nimi].dirx*ob.leveys);
peli[nimi].y = (ob.y+peli[nimi].hakemisto*ob.korkeus);
peli.leike[nimi]._x = peli[nimi].x;
peli.leike[nimi]._y = peli[nimi].y;
}
Ensin olemme välittäneet objektin funktiolle. Tässä tapauksessa se on char-objekti, kuten shoot kutsuttiin detektioavaimet-toiminnosta, mutta jos vihollinen ampuisi luodin, vihollisobjekti ohitetaan.
Käytämme getTimer()-funktiota säästämään aikaas laukaus ammuttiin viimeisen laukauksen kiinteistössä.
Seuraavaksi lisäämme 1:n game.bulletcounter-ominaisuuteen ja jos se on >100, asetamme bulletcounterin takaisin arvoon 0.
Nyt luomme uuden bulletin käyttämällä bulletcounter-ohjelmaa antaaksemme uudelle luodille yksilöllisen nimen ja tallennamme myös tämän numeron bullet-objektiin. Lisäämme viittauksen uuteen luotiin game.bullets -taulukkoon.
If-ehto dirx/diry-toiminnolla tarkistaa, onko hiiltä siirretty. Jos pelaaja ei ole vielä siirtänyt merkkiä, char-objektilla ei ole dirx/diry-ominaisuuksia ja meillä on oletusdirx/diry bullet-mallista. Kuitenkin, jos merkkiä on siirretty, asetamme luotit dirx/diry vastaaviksi merkkien kanssa.
Jotta luoti näkyy merkin vieressä, meidän on tallennettava merkkien sijainti. ob.xtile ja ob.ytile kopioidaan luettelomerkkiin.
Koodin viimeinen osa luo luodille uuden elokuvaleikkeen, laskee sen sijainnin ruudulla ja asettaa sen sinne. Mielenkiintoinen osa saattaa olla kuinka luotien sijainti tarkalleen löydetään:
peli[nimi].x = (ob.x+peli[nimi].dirx*ob.leveys);
Ensin otamme merkin aseman (ob.x), jossa on merkin keskipiste. Koska luodit eivät yleensä tule ulos sankarin keskustasta, lisäämme siihen char-leveyden. Mutta koska leveys kerrotaan dirx:n arvolla, luoti sijoitetaan vasemmalle charista (dirx=-1), oikealle charista (dirx=1) tai keskelle (dirx=0). Saatat ihmetellä, ei keskustassa? Mutta kyllä, dirx voi olla 0 vain jos diry on joko 1 tai -1, joten luoti päätyy charin ylä- tai alapuolelle.
Tapa!
DetectKeys-funktion lopussa lisää rivi kutsumaan toista uutta funktiota, joka siirtää luodin ja katsoa, olemmeko tappaneet jotain:
_root.moveBullets();
Ja itse toiminto:
function moveBullets () {
for (var i = 0; i<peli.bullets.length; ++i) {
var ob=peli.bullets[i];
getMyCorners (ob.x+ob.speed*ob.dirx, ob.y+ob.speed*ob.diry, ob);
if (ob.downleft ja ob.upleft ja ob.downright ja ob.upright) {
moveChar(ob, ob.dirx, ob.diry);
} muu {
ob.clip.removeMovieClip();
poista peli[“bullet”+peli.bullets[i].id];
peli.bullets.splice(i,1);
}
for (var j = 0; j<peli.currentEnemies.length; ++j) {
var nimi = “vihollinen”+peli.nykyisetViholliset[j].id;
var obenemy = peli[nimi];
var xdist = ob.x – obenemy.x;
var ydist = ob.y – obenemy.y;
if (Math.sqrt(xdist*xdist+ydist*ydist) < ob.width+obenemy.width) {
obenemy.clip.removeMovieClip();
poista peli[“vihollinen”+game.currentEnemies[j].id];
game.currentEnemies.splice(j,1);
ob.clip.removeMovieClip();
poista peli[“bullet”+peli.bullets[i].id];
peli.bullets.splice(i,1);
}
}
}
}
Tämä toiminto käy läpi kaikki luettelomerkit luettelossa.
GetMyCornersin avulla tiedämme osuuko nykyinen luoti seinään vai ei. Jos mikään sen kulmista ei osu seinään, siirrämme luotia moveChar-toiminnolla.
Nyt jos luoti osuisi seinään, meidän on tuhottava se. Meidän on tehtävä kolme asiaa päästäksemme eroon luodista:
+ poista bullet mc (käyttäen removeMovieClipiä)
+ poista luettelomerkkiobjekti (poistotoiminnolla)
+ poista nykyinen luettelomerkki luettelosta.
Voisimme jättää luotiobjektin peliin, koska sen ilman elokuvaleikettä et näe sitä ja luotijoukosta poistettuna siihen ei enää päästä käsiksi, mutta sitten 100 luodin jälkeen peli näyttää romutelalta. Ei ole mukavaa jättää roskia taaksesi.
Kun olemme onnistuneesti siirtäneet luotia eikä se ole vielä osunut seinään, alamme tarkistaa, onko se osunut johonkin viholliseen. Kiertelemällä läpi kaikki currentEnemies-taulukon viholliset, laskemme nykyisen luodin ja nykyisen vihollisen välisen etäisyyden. Jos he pääsevät liian lähelle, tuhoamme ne molemmat.
Jos haluat vihollisten kuolevan ikuisesti, mikä tarkoittaa, että ne eivät nouse henkiin poistuttuaan kartalta ja palattuaan, aseta 1 rivi etäisyyslaskennan jälkeen:
myEnemies[game.currentMap][obenemy.id]=0;
Voit tehdä ampumisesta mielenkiintoisempaa usealla tavalla:
+ rajoittaa käytettävissä olevien luotien määrää. Voit asettaa muuttujan alussa ja joka kerta kun luoti ammutaan, pienentää sitä yhdellä, sallien ampumisen vain, jos se on >0.
+ rajoita vain 1 luoti lavalle. Voit tehdä tämän tarkistamalla game.bullets ja jos sen pituus on >0, älä salli ampumista.
+ saada viholliset myös ampumaan luoteja. Olisi helppoa saada ne ampumaan satunnaisina aikoina satunnaisiin suuntiin, samalla tavalla kuin ne muuttavat liikettä.
+ Tee erilaisia aseita, joista valita. Voit ilmoittaa useita luotimalleja ja määrittää kullekin eri vahinkoarvot, jotta voit saada parempia aseita ja tappaa vihollisia nopeammin.
Hyvää ammuntaa 🙂
Voit ladata lähdekoodin ja kaikki koodit ja elokuvat täältä.
Kuvaus hyppäämällä sivulta:
Lähde fla sivunäkymä jumpperiin tästä.
Bugikorjaus 20.12.2003. MoveBullets-funktiossa rivi:
var nimi = “vihollinen”+j;
pitäisi olla
var nimi = “vihollinen”+peli.nykyisetViholliset[j].id;
Jos näet vanhan version jossain, korjaa se. Kiitos Christianille ja Travisille vian löytämisestä.
Bugikorjaus 1.03.2004. EnemyBrain-funktiossa rivi:
var nimi = “vihollinen”+i;
pitäisi olla
var nimi = “vihollinen”+peli.nykyisetViholliset[i].id;
Tyhmä minä 🙁 Kiitos Ianille, että huomautit asiasta.
