reklama

Umíme ve Flashi – 22. díl – hra 4. díl

V dnešním díle oživíme našeho hrdinu, ze kterého se tak stane opravdová chodicí figurka. Navíc také přidáme nové objekty pro snižování a zvyšování počtu životů na hráčově kontě.

Animace figurky

Dosud byla naše figurka pouze statickým objektem, který nijak nereagoval na pohyb nebo jiné akce. Pouze jsme jím pohybovali po scéně, nic víc. Ovšem s tímto se dnes asi těžko prosadíme, a proto upravíme figurku tak, aby doopravdy kráčela podle směru pohybu.

Celkové řešení je velmi jednoduché. Nyní je figurka vložena do symbolu „objekt“. V MC s figurkou pak přidáme dalších několik snímků, kde v každém snímku bude vždy jedna animace pohybující se figurky. Podle právě stisknutého tlačítka pro pohyb se budeme přesouvat po snímcích s jednotlivými animacemi figurky v MC „objekt“.

Pokud chceme, můžeme použít figurku z minulé lekce, ale nic nám nebrání ve vytvoření vlastní figurky, záleží na nás. Nejdříve si ale otevřeme zdrojový soubor z předchozího dílu, který si můžeme stáhnout i zde.

Otevřeme MC s vloženou figurkou a vytvoříme v něm 6 dalších klíčových snímků, do kterých postupně umístíme MC s animacemi, které budou představovat figurku v různých druzích pohybu. Celkem tedy budeme mít v tomto MC 7 klíčových snímků a v každém bude jiný MC s animací figurky. Vedle vrstvy s animacemi zde budeme mít i vrstvu pro ActionScript, i když v tomto případě se bude jednat o velmi jednoduchý příkaz stop();. Vytvoříme tedy další vrstvu, ve které převedeme prvních 7 snímků na klíčové a do každého snímku připíšeme akci „stop();“ a dále na panelu vlastností pojmenujeme každý snímek názvy: „stat, leva, prava, skok, skokleva, skokprava, smrt“.

Na tyto jména se pak budeme později odkazovat při stisknutí určitých kláves pro pohyb. Z názvů je dostatečně patrné, co v kterém klíčovém snímku má být za animaci. K již vytvořeným dvěma vrstvám ještě vytvoříme třetí, která bude sloužit jako neviditelné ohraničení celé figurky.

Vložíme třetí vrstvu a vytvoříme v ní obdélník bez výplně s průhledným okrajem. Velikost obdélníku bude přesně ohraničovat rozměry figurky v poloze „stat“.

Klepněte pro větší obrázek

Takto by měla vypadat časová osa v MC „objekt“

Důvod, proč jsme použili pouze průhledné ohraničení bez výplně je zřejmý. Pokud pohybujeme s velkými průhlednými plochami, flashplayer se pořádně zapotí. Tímto snížíme zatížení procesoru. Samotné ohraničení je důležité pro správnou detekci kolizí s ostatními objekty.

Nyní se přesuneme na hlavní scénu a objekt podlahy převedeme na MC, jehož instanci nezapomeneme pojmenovat „scena“. Jak bylo v úvodu naznačeno, chceme na scénu přidat objekty, které budou ubírat a přidávat životy figurce. Abychom nemuseli používat funkci na každý objekt zvlášť, vložíme všechny objekty společně s objektem podlahy do jednoho MC, zde to bude „scena“.

Úprava ActionScriptu

Ovšem pokud jsme provedli přesun objektu podlahy do nového objektu „scena“, musíme změnit funkci pro detekci kolize panáčka a podlahy. Jedná se funkce události „onEnterFrame“, které jsme měli přiřazené k MC „podl“. Upravená událost bude vypadat následovně:

zivotu = 30;
scena.podl.onEnterFrame = function() {
 if (zivotu<0) {
  if (konec!=true) {
   obj.gotoAndStop("smrt");
   zivoty.text = "Konec hry";
   konec = true;
  }
 } else {
  zivoty.text = "Celkový počet životů:"+zivotu;
  if ((obj._x-obj._width/2)<0 && scena._x<-1*sirkaSceny/2) {
   posunSceny(scena, sirkaSceny/2);
   posunSceny(obj, sirkaSceny/2);
  } else if ((obj._x+obj._width*1.5)>sirkaSceny && (scena._x+scena.podl._width)>sirkaSceny*1.5) {
   posunSceny(scena, -1*sirkaSceny/2);
   posunSceny(obj, -1*sirkaSceny/2);
  }
  if (posunStart != true) {
   if (Key.isDown(Key.LEFT) && Key.isDown(Key.DOWN)) {
    _root.test_hit(scena.podl, obj, -1, 1);
    obj.gotoAndStop("stat");
   } else if (Key.isDown(Key.LEFT) && Key.isDown(Key.UP)) {
    _root.test_hit(scena.podl, obj, -1, -1);
    obj.gotoAndStop("skokleva");
   } else if (Key.isDown(Key.RIGHT) && Key.isDown(Key.DOWN)) {
    _root.test_hit(scena.podl, obj, 1, 1);
    obj.gotoAndStop("stat");
   } else if (Key.isDown(Key.RIGHT) && Key.isDown(Key.UP)) {
    _root.test_hit(scena.podl, obj, +1, -1);
    obj.gotoAndStop("skokprava");
   } else if (Key.isDown(Key.RIGHT)) {
    _root.test_hit(scena.podl, obj, 1, 0);
    obj.gotoAndStop("prava");
   } else if (Key.isDown(Key.LEFT)) {
    _root.test_hit(scena.podl, obj, -1, 0);
    obj.gotoAndStop("leva");
   } else if (Key.isDown(Key.UP)) {
    _root.test_hit(scena.podl, obj, 0, -1);
    obj.gotoAndStop("skok");
   } else {
    _root.test_hit(this, obj, 0, 1);
   }
  }
 }
};

Jak je patrné, k instanci „podl“ přibyla další „scene“. Než ale událost spustíme, nastavíme počáteční hodnotu životů na 30. K funkcím události jsme přidali detekcí zbývajících životů. Pokud je hodnota menší než 0, přesuneme se v MC s figurkou na snímek, kde máme animaci skonání našeho človíčka.

Pokud je pořád dostatečný počet životů, vložíme jejich počet do dynamického textového pole „zivoty“. Pokud jsme toto pole dosud nevytvořili, nyní je ta správní chvíle. Zbytek funkcí v události „onEnterFrame“ je upravený pouze přidáním odskoku na příslušný snímek s animací v MC s figurkou.

Druhou funkcí, která potřebuje úpravu je „test_hit“. Pokud posunujeme figurkou vlevo nebo vpravo a ta se dostane za hranu podlahy, může pořád pokračovat dál, nespadne dolů. Tomu zabráníme touto úpravou:

test_hit = function (ref_obj_3:Object, test_obj_3:Object, p_x:Number, p_y:Number) {
 if (skok) {
  posuv += subSkok;
  if (posuv>maxSkok) {
   skok = false;
   pad = true;
   posuv = p1;
   p_y = 1;
  }
 }
 if (pad) {
  p_y = 1;
  posuv += subSkok;
 }
 test = fut_hit(ref_obj_3, test_obj_3, p_x*posuv, p_y*posuv);
 test2 = fut_hit(ref_obj_3, test_obj_3, p_x*posuv, 2*posuv);
 if (test.cast == "nic") {
  trace("nic");
  if (test2.cast == "nic" && skok != true) {
   test_obj_3._y += posuv;
  } else {
   test_obj_3._y += p_y*posuv;
   test_obj_3._x += p_x*posuv;
  }
 } else {
  skace = false;
  if (skok) {
   skok = false;
   posuv = p1;
   pad = true;
   p_y = 1;
  }
  if (pad) {
   pad = false;
   posuv = p1;
  }
  tx = 1;
  test2 = fut_hit(ref_obj_3, test_obj_3, p_x*tx, p_y*tx);
  if (test2.cast == "nic") {
   do {
    test_obj_3._x += p_x*tx;
    test_obj_3._y += p_y*tx;
    test2 = fut_hit(ref_obj_3, test_obj_3, p_x*2, p_y*2);
   } while (test2.cast == "nic");
  }
 }
};

Pokud hodnota proměnné „test.cast“ je rovna "nic", znamená to že se objekt může pohybovat, my sem doplníme ještě jednu proměnnou „test2“, která testuje přítomnou podlahy v dvojnásobné vzdálenosti hodnoty proměnné „posuv“. V případě že pod figurkou v této vzdálenosti nic není, necháme jí spadnout níž.

Jednou z posledních úprav je přidání události na MC „scena“:

onClipEvent (keyUp) {
 if (this._parent.konec != true) {
  this._parent.obj.gotoAndStop("stat");
 }
}

Tou poslední úpravou je přidání objektů, které budou ubírat a přidávat životy naší figurce. Tyto objekty umístíme v podobě MC do MC „scena“, kde jsou společně s MC podlahy. Na tyto MC můžeme na panelu akcí napsat tento skript:

onClipEvent (keyDown) {
 dotyk = _root.hit(this, this._parent._parent.obj);
 if (dotyk.cast != "nic") {
  _root.zivotu--;
 }
}

Pokud je stisknutá klávesa a tento objekt se protíná s figurkou, dojde k odečtení životů. Stejnou akci dáme i na objekty, které mají za úkol životy přidávat, pouze pozměníme odečítání životů na přičítání.

A máme hotovo, teď už jenom otestovat, výsledek by měl vypadat takto.

Pokud si nejste jistí správností svého postupu, můžete si stáhnout zdrojový soubor dnešního dílu zde.

V příštím díle oživíme nepřátele a trochu vyzbrojíme naší zatím bezbrannou figurku.

Témata článku: Software, Programování, Elsa, Stat

2 komentáře

Nejnovější komentáře

  • gully, gully 6. 3. 2006 16:04:46
    Pri kliknuti na obrazek v textu se otevre nove okno, ale obrazek v nem...
  • gully, gully 6. 3. 2006 9:00:47
    http://diskuse-zaciname-s-flash-mx-2004.wz.cz
reklama
Určitě si přečtěte

Vybíráte herní periferii nebo hardware? Pak zapomeňte na nálepku Gaming

Vybíráte herní periferii nebo hardware? Pak zapomeňte na nálepku Gaming

** Herní hardware se od toho běžného často liší jen vzhledem ** Při výběru stále nezapomínejte na základní parametry ** Poradíme jak vybrat herní hardware i periferie

20.  2.  2017 | Stanislav Janů | 36

10 nejhorších produktů v historii Microsoftu

10 nejhorších produktů v historii Microsoftu

20.  2.  2017 | Karel Javůrek | 133

Pojďme programovat elektroniku: Žádný bastlíř se neobejde bez armády švábů

Pojďme programovat elektroniku: Žádný bastlíř se neobejde bez armády švábů

** Každý bastlíř se po čase neobjede bez armády švábů ** Dnes si některé z nich vyzkoušíme ** Třeba zázračný posuvný registr

19.  2.  2017 | Jakub Čížek | 39

AMD oficiálně představilo procesory Ryzen. Známe i jejich české ceny

AMD oficiálně představilo procesory Ryzen. Známe i jejich české ceny

** AMD uvedlo první tři procesory Ryzen 7 ** Všechny budou pracovat s osmi jádry a šestnácti vlákny ** Na pulty obchodů se dostanou už za týden

22.  2.  2017 | Stanislav Janů | 130

EU se děsí Windows 10. Prý o nás vědí až příliš. Microsoft chystá změny

EU se děsí Windows 10. Prý o nás vědí až příliš. Microsoft chystá změny

** Evropští úředníci chtějí, aby byly Desítky transparentnější ** Microsoft od jara skutečně chystá změny ** Ochráncům soukromí to ale nestačí

21.  2.  2017 | Jakub Čížek | 217

Vyhledávání ve Windows není dokonalé, zkuste to 5× jinak

Vyhledávání ve Windows není dokonalé, zkuste to 5× jinak

** V macOS funguje vyhledávání Spotlight, ve Windows podobně propracovaná funkce chybí ** Alternativy se zaměřují na rychlé hledání souborů i externí zdroje ** Mnohé mohou vyhledávání ve Windows kompletně nahradit

18.  2.  2017 | Stanislav Janů | 58


Aktuální číslo časopisu Computer

Supertéma o počítačové bezpečnosti

AMD Ryzen přichází

Velké testy kinoprojektorů a levných špuntových sluchátek

Příslušenství do USB-C

reklama
reklama