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í, Stejný význam, Díl, Fáze, Elsa, Hra, První snímek, Přepnutí klávesnice, Hlavní funkce, Maximální hodnota

Určitě si přečtěte

Tesla chce změnit nákladní dopravu. Její elektrický náklaďák má ohromující parametry

Tesla chce změnit nákladní dopravu. Její elektrický náklaďák má ohromující parametry

** Tesla představila elektrický kamion ** Má obdivuhodný výkon i dojezd ** Prodávat by se měl už za dva roky

Včera | Vojtěch Malý | 123

30 počítačových brzd, které vám zpomalí Windows

30 počítačových brzd, které vám zpomalí Windows

Na webu najdete hromadu rad, jak zrychlit počítač a Windows. My jsme na to šli opačně a naopak jsme hledali činnosti, které ho nejvíce zpomalují. Toto je třicítka těch základních.

12.  11.  2017 | Jakub Čížek | 90

Elektronika, která nepotřebuje kabel ani baterii. Živí se rádiovým šumem

Elektronika, která nepotřebuje kabel ani baterii. Živí se rádiovým šumem

** Každá elektrická krabička má konektor pro napájení nebo baterii ** Jenže pozor, jednou by to tak nemuselo být ** Drobná elektronika se může živit rádiovými vlnami

14.  11.  2017 | Jakub Čížek | 15


Aktuální číslo časopisu Computer

Otestovali jsme 5 HDR 4K televizorů

Jak natáčet video zrcadlovkou

Vytvořte si chytrou domácnost

Radíme s koupí počítačového zdroje