Simulace reálného prostředí ve Flashi

16. července 2002

Jistě jste již někdy hráli nějakou, jak se mezi ostřílenými hráči říká, „skákačku“. Mám na mysli typ hry, kde procházíte nějakou budovu či krajinou a svoji postavu vidíte jako malého človíčka. My se dnes pokusíme vyrobit základ nějaké takové hry ve Flashi. Fantazii se samozřejmě meze nekladou, takže to, jak si hru zdokonalíte, je jen na vás.

Výsledek bude vypadat takto:

Skoky provádíte mezerníkem, pohyb doprava a doleva pomocí šipek. Pro možnost ovládání klikněte na ukázku.

Poznámka: článek předpokládá zvládnutí a pochopení minulého článku o hrách.

Podložky

Nejprve vytvořte nějakou pevnou zem pod nohy vašeho agenta. Nakreslete tedy několik obdélníků jako podložky a převeďte je na movie clipy (dále MC). Pojmenujte je například zem1, zem2 atd. Tak, aby měl každý jiné jméno.

MC Agent

Nakreslete postavu agenta. Převeďte ji na MC a pojmenujte AGENT. Poklepáním na ní přejděte do její editace. Nyní vytvoříte objekt, který bude určovat polohu nohou postavy. Nakreslete tedy mezi nohy postavy malý obdélníček, převeďte ho na MC, pojmenujte ho NOHY a nastavte mu průhlednost Alpha na 0 %, aby nebyl vidět:

Nyní přejděte na hlavní časovou osu, označte agenta a otevřete panel Actions. Vyberte Actions I Moive Clip Control I onClipEvent a z nabídky event vyberte EnterFrame. Všechny akce a podmínky chceme testovat v každém snímku MC, proto sem budeme všechny další akce vkládat.

Pohyb agenta do stran jeviště

„Šipkovými“ klávesami budeme ovládat, zda se bude agent pohybovat doprava či doleva (resp. dopředu či dozadu). Nebude se jednat o nic jiného, než o podmínku testující stisknutí některé z kláves. Pokud bude pomínka splněna, posune se MC AGENT doprava či doleva.

Vyberte tedy Actions I Conditions/Loops I if. Poté vyberte Objects I Moive I Key I Methods I isDown (metoda testující stisknutí klávesy) a do závorky napište u jaké klávesy chcete stisknutí testovat: Key.RIGHT. Stiskněte Actions I Moive Clip Control I setProperty. Z roletky Property vyberte _x(X Position). Do pole Target napište cestu k MC, kterému chcete vlastnost nastavit. V našem případě je to tedy právě ten, který nyní editujete, tedy napište this. Do pole Value napište hodnotu, o kterou chcete MC od současného stavu posunout. Např: this._x+5. Zaškrtněte políčka Expression a poté zopakujte to samé, jen změňte název testované klávesy na Key.LEFT a hodnotu o okterou MC posunujete, napište zápornou.

Padání agenta

Pokud se agentova noha nedotýká žádné z podložek, bude se posunovat směrem dolů.

Vyberte tedy Actions I Conditions/Loops I if a poté Objects I Moive I MoiveClip I Methods I hit Test. Před text v kolonce Condition napište cestu k MC NOHA: _root.agent.noha. Nyní bychom však testovali pouze dotyk u podložky ZEM1! Dotyk ale potřebujeme testovat u jakékoli z podložek. Do pomínky tedy zadejte testování dotyku tolikrát, kolik máte podložek, jen vždy změňte název podložky a oddělte testování operátorem „nebo“: || (2x svislá čára).

Text uzavřete do závorek a připište za něj == false. Pokud jsou všechny nepravdivé, pak je podmínka splněna. Podmínka tedy bude vypadat asi takto:

(_root.agent.noha.hitTest(_root.zem1) || _root.agent.noha.hitTest(_root.zem2) || _root.agent.noha.hitTest(_root.zem3) || _root.agent.noha.hitTest(_root.zem4)) == false

Vyberte Actions I Moive Clip Control I setProperty. Z roletky Property vyberte _y(Y Position). Do pole Target napište this. Do pole Value napište hodnotu, o kterou chcete MC od současného stavu posunout. Např: this._x+5. Čím větší hodnota, tím rychleji bude agent „padat“. Nastavíte-li však hodnotu moc vyskou, může se stát, že agent při svém pádu „přeskočí podložku“. Zaškrtněte tedy políčka Expression.


Skoky agenta

