Dnes ukončíme vývoj naší první hry. Ve třech dílech jsme se pokusili
vytvořit základní konstrukci, určit směr pro další vývoj. Zdrojový
soubor máte k dispozici, můžete jej tedy libovolně modifikovat.
Nejefektivnější způsob, jak zamezit zkracování trati, je
stanovení kontrolních bodů (CHECKPOINT). V naší ukázce jsou tyto body součástí
jediného objektu - ve zdrojovém souboru jej naleznete pod jménem check. Movie
clip check má vlastní časovou osu s krátkými action scripty. Na některých
snímcích této časové osy jsou nakresleny čtverce o velikosti přibližně
šířky trati a to na různých místech trati. V ukázce jsou pro názornost
tyto body viditelné. Při provádění programu se na daném úseku trati
kontroluje protnutí dvou objektů - protnutí checkpointu autem. Program nebude
kontrolovat další checkpoint, dokud nedojde k protnutí bodu v aktuální
programové smyčce. Tímto způsobem proběhne kontrola každého checkpointu až do
projetí cílem, kde bude započteno ujeté kolo.
Počítání ujetých kol je součástí MC check. První
checkpoint po startu (frame 7) zvýší proměnnou lap o hodnotu 1 a zároveň
zaktualizuje dynamické textové pole kolo (ve spodní části scény) -
velmi jednoduché
řešení. Tento checkpoint je součástí programové smyčky a jeho pozice je
aktualizována každý snímek narozdíl od ostatních checkpointů. Důvodem je
přesnost při měření dosaženého času. U ostatních checkpointů není
nutné každý snímek provádět kontrolu a výkon procesoru je tím ušetřen.
Čas je měřen pomocí funkce getTimer(). Při načtení hry má
getTimer() hodnotu 0 a každou vteřinu se zvýší o 1000 (přesně řečeno každou
tisícinu vteřiny se zvýši o 1). V okamžiku, kdy se
hráč rozhodne zahájit hru, pomocné proměnné time0 se přiřadí
hodnota getTimer(), aby mohla být pro měření času od getTimer() odečítána.
Frame 11: aktualizace textového pole s názvem time: time = Math.round((getTimer()-time0)/10)/100;
V případě, že proměnná lap dosáhne stanoveného limitu (v našem
případě hodnoty 4), může být hra ukončena a na server odeslány příslušné
proměnné k zápisu výsledků do databáze, např:
getURL ("rally2.php", "", "GET"); pro zápis a načtení další úrovně nebo
loadVariablesNum ("r_zapis.php", 0, "GET"); pro pouhý zápis bez změny URL v prohlížeči.
Pokud budete chtít provádět tyto zápisy, potřebujete pro umístění hry
webhosting s podporou PHP a samozřejmě PHP scripty pro
zpracování a zápis proměnných - to pro případ zápisu do souboru. Při
použití většího množství dat je ideální zápis do databáze, pro který je nutný webhosting s PHP + MySQL.
Kontakt s okolními objekty jako např. jízda v písku nebo po trávě
se projeví pouhou změnou parametrů jako je rychlost nebo "smykovost".
Auto zkrátka v písku zpomalí a na trávě uklouzne. Při kontaktu s nějakou
pevnou překážkou je však zapotřebí vzít v úvahu kromě rychlosti a
směru jízdy také tvar nepohybujícího se objektu v místě nárazu např.
při nárazu do svodidel (výjimku tvoří objekty typu výbušný barel - auto
prostě necháme vybuchnout). Napadlo mne několik málo možností, jak srážku
se svodidly řešit.
1. Vytvořit svodidla z několika objektů, u nichž budeme znát předem
jejich tvar, např. svislá, vodorovná, šikmá část svodidla apod. Při
kontaktu se svislou částí svodidel budeme tedy vědět, že auto nebude bržděno
v ose y vůbec, ale v ose x naprosto a podle toho vytvoříme script.
2. Pokud budou svodidla tvořena jediným objektem - mnohoúhelníkem
lemujícím trať, nezbude nám nic jiného, než si
svodidla v místě nárazu "osahat". Poslouží nám jakési detektory
nárazu, které budou rozmístěny kolem auta např. v těchto místech
tzn. pro první bod např. this._x-7 a this._y-10 (vztaženo k objektu car).
Tato druhá možnost je patrně nejsložitější a pokud nechcete být otráveni
nezdarem, do této možnosti se ani nepouštějte (upřímně řečeno, ani ta
první není jednoduchá).
Zde naše úvahy o možnostech řešení kolizí ukončím. Jednak
by nám příliš dlouho trvalo, než bychom nalezli ideální rozmístění těchto bodů a
napsali program pro reakci auta při nárazu a kromě toho procesor by z našeho
výtvoru dvakrát nadšen nebyl.
Podobným způsobem, jakým je tvořen MC check, lze na trať umístit různé
objekty pro zpestření jízdy, např. rozlitý olej, výbušný barel apod.
Vysvětlení některých použitých příkazů action scriptu:
V objektu check lze v prvním snímku vypnout jeho viditelnost: this._visible=0;
V druhém snímku jsou souřadnice přizpůsobeny nové pozici objektu way: this._x = _root.way._x;
this._y = _root.way._y;
a je testován kontakt s objektem car: this.hitTest(_root.car) ? gotoAndPlay(7) : play();
Pokud došlo ke kontaktu, program pokračuje na snímku č. 7. V opačném případě
je ze snímku č. 3 odeslán zpět na snímek 2.
Program se z prvního snímku objektu oil po náhodném výběru přesune
na zvolený snímek vlastní časové osy MC oil a na trati se objeví olejová
skvrna (pokaždé jinde). Při
kontaktu s olejem se zvýší hodnota proměnné tire a auto se krásně
sklouzne po oleji. Díky snímku č. 11 hlavní osy se pneumatiky pozvolna zbaví
oleje.
Doporučuji prostudovat zdrojový soubor a pokud jste četli předchozí dva
díly, nebudete mít s pochopením scriptů problémy.
Příště bychom se mohli pustit do něčeho nového - máte-li zájem.
Podle vašeho ohlasu na minulé díly (téměř žádný) už bych toho měl asi
nechat. Máte nějaký nápad? Což takhle dát si PAC-MANa? Vaše reakce očekávám
v diskusi.
Na gamesy typu QUAKE raději předem zapomeňte :-).
WebTip.cz se opět po dlouhé době dočká pravidelné aktualizace a doufejme i dalšího rozvoje služeb. Pokud máte zájem se zapojit do budování projektu o webových technologiích, stačí poslat email s krátkým životopisem.
10. 3. 2003 - Pixy vyhlásil soutěž o nejkompatibilnější definici písem v CSS pro použití na českém webu. Tak by mě zajímalo, kolik kombinací je možné udělat z osmi možností :) (catt)
21. 2. 2003 - Aston opět zavedl komentáře ke článkům na Neviditelném psu. Stalo se tak na základě rozhořčených reakcí čtenářů a klubu na serveru Okoun. Do budoucna se počítá s registrací diskutujících.