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í

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

Vyzkoušeli jsme FM štěnici: Když si vtipálci hrají na pirátské rozhlasové vysílání

Vyzkoušeli jsme FM štěnici: Když si vtipálci hrají na pirátské rozhlasové vysílání

** Dnes žádnou elektroniku programovat nebudeme ** Štěnice totiž funguje sama o sobě ** Stačí připojit baterii a naladit frekvenci

22.  1.  2017 | Jakub Čížek | 31

Microsoft: Zbavte se už konečně zastaralých a děravých Windows 7

Microsoft: Zbavte se už konečně zastaralých a děravých Windows 7

** Microsoft pomalu začíná kritizovat svůj nejpopulárnější OS ** Chce konečně dostat podniky na Desítky ** Bezpečnostní podpora Sedmiček vydrží ještě necelé tři roky

17.  1.  2017 | Jakub Čížek | 409

Takto si špičkoví grafici představují nový Facebook. S čistým vzhledem a bez reklam

Takto si špičkoví grafici představují nový Facebook. S čistým vzhledem a bez reklam

** Design Facebooku se delší dobu nemění a pro mnohé je nudným ** Grafici zkouší navrhovat nové koncepty toho, jak by mohla síť vypadat ** Hlasujte pro nejzdařilejší návrh

22.  1.  2017 | Stanislav Janů | 65

Umělá inteligence dokáže ze snímků srdce předpovědět, kdy zemřete

Umělá inteligence dokáže ze snímků srdce předpovědět, kdy zemřete

** Strojové učení lze skvěle použít pro vylepšení modelů pro předpověď srdečních komplikací ** Nová technologie umožňuje přesněji určit rizikové pacienty ** Dřívější diagnostika může díky včasně léčbě do budoucna zachránit životy

21.  1.  2017 | Karel Javůrek | 7

8 produktů, o kterých byste neřekli, že nesou značku Apple

8 produktů, o kterých byste neřekli, že nesou značku Apple

** Věděli jste, že Apple vyvinul celkem 45 modelů tiskáren? ** ** Monitor na výšku, plotter nebo herní konzole - to vše měl Apple ve své nabídce ** Většinu z těchto produktů pohřbil Steve Jobs

19.  1.  2017 | Stanislav Janů | 43


Aktuální číslo časopisu Computer

99 nejlepších programů pro váš počítač

Zvykejte si na umělou inteligenci

Velké testy PC zdrojů a gamepadů

Alternativní zdroje energie

reklama
reklama