Podle fyzikálních zákonů může agent vyskočit pouze pokud se má od čeho odrazit. Jako první tedy zajistíme, aby akce spojené se skokem proběhly pouze, dotýká-li se agentova noha některé z podložek. To však není jediná podmínka. Jde nám o to, aby agent skočil jen tehdy, když uživatel stiskne klávesu SPACE (mezerník). Pokud jsou obě tyto podmínky splněny, chceme, aby agent několik dalších snímků vykonával pohyb směrem nahoru třeba o 10 bodů v každém snímku. To zajistíme tak, že do proměnné SKOK vložíme hodnotu jedna. Ta pak bude každý snímek o 1 zvyšována, dokud nedosáhne hodnoty 8. Při dosažení hodnoty 8 se do proměnné SKOK vloží opět 0. V každém snímku, ve kterém bude mít proměnná SKOK hodnotu od 1 do 8, pak MC vykoná pohyb směrem nahoru.

Vyberte Actions I Conditions/Loops I if. Jako první podmínka, která se musí splnit, je dotek agenta s některou z podložek. To je vlastně opak podmínky pro padání agenta – tedy pokud se agent dotýká nějaké z podložek, je podmínka splněna:

(_root.agent.noha.hitTest(_root.zem1) || _root.agent.noha.hitTest(_root.zem2) || _root.agent.noha.hitTest(_root.zem3) || _root.agent.noha.hitTest(_root.zem4)) == true

Nyní vložíme do podmínky ještě zmiňované stisknutí klávesy. Za tento text napište operátor „a zároveň“: && a vyberte Objects I Moive I Key I Methods I isDown. Do závorky napište, u čeho chcete testovat stisknutí – klávesa Space, tedy key.SPACE. Pokud je tato podmínka splněna, vloží se do proměnné SKOK hodnota 1. Vyberte tedy Actions I Miscellaneous Actions I evaluate a do řádku Expression napište _root.skok = 1.

Vyberte Actions I Conditions/Loops I if. Do podmínky pro vykonávání dalších akcí zadejte _root.skok>=1 && _root.skok<=8, tedy pokud je hodnota proměnné SKOK větší než 1 a zároveň manší než 8, provedou se následující akce…

Vyberte Actions I Moive Clip Control I setProperty. Z roletky Property vyberte _y(Y Position). Do pole Target napište this. Do pole Value napište hodnotu, o kterou chcete MC posunout, např: -15. Uvědomte si, že pokud je MC NOHA mimo podložku, agent také padá. Od toho, o co agent „vyskočí“, tedy musíme odečíst to, o co „spadne“. To se samozřejmě netýká prvního snímku u výskoku, kde agent vyskočí o plnou hodnotu…) Vyberte Actions I Miscellaneous Actions I evaluate a do řádku Expression napište _root.skok = _root.skok+1. Tím přičteme 1 do proměnné SKOK.

Nakonec ještě otestujeme, zda proměnná SKOK dosáhla hodnoty 8 a pokud ano, vložíme do ní 0. Vyberte Actions I Conditions/Loops I if. Do podmínky zadejte _root.skok == 8. Do těla podmínky přidejte zmiňované vynulování: vyberte Actions I Miscellaneous Actions I evaluate a do řádku Expression napište _root.skok = 0.

Na závěr celý kód:

onClipEvent (enterFrame) {
          if (Key.isDown(Key.RIGHT)) {
                    setProperty(this, _x, this._x+5);
          }
          if (Key.isDown(Key.LEFT)) {
                    setProperty(this, _x, this._x-5);
          }
          if ((_root.agent.noha.hitTest(_root.zem1) || _root.agent.noha.hitTest(_root.zem2) || _root.agent.noha.hitTest(_root.zem3) || _root.agent.noha.hitTest(_root.zem4)) == false) {
                    setProperty(this, _y, this._y+5);
          }
          if ((_root.agent.noha.hitTest(_root.zem1) || _root.agent.noha.hitTest(_root.zem2) || _root.agent.noha.hitTest(_root.zem3) || _root.agent.noha.hitTest(_root.zem4)) == true && Key.isDown(key.SPACE)) {
                    _root.skok = 1;
          }
          if (_root.skok>=1 && _root.skok<=8) {
                    setProperty(this, _y, this._y-15);
                    _root.skok = _root.skok+1;
                    if (_root.skok == 8) {
                              _root.skok = 0;
                    }
          }
}

Poznámka: Výběry z nabídek jsou psány pro Flash MX. Balíček se zdrojovým souborem si můžete stáhnout.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *