Souboj

Než začneme střílet druhým panáčkem, doplníme script pro střelu prvního panáčka o příkazy, které se vykonají v případě zasažení druhého panáčka. Do scriptu pro kula_1 třeba na konec (před poslední složenou závorku) doplníme:
// kolize s panakem - trefime ho
if (this.hitTest(_root.panak2) && _root.akce_2.zijeme)
{
_root.panak2.gotoAndPlay(44); // zacne prehravat panakovu smrt, bude-li čas, klip si doplň
_root.akce_2.zijeme = 0; // panak 2 po kolizi s kulkou nebude zit
removeMovieClip(this); // odstranime danou kulku
}

V této části scriptu se kontroluje kolize kula_1 s panak2 a zároveň, zda panak2 žije (aby se nepřičítaly zásahy než panak2 znovu "ožije"). Teď už můžeme vytvořit klip kula_2 pro druhého panáka stejným způsobem jako jsme vytvořili klip akce_2. Stačí zkopírovat a vložit klip kula_1 a přejmenovat ho, vložit do něj script z klipu kula_1. Ve scriptu je potřeba přepsat akce_1 na akce_2 a naopak panak2 na panak1. V tuto chvíli by měl panak2 umět střílet, vyzkoušejte si. Další problém, který je potřeba vyřešit, je chování panáka po zásahu (smrti). Do klipu akce_1 doplníme dvě proměnné, jejichž význam je jasný z jejich názvu: - zijeme (=1 když žijeme, =0 když jsme zasaženi) - prave_obnovili (=1 když jsme se právě obnovili buď při startu nebo po zasažení) Při onClipEvent(load) do obou uložíme jedničku, při onClipEvent(enterFrame) provádíme všechny dosavadní akce (pohyb, skok, střelba) jestliže žijeme. Jestliže nežijeme (else k if(zijeme) úplně na konci scriptu), zvětšujeme proměnnou obnoveni do deseti - chvíli se čeká, než se panák znovu objeví. Raději ukážeme celý script akce_1 (v klipu akce_2 jsou obdobné změny):
onClipEvent(load)
{
rychlost = 5; // rychlost chozeni
zijeme = 1; // hned ze zacatku mame statut zijiciho
prave_obnovili = 1; // pri loadu se logicky "prave obnovime"
}

onClipEvent(enterFrame)
{

if (zijeme)
{
///////////////
// ZAKLADNI NASTAVENI
///////////////
if (prave_obnovili)
{// vytvoreni panaka
obnoveni = 0; // pomocna promenna pri obnovovani (po smrti se zacne pricitat, dokud se neobnovime)
duplicateMovieClip(_root.panak_l, "panak1", 1); // inicializacni vytvoreni hrace 1
_root.panak1._x = 200; // x ova souradnice panaka
_root.panak1._y = 180; // y ova souradnice panaka
// inicializacni hodnoty pro HRACE 1 //////////////////////////////////////////
otacime = 1; // promenna, jenz nam kontroluje, zda jsme otoceni do prava nebo do leva (1 = otoceni doleva, 2= otoceni doprava)
vg = 0; // gravitacni rychlost dolu
skaceme = 0; // uz zase neskaceme

nedrzime_strelbu = 1; // Je P zmacknuto? 1 = ze neni a tudiz jej muzeme zmacknout
k = 0; // pomocna promenna pri vytvareni strel
prave_obnovili = 0; // uz jsme se obnovili, takze uz nemuzeme byt "prave obnoveni"
}
/////////////////// 
// Strileni hrace 1
//////////////////
if ((Key.isDown(80)) && (nedrzime_strelbu)) // jestlize zmackneme P, tak strelime
{ 
nedrzime_strelbu = 0; // drzime tlacitko pro strelbu 
duplicateMovieClip(_root.kula_1, "kula_1"+k, k + 80);
setProperty("_root.kula_1"+k, _y, _root.panak1._y-16); 	

if (otacime == 2) // jestlize jsme otoceni doprava
setProperty("_root.kula_1"+k, _x, _root.panak1._x + 30);
else // takze jsme otoceni doleva
setProperty("_root.kula_1"+k, _x, _root.panak1._x - 30);	
k++; // pricteme do promenne K +1, ukladame zde, kolikata strela byla vystrelena
if (k >= 20) // jestlize vytvorime vice jak 20 strel, zacneme je prepisovat jimy samotnymi
k = 0; // vynulujeme K
}

else if (!Key.isDown(80)) // jestlize nedrzime P
nedrzime_strelbu = 1; // uz nedrzime tlacitko pro strelbu P	
	
	
p_x = _root.panak1._x; // x-ova pozice hrace
p_y = _root.panak1._y // y-ova pozice hrace
////////////
// PADANI HRACE 1
///////////
if (!stojime) // jestlize nestojime, tak padame :]
{
dopadl = 1; // dopadl uvedeme na true, aby nektera plosina mohla zavolat jednorazovou akci spojenou s dopadem
vg += 0.6; // pricitani gravitacni rychlosti dolu
_root.panak1._y += vg; // padani panaka
}
stojime = 0; // stojime uvedeme vzdy na false, protze kdyz nestojime, tak abychom zacali automaciky padat. 

//////////
// SKAKANI HRACE 1 
/////////
if (Key.isDown(79) && muzeme_skocit && !drzime_skok) // jestlize zmackneme O a muzeme_skocit je true a kdyz "nedrzime klavesu pro skok"
{drzime_skok = 1; // drzime tlacitko pro skok
muzeme_skocit = 0; // Jestlize jsme jiz vyskocili, tak jiz skocit nemuzeme, dokud zase nedopadneme
skaceme = 1; // skaceme je true, protoze diky teto hodnote se budeme pohybovat nahoru
rych_skoku_nahoru = rychlost*2.5; // vypocitame rychlost skoku nahoru
}
if (skaceme) // v predchozim kroku jsme vyskocili, nyni se dusledkem vy skoku pohybujeme nahoru
{
_root.panak1._y -= rych_skoku_nahoru; // pouze pohyb hrace nahoru, jeho padani mame zajisteno v sekci Padani
}
if(!Key.isDown(79)) // az jak pustime O, splnime jednu z podminek pro dalsi vyskok (to abychm stale neskakali)
drzime_skok = 0;
p_x = _root.panak1._x; // update souradnic predtim, nez je pouzijeme pri duplikovani
p_y = _root.panak1._y;// update souradnic predtim, nez je pouzijeme pri duplikovani
//// CHOZENI HRACE 1 ////

// chozeni doprava
if (Key.isDown(key.RIGHT) && !(Key.isDown(key.LEFT))) // jeslize zmackneme sipku doprava a nedrzime siplku doleva
{// kolize se stenou vpravo
if (_root.panak1._x >= 760)
_root.panak1._x = 760;
	if (otacime == 1) // vytvorime panaka otoceneho na pravou stranu
{otocili_doprava = 1; // prave jsme se otocili doprava
otacime = 2; // promennou otacime nastavime na hodnotu 2, aby se hned nevytvoril dalsi panak otoceny na pravou stranu
duplicateMovieClip(_root.panak_r, "panak1", 1); //vytvorime panaka otocenho doprava
_root.panak1._x = p_x;
_root.panak1._y = p_y;
} 
_root.panak1._x += rychlost;
}
// chozeni doleva
if (Key.isDown(key.LEFT) && !(Key.isDown(key.RIGHT))) // jestlize zmacekneme sipku doleva a nedrzime sipku doprava
{// kolize se stenou vlevo
if (_root.panak1._x <= 40)
_root.panak1._x = 40;
if (otacime == 2) // vytvorime panaka otoceneho doleva
{otocili_doleva = 1; // prave jsme se otocili doprava
otacime = 1; // zmenime hodnotu promenne otacime, abychom nevytvorili danou figuru hned znovu a mohli tvorit figuru otocenou doprava
duplicateMovieClip(_root.panak_l, "panak1", 1); //vytvorime panaka otocenho doleva na hracove pozici
_root.panak1._x = p_x;
_root.panak1._y = p_y;
}
_root.panak1._x -= rychlost;
}

//// OSTATNI NASTAVENI ////

// zmena bavy panaka na modreho
barva = new Color(_root.panak1);
barva.setRGB(0x000099); // vytvorime modreho panaka
}
else // jestlize nezijeme
{
obnoveni++;
if (obnoveni == 10)
{
prave_obnovili = 1;
zijeme = 1;
}
}
}
Úkol (5 bodů):
Programových změn nebylo mnoho, proto ještě doplňte další překážky (viz ukázka k lekci). Vzpomeňte si - překážku zkopírujeme a vložíme, potom ji rozložíme (UnGroup) a přejmenujeme výplň na hit_area_2 (atd.) a znovu seskupíme (označíme se Shiftem výplň a stěny). Do skriptu pro kula_1 i kula_2 doplníme další podmínku pro kolizi s novým hit_area.

Ukázkový zdroj:
Ukázka 18. lekce