reklama

Umíme ve Flashi - 21. díl – hra 3. část

Dnes to naše figurka „odskáče“. Naučíme jí poskakovat po scéně, ale abychom neposkakovali pouze na jednom místě, umožníme posouvání celé scény podle pohybu figurky.

Co nás čeká

Když si spustíme ukázku z minulého dílu (zdrojový soubor ke stažení zde) a budeme držet šipku nahoru, figurka nám bude po scéně pěkně lítat. To ale není zrovna dvakrát praktické, protože většinou jsou takovéto schopnosti možné pouze při získání nějakého bonusu ve hře. Proto se dnes zaměříme na funkci, umožňující figurce poskakovat po scéně.

Ovšem samotné poskakování na jednom místě by hráče naší hry moc nebavilo. Nejlepší by bylo umožnit přechod mezi scénami posouváním podlahy a o to se také pokusíme.

Skákání

Skákání musíme připravit tak, že po stisknutí šipky nahoru, figurka vyskočí, ale jen do určité výšky a pak zase spadne. Budeme se snažit při skoku figurku zrychlovat až do pozice maximálního výskoku, odkud bude opět se zrychlením padat.

Otevřeme si zdrojový soubor z minulého dílu a do akcí prvního snímku napíšeme hned na začátek několik pomocných proměnných:

sirkaSceny = 800;
p1 = 5;
subSkok = 2;
maxSkok = 20;
posuv = p1;

Proměnná „sirkaSceny“ nám poslouží při posouvání celé scény, té si nyní všímat nebudeme. Proměnná „p1“ slouží pro uchování hodnoty základního posuvu figurky po scéně. Následují dvě proměnné, které využijeme pro skákání figurky. První proměnná „subSkok“ označuje hodnotu, o kterou se bude navyšovat posuv při skoku figurky. Proměnná „maxSkok“ určuje maximální hodnotu posuvu při skákání. Poslední proměnná „posuv“ má stále stejný význam.

Nyní si najdeme funkci, pomocí které provádíme posouvání figurky po scéně. Pojmenovali jsme si jí „test_hit()“ a upravíme ji na tento tvar:

test_hit = function (ref_obj_3:Object, test_obj_3:Object, p_x:Number, p_y:Number) {
 if (skok) {
  trace("skok "+posuv);
  posuv += subSkok;
  if (posuv>maxSkok) {
   skok = false;
   pad = true;
   posuv = p1;
   p_y = 1;
  }
 }
 if (pad) {
  p_y = 1;
  trace("pad "+posuv);
  posuv += subSkok;
 }
 test = fut_hit(ref_obj_3, test_obj_3, p_x*posuv, p_y*posuv);
 if (test.cast == "nic") {
  trace("nic");
  test_obj_3._x += p_x*posuv;
  test_obj_3._y += p_y*posuv;
 } else {
  _root.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");
  }
 }
};

Na začátek funkce jsme přidali testování dvou proměnných. První proměnná „skok“ bude informovat o tom, že je figurka ve fázi skoku. Pokud budeme s figurkou ve výskoku, budeme neustále zvyšovat hodnotu posuvu o hodnotu proměnné „subSkok“, kterou jsme si vytvořili hned na začátku. Pokud při výskoku dosáhneme maximální hodnoty výskoku „maxSkok“, změníme proměnnou „skok“ na hodnotu „false“ a začneme pomalu s fází dopadu.

Nastavením proměnné „pad“ na „true“ informuje o druhé fázi skoku, kde se figurka blíží k podlaze. Protože ale figurka padá, zvyšuje se tedy její y-ová souřadnice, musíme změnit hodnotu pomocné proměnné „p_y“, která nám určuje směr pohybu v dané souřadnici. Hodnota „1“ představuje pohyb směrem dolů. 

Dále jsme doplnili výsledek testování dotyku objektu. V následující podmínce, kde testujeme hodnotu „test.cast“ se zaměříme na část, kdy dojde k dotyku, tedy hodnota je jiná než „nic“.

Pokud jsme se dotkli objektu podlahy, změníme hodnotu proměnné „skace“ na „false“. Tato proměnná slouží pro identifikaci celého skoku. Pokud má hodnotu „false“ figurka neskáče, naopak pokud má hodnotu „true“, figurka je v jedné z fází skoku. Její změnu na „true“ provedeme v jiné části skriptu.

Dále provedeme přepnutí proměnných „skok“ a „pad“. Pokud totiž dojde k dotyku s objektem podlahy, samozřejmě, že už nechceme dál pokračovat v jednom z pohybů výskoku.

Než ale začneme skákat, musíme vytvořit spouštěč samotného skoku. Vybereme tedy objekt podlahy a do jeho akcí připíšeme tento skript:

onClipEvent (keyDown) {
 if (_root.skace != true) {
  if (Key.isDown(Key.UP)) {
   _root.skok = true;
   _root.skace = true;
  }
 }
}

Zde provedeme odstartování celého skoku pomocí již zmíněných proměnných určujících jednotlivé fáze skoku.

Posouvání celé scény

Pokud nyní scénu otestujeme, můžeme už s figurkou celkem pěkně poskakovat po podlaze. Ale jak jsme si v úvodu naznačili, asi by nás poskakování po stalé stejné ploše za chvíli omrzelo. Nejlepším řešení bude rozšíření objektu podlahy. Pokud se s figurkou dostaneme ke kraji scény, přesuneme vše tak, abychom zobrazili další novou část podlahy.

