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

UPC překopli páteřní kabel. V Brně i druhý den nejede internet ani kabelovka

UPC překopli páteřní kabel. V Brně i druhý den nejede internet ani kabelovka

** V Brně byl velký výpadek služeb UPC ** Důvodem je překopnutý páteřní kabel ** V některých lokalitách služby stále nefungují

5.  12.  2016 | Jakub Čížek | 104

17 expertek Microsoftu předpovědělo rok 2027. Splní se alespoň něco?

17 expertek Microsoftu předpovědělo rok 2027. Splní se alespoň něco?

** Zmizí klasické vyhledávače ** Budeme programovat buňky ** Kvantové počítače překonají šifry

6.  12.  2016 | Jakub Čížek | 36

11 tipů na dobrý stolní počítač: od základu po herní mašiny

11 tipů na dobrý stolní počítač: od základu po herní mašiny

** Postavte si stolní počítač! Máme pro vás 11 vzorových sestav s rozpisem komponent ** Většina tipů cílí na hráče, věnujeme se ale i základnímu PC a počítačům na střih videa ** Nadělte si nový počítač třeba pod stromeček

5.  12.  2016 | Adam Kahánek | 74

Nejlepší notebooky nad 20 tisíc: poradíme, které teď chcete

Nejlepší notebooky nad 20 tisíc: poradíme, které teď chcete

** V notebooku s cenou nad 20 tisíc nesmí chybět kvalitní displej a rychlé úložiště ** Za dalších deset tisíc můžete dostat navíc styl nebo výkonnější komponenty ** Vybírat můžete z různých velikostí i konstrukcí

8.  12.  2016 | Stanislav Janů | 87

Technosféra naší Země má už hmotnost 30 bilionů tun

Technosféra naší Země má už hmotnost 30 bilionů tun

** Vědci odhadli přibližné množství strukturu vytvořených člověkem, které jsou na Zemi ** Přibližný odhad je, že tyto struktury mají dohromady hmotnost kolem 30 bilionů tun ** Jak to ovliní biosféru?

Včera | Karel Javůrek | 10


reklama