Naše vlastní flashová hra Létající panda, kterou si zhotovíme, nám pomůže k vysvětlení dalších matematických funkcí Flashe počínaje na intervalech založeném generování náhodných čísel a zaokrouhlování konče.
Nyní si projdeme akce naší pandy. Základními budou ty z minulého týdne, které ovládají pomocí sinu a cosinu směr pohybu. Pokud jsme naše hodnoty pro změnu pozice autíčka minule zvětšovali vždy násobením trojkou, dnes tento akcelerační koeficient budeme určovat sami a odvodíme podle toho rychlost pohybu pro naše hlavního hrdinu.
Popíšeme si tedy tento kód, pokud uživatel stlačí šipku doleva nebo doprava, manipuluje se proměnnou rotace, která určuje směr jízdy. Při stisku šipky nahoru nebo dolu zase měníme proměnnou speed, která slouží k určením rychlosti pohybu pandy. Maximální možné kladné i záporné hodnoty koeficientu rychlosti jsou 15. Pokud je koeficient větší jak nula, pohybuje se panda ve stanoveném směru, při koeficientu menším jak nula naopak panda couvá v příslušné rychlosti.
Hlavní kód
Protože hlavní kód hry by byl na náhledové dokumentování příliš zdlouhavým řešením, budeme si ho prezentovat popisky v kód formou komentářů:
onClipEvent (load) {
starthry = getTimer(); // uložíme si do proměnné čas začátku hry
}
onClipEvent (keyDown) {
if (Key.isDown(Key.LEFT)) {
rotace -= 10; // zahýbání doleva
} else if (Key.isDown(Key.RIGHT)) {
rotace += 10; // zahýbání doprava
} else if (Key.isDown(Key.UP)) {
if (speed<15) {
speed += 0.5; //zvětšení rychlosti dopředu
}
} else if (Key.isDown(Key.DOWN)) {
if (speed>(-15)) {
speed -= 0.5; //zvětšení rychlosti dozadu
}
}
}
onClipEvent (enterFrame) {
if (konec != 1) { //pokud není konec
if ((this._x<25) or (this._y<25) or (this._x>375) or (this._y>375)) {
speed = 0.5;
} //když se dostaneme do hranice obrazovky, sníží se rychlost na minimum
if (this.hitTest(_root.flakota) == true) { //kontrola sebrání kusu masa, pokud ho sebereme, vygeneruje se jinde jeho pozice a zvětší se skóre
_root.flakota._visible = false; // zneviditelníme maso
snezeno += 1; // zvýšíme skóre
_root.skore = snezeno; // vypíšeme skóre
ycko = Math.random()*350+25; //náhodně vygenerujeme pozici Y v mezích obrazovky
xko = Math.random()*350+25; //náhodně vygenerujeme pozici X v mezích obrazovky
_root.flakota._y = ycko; // přiřadíme pozici Y
_root.flakota._x = xko; // přiřadíme pozici X
_root.flakota._visible = true; // zviditelníme maso
}
yzmena = (math.cos((math.PI/180)*rotace))*speed; // provedeme pohyb pandy ve směru Y
xzmena = (math.sin((math.PI/180)*rotace))*speed; // provedeme pohyb pandy ve směru X
_root.xko = this._x; // vypíšeme si pozici X pandy
_root.yko = this._y; // vypíšeme si pozici Y pandy
_root.masoxko = _root.flakota._x; // vypíšeme si pozici X masa
_root.masoyko = _root.flakota._y; // vypíšeme si pozici X masa
_root.speed = speed; // vypíšeme rychlost pandy
setProperty (this, _y, this._y-yzmena); // změníme pozici Y pandy
setProperty (this, _x, this._x+xzmena); // změníme pozici X pandy
setProperty (this, _rotation, rotace); // změní nasměrování pandy
hodnotacasu = 30-(Math.round((getTimer()-starthry)/10)/100); // od aktuálního času odečteme čas začátku hry, nakonec zaokrouhlené upravené číslo odečteme od 30 a získáme zbývající herní čas
if (hodnotacasu<0.01) { // kdy skončit hru
_root.time = 0; // vynuluje čas
_root.panda._visible = false; // zneviditelníme pandu
_root.flakota._visible = false; // zneviditelníme maso
_root.gotoAndPlay(3); // přejdeme na snímek 3
konec = 1; // proměnná konec je 1 (pokud bychom nechtěli používat snímek 3 a pracovali pouze na snímku 2 se hrou, šlo by takto upravit herní přestávku apod.)
} else {
_root.time = hodnotacasu; // pokud hra pokračuje, vypíšeme čas
}
}
}
Nyní jsme si v praxi ukázali řadu užitečných triků, od využití počítání času pomocí funkce getTimer() až po generování náhodných čísel pomocí funkce random(). Nyní si dokončíme snímek 2 tím, že při načtení masa do filmu se vygeneruje jeho pozice (toto geneorvání by šlo spojit do jedné funkce a tu pak používat i v v hlavním kódu hry formou volání, takto by šel kód dále zpřehledňovat):
onClipEvent (load) {
_root.flakota._visible = false;
snezeno += 1;
_root.skore = snezeno;
ycko = Math.random()*350+25;
xko = Math.random()*350+25;
_root.flakota._y = ycko;
_root.flakota._x = xko;
_root.flakota._visible = true;
}
Snímek 3
Na snímku 3 nabídneme možnost začít znovu hrát hru a vypíšeme herní skóre, které bylo právě nahráno:
_root.konec.final.result = "Dohrál jsi!\nA kolik nám panda snědla stejků?\n "+_root.skore+" !";
stop ();
V tomto případě je textové pole result umístěno navíc ve dvou klipech, abychom je mohli animovat a pak pohodlně umístit na scénu. Znaky „\n“ oddělují při výpisu hlášky nový řádek. Při založení nové hry použijeme tento kód pro vynulování klíčových hodnot hry a vygenerování nové pozice masa:
on (release) {
speed = 0;
snezeno = 0;
_root.skore = 0;
gotoAndPlay (2);
_root.flakota._visible = false;
snezeno += 1;
_root.skore = snezeno;
ycko = Math.random()*350+25;
xko = Math.random()*350+25;
_root.flakota._y = ycko;
_root.flakota._x = xko;
_root.flakota._visible = true;
}
Dnešní příklad si určitě rádi stáhnete a neméně rádi prohlédnete :)
Příště se podíváme …
… třeba na řazení informací formou polí.