Vrátíme se tedy na hlavní scénu a podíváme se do akcí na objektu podlahy. Zde kompletně smažeme veškeré akce v události onEnterFrame. Přesuneme je totiž, kvůli lepší práci a přehlednosti, do akcí v prvním snímku časové osy hlavní scény.

Nově přidáme také funkci pro posuv celé scény. Upravené funkce přidáme do akcí prvního snímku hlavní scény a budou vypadat takto:

posunSceny = function (obj:Object, ps:Number) {
 posunStart = true;
 posunTyp = mx.transitions.easing.Strong.easeOut;
 zacatek = obj._x;
 konec = zacatek+ps;
 delka = 2;
 posunTw = new mx.transitions.Tween(obj, "_x", posunTyp, zacatek, konec, delka, true);
 posunTw.onMotionFinished = function() {
  posunStart = false;
 };
};
podl.onEnterFrame = function() {
 trace("Stage.width "+Stage.width);
 trace("podl._x: "+podl._x);
 if ((obj._x-obj._width/2)<0 && podl._x<-1*sirkaSceny/2) {
  posunSceny(podl, sirkaSceny/2);
  posunSceny(obj, sirkaSceny/2);
 } else if ((obj._x+obj._width*1.5)>sirkaSceny && (podl._x+podl._width)>sirkaSceny*1.5) {
  posunSceny(podl, -1*sirkaSceny/2);
  posunSceny(obj, -1*sirkaSceny/2);
 }
 if (posunStart != true) {
  if (Key.isDown(Key.LEFT) && Key.isDown(Key.DOWN)) {
   _root.test_hit(podl, obj, -1, 1);
  } else if (Key.isDown(Key.LEFT) && Key.isDown(Key.UP)) {
   _root.test_hit(podl, obj, -1, -1);
  } else if (Key.isDown(Key.RIGHT) && Key.isDown(Key.DOWN)) {
   _root.test_hit(podl, obj, 1, 1);
  } else if (Key.isDown(Key.RIGHT) && Key.isDown(Key.UP)) {
   _root.test_hit(podl, obj, +1, -1);
  } else if (Key.isDown(Key.RIGHT)) {
   _root.test_hit(podl, obj, 1, 0);
  } else if (Key.isDown(Key.LEFT)) {
   _root.test_hit(podl, obj, -1, 0);
  } else if (Key.isDown(Key.UP)) {
   _root.test_hit(podl, obj, 0, -1);
  } else {
   _root.test_hit(this, obj, 0, 1);
  }
 }
};

Vytvořili jsme si novou funkci „posunSceny“, která nám bude sloužit pro posuv libovolného objektu o přesně určený počet pixelů v x-ové vzdálenosti. Využijeme zde třídu „transitions“, která nám nabízí hned několik pohybů, které můžeme jednoduchým způsobem aplikovat na MC. My si funkci upravíme tak, že jí vždy předáme název MC a hodnotu, o kterou se má posunout.

Následuje událost „onEnterFrame“ na objektu podlahy („podl“). Její funkce je totožná s tou, kterou jsme před chvíli smazali se samotného objektu, pouze jsme přidali testování pozice objektu figurky. Pokud se figurka přiblíží k okraji scény, provedeme přesun jak samotné figurky, tak celé scény. Ovšem dokud přesun není dokončen, nechceme, aby se figurka nějak dále pohybovala, proto využijeme novou proměnnou „posunStart“ pomocí které zajistíme opětovné spuštění klasického pohybu figurky pomocí kurzorových šipek klávesnice.

Akce máme připravené, stačí už jen prodloužit objekt podlahy. Zde ale musíme mít na paměti, že souřadnice podlahy se počítají vůči jejímu středu. Pokud bychom kresbu v objektu podlahy zvětšili směrem doleva a otestovali scénu, nic se posouvat nebude. Musíme nově nakreslenou podlahu zarovnat levým rohem ke středu MC a až následovně celý MC na hlavní scéně posouvat podle potřeby.

Nyní už jen otestujeme výslednou scénu, která by měla vypadat podobně jako zde.
Zdrojový soubor dnešní ukázky je ke stažení zde.

Témata článku: Software, Programování, Elsa, Přepnutí klávesnice

2 komentáře

Nejnovější komentáře

  • harou 10. 3. 2006 17:12:19
    LOOOOOOOOOL vzdyt ten manik ani nespane dolu kdyz drzim sipku doleva nebo...
  • gully, gully 27. 2. 2006 9:19:52
    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ů | 35

10 nejhorších produktů v historii Microsoftu

10 nejhorších produktů v historii Microsoftu

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

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

Facebook o nás ví vše. Díky dobře skrytému vyhledávači se to dozví i ostatní

Facebook o nás ví vše. Díky dobře skrytému vyhledávači se to dozví i ostatní

** Facebook o nás ví vše, protože mu to sami řekneme ** V jeho nitru se skrývá mocný vyhledávač ** Mohou jej zneužít stalkeři, sociální inženýři a další nezbedníci

16.  2.  2017 | Jakub Čížek | 76

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

Včera | Stanislav Janů | 119


Aktuální číslo časopisu Computer

Stavba 3D tiskárny

Výbava domácí elektrodílničky

Budoucnost 5G sítí

Velké testy microSD karet a vodních chladičů

Přehled mobilních tarifů

reklama
reklama