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.
Umíme ve Flashi - 21. díl – hra 3. část

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
Určitě si přečtěte

Jak rozšířit signál Wi-Fi: Extender je nejlevnější a snadná cesta

Jak rozšířit signál Wi-Fi: Extender je nejlevnější a snadná cesta

** Wi-Fi extendery dobře poslouží k rozšíření signálu ** Jsou to malé krabičky do zásuvky s triviálním nastavením ** Zvolte raději výkonnější modely, svůj účel splní lépe

Včera | David Polesný | 30

11 tipů, jak efektivně a přesně sledovat počasí pomocí internetu

11 tipů, jak efektivně a přesně sledovat počasí pomocí internetu

** Sledujte počasí z více zdrojů a podrobněji, přesněji tak určíte, jaké počasí vás potká na dovolené ** Na webu najdete hromadu pokročilých předpovědí počasí, ale i specializované meteorologické služby ** Vybrali jsme 14 služeb na počasí, které se vám můžou hodit

23.  6.  2017 | Jakub Čížek | 19

Nejlepší program pro střih videa na doma: 9 video editorů, ze kterých si vyberete

Nejlepší program pro střih videa na doma: 9 video editorů, ze kterých si vyberete

** Pokročilé střihové programy pro neprofesionální využití stojí do 3 000 Kč, jsou ale i zdarma ** Podpora 4K, hromada editačních funkcí a efektové filtry jsou samozřejmostí ** Vybrali jsme 9 nejzajímavějších programů pro nejrozšířenější operační systém Windows

25.  6.  2017 | Stanislav Janů | 34


Aktuální číslo časopisu Computer

Bojujeme proti Fake News

Dva velké testy: fotoaparáty a NASy

Co musíte vědět o změně evropského roamingu

Radíme s výběrem základní desky