Umíme ve Flashi - 24. díl – dokončení hry

Tento miniseriál, kdy jsme vytvořili jednoduchou akční hru, dnes uzavřeme přidáním funkcí pro ukládání výsledků, dosažených jednotlivými hráči.
Umíme ve Flashi - 24. díl – dokončení hry

Závěrečné úpravy scény

Hlavní časová osa bude mít nyní tři snímky. První snímek bude sloužit jako úvod ke hře, kde se bude zadávat jméno hráče a kde bude zde tlačítko pro přechod na druhý snímek časové osy. Zde již budou objekty a kód hry, které máme připravené z minulých dílů. Poslední třetí snímek bude sloužit pro zobrazení všech výsledků zúčastněných hráčů.

Otevřeme si tedy zdrojový soubor z minulého dílu, který si můžeme stáhnout zde. Před první snímek s objekty na hlavní časové ose přidáme prázdný klíčový snímek a vložíme do něj vstupní textové pole, které na panelu vlastností pojmenujeme „jmeno“. Toto pole bude sloužit pro vložení jména uživatele.

Zde vytvoříme tlačítko, které jednoduchým způsobem zkontroluje vyplnění pole se jménem a přesune přehrávání na druhý snímek hlavní osy. Akce na tlačítku bude:

on (release) {
 if (jmeno.text != "") {
  hrac = jmeno.text;
  play();
 }
}

Za druhý snímek časové osy vložíme další klíčový snímek, kde se bude zobrazovat celková statistika všech hráčů. Do toho snímku proto vložíme komponentu „TextArea“ pojmenujeme jí „texty“ a ještě jí nastavíme na panelu vlastností možnost HTML formátování vloženého textu.

Poslednímu snímku hlavní osy navíc přiřadíme tento skript:

loadVysledky = function () {
 txts = new Object();
 var vzkazy:LoadVars = new LoadVars();
 vzkazy.onLoad = function(success:Boolean) {
  if (success) {
   txts = vzkazy;
   parseText();
   vzkaz.Odeslano = "ne";
  } else {
   texty.text = "Chyba aplikace";
  }
 };
 var vzkaz:LoadVars = new LoadVars();
 if (stat == "spravne") {
  vzkaz.vysledek = "Hráč <b>"+hrac+"</b> dokončil hru v čase: "+cas/12+" sekund";
 } else {
  vzkaz.vysledek = "Hráč <b>"+hrac+"</b> nedokončil hru s časem: "+cas/12+" sekund";
 }
 vzkaz.Odeslano = "ano";
 vzkaz.sendAndLoad("stat.php", vzkazy, "POST");
};
parseText = function () {
 texty.text = "";
 i = 0;
 newText = "";
 while (eval("txts.text"+i) != undefined) {
  newText += eval("txts.text"+i);
  newText += "<br>";
  i++;
 }
 texty.text += "<i>Hráčů celkem:"+i+" </i><br><br>"+newText;
};
loadVysledky();

Jedná se o upravené funkce, které jsme již použili při práci s návštěvní knihou. Ovšem pro tento případ jsme je zjednodušili a php skriptu budeme posílat pouze jednu proměnnou, do které uložíme jméno hráče, informaci jestli hru dokončil a celkový čas v sekundách.

Php skript je také do jisté míry zjednodušen. Opět jako základ použijeme již známý kód z návštěvní knihy:

<?php
// zde prebereme promenné zaslané flashovým souborem
$Odeslano  = $HTTP_POST_VARS["Odeslano"];
$Vzkazy  = $HTTP_POST_VARS["vysledek"];
// odstranení lomítek z textu
$Odeslano = stripslashes($Odeslano);
$Vzkazy  = stripslashes($Vzkazy);


// soubor vzkazu
$NazevSouboru  = "stat.txt";
//pokud jsme poslali hodnotu promenné Odeslano="ano" budeme zapisovat
if ($Odeslano == "ano") {
 // otevreme soubor pr ctení a uložíme jeho obsah do promenné PuvodniVzkazy
 $fp  = fopen( $NazevSouboru,"r");
 $PuvodniVzkazy  = fread($fp, 80000);
 fclose( $fp );
 // naformátujeme nový vzkaz
 $ipName = gethostbyaddr($REMOTE_ADDR);
 $NovyVzkaz = "$Vzkazy:::";
 // do promenné New spojíme púvodní vzkazy s novým
        $NoveVzkazy = "$NovyVzkaz$PuvodniVzkazy";
 // soubor prepíšeme novými vzkazy
 $fp = fopen( $NazevSouboru,"w");
 if(!$fp) die("&texts=nelze zapisovat do souboru: $NazevSouboru &");
 fwrite($fp, $NoveVzkazy, 800000);
 fclose( $fp );
}
// zde opet otevreme soubor se vzkazy
$fp  = fopen( $NazevSouboru,"r");
$Data  = fread($fp, 800000);
fclose( $fp );
// vzkazy z promenné Data vložíme do pole DataArray podle oddelovace ":::"
$PoleVzkazu = split (":::", $Data);
$pocetVzkazu = count($PoleVzkazu) - 1;

for ($n = 0; $n < $pocetVzkazu; $n++) {
echo "&text$n=";
 echo $PoleVzkazu[$n];
 echo "&";
  if (!$PoleVzkazu[$n]) {
echo "&";
   exit;
  }
 }

?>

Tento kód uložíme jako soubor „stat.php“ a bude na webu umístěn ve stejném adresáři jako samotná hra. Nezapomeneme vytvořit soubor „stat.txt“ u kterého na webovém serveru musíme mít nastaveno právo zápisu.

Úprava hry

Nakonec se podíváme ještě jednou na samotný kód hry. Ve výsledcích počítáme s proměnnou „cas“, pomocí které počítáme výsledný čas v sekundách. Navíc nám teď figurka střílí pouze při stisknuté klávese vlevo, nebo vpravo (pouze případ chůze, ne skoku). Aby došlo k výstřelu kdykoliv je stisknutá klávesa šipky vlevo/vpravo, upravíme funkce události „onEnterFrame“ do této podoby:

scena.podl.onEnterFrame = function() {
 if (zivotu == 999) {
  removeNepr();
  konec = true;
  obj.gotoAndStop("stat");
  zivoty.text = "Hra byla úspěšně dokončena za dobu: "+cas+" sekund";
  stat = "spravne";
  _root.gotoAndStop(3);
 } else {
  cas++;
  if (zivotu<0) {
   if (konec != true) {
    removeNepr();
    stat = "nespravne";
    obj.gotoAndStop("smrt");
    zivoty.text = "Konec hry";
    konec = true;
    _root.gotoAndStop(3);
   }
  } else {
   zivoty.text = "Celkový počet životů:"+zivotu;
   if ((obj._x-obj._width/2)<0 && scena._x<-1*sirkaSceny/2) {
    posunObjektu(sirkaSceny/2);
   } else if ((obj._x+obj._width*1.5)>sirkaSceny && (scena._x+scena.podl._width)>sirkaSceny*1.1) {
    posunObjektu(-1*sirkaSceny/2);
   }
   if (posunStart != true) {
    if (Key.isDown(Key.RIGHT)) {
     if (Key.isDown(Key.SHIFT)) {
      strelaNum++;
      _root.attachMovie("strela", "strela"+strelaNum, _root.getNextHighestDepth());
      eval("_root.strela"+strelaNum)._x = obj._x;
      eval("_root.strela"+strelaNum)._y = obj._y+50;
      eval("_root.strela"+strelaNum).koef = 10;
      objektyPosun.push("_root.strela"+strelaNum);
     }
    } else if (Key.isDown(Key.LEFT)) {
     if (Key.isDown(Key.SHIFT)) {
      strelaNum++;
      _root.attachMovie("strela", "strela"+strelaNum, _root.getNextHighestDepth());
      eval("_root.strela"+strelaNum)._x = obj._x;
      eval("_root.strela"+strelaNum)._y = obj._y+50;
      eval("_root.strela"+strelaNum).koef = -10;
      objektyPosun.push("_root.strela"+strelaNum);
     }
    }
    if (Key.isDown(Key.LEFT) && Key.isDown(Key.DOWN)) {
     _root.test_hit(scena.podl, obj, -1, 1);
     obj.gotoAndStop("stat");
    } else if (Key.isDown(Key.LEFT) && Key.isDown(Key.UP)) {
     _root.test_hit(scena.podl, obj, -1, -1);
     obj.gotoAndStop("skokleva");
    } else if (Key.isDown(Key.RIGHT) && Key.isDown(Key.DOWN)) {
     _root.test_hit(scena.podl, obj, 1, 1);
     obj.gotoAndStop("stat");
    } else if (Key.isDown(Key.RIGHT) && Key.isDown(Key.UP)) {
     _root.test_hit(scena.podl, obj, +1, -1);
     obj.gotoAndStop("skokprava");
    } else if (Key.isDown(Key.RIGHT)) {
     _root.test_hit(scena.podl, obj, 1, 0);
     obj.gotoAndStop("prava");
    } else if (Key.isDown(Key.LEFT)) {
     _root.test_hit(scena.podl, obj, -1, 0);
     obj.gotoAndStop("leva");
    } else if (Key.isDown(Key.UP)) {
     _root.test_hit(scena.podl, obj, 0, -1);
     obj.gotoAndStop("skok");
    } else {
     _root.test_hit(this, obj, 0, 1);
    }
   }
  }
 }
};

Kromě nových úprav ještě přidáme jednu funkci, která odstraní všechny tři pohybující se protivníky:

removeNepr = function () {
 unloadMovie(nepr1);
 unloadMovie(nepr2);
 unloadMovie(nepr3);
};

Začátek hry máme vytvořen, Ještě ale musíme někdy skončit. Konec bude symbolizován objektem na konci cesty, se kterým se naše figurka musí setkat. Po setkání velmi jednoduše navýšíme životy na hodnotu „999“. Tento objekt umístíme do MC „podlaha“ a přiřadíme mu tento skript:

onClipEvent (keyDown) {
 dotyk = _root.hit(this, this._parent._parent.obj);
 if (dotyk.cast != "nic") {
  _root.zivotu = 999;
 }
}

Nakonec už jen zbývá celou hru uložit na webový server a otestovat. Výsledek by mohl vypadat takto.

Určitě nás může napadnout mnoho vylepšení a oprav této jednoduché hry. Asi mezi nejzajímavější řešení by bylo přesun pohybových funkcí z události „onEnterFrame“ událost „onKeyDown“. Tímto bychom výrazně odlehčili procesoru a hra by se tak zrychlila.

Kompletní zdrojové soubory této verze hry jsou k dispozici zde.

Témata článku: Software, Programování, Hry, Elsa, Stat, Echo, Success

1 komentář

Nejnovější komentáře

  • gully, gully 20. 3. 2006 9:46:51
    http://diskuse-zaciname-s-flash-mx-2004.wz.cz
Určitě si přečtěte

Jak vybrat monitor k počítači: nenechte se zlákat nepodstatnými parametry

Jak vybrat monitor k počítači: nenechte se zlákat nepodstatnými parametry

** Na jaké parametry se zaměřit a kde vás výrobci chtějí nachytat ** Monitory se stále více specifikují pro konkrétní určení ** Náročný hráč nebo profesionální grafik mají různé požadavky

20.  6.  2017 | Tomáš Holčík | 32

11 tipů, jak efektivně a přesně sledovat počasí pomocí internetu

11 tipů, jak efektivně a přesně sledovat počasí pomocí internetu

** Sledujte počasí z více zdrojů a podrobněji, přesněji tak určíte, jaké počasí vás potká na dovolené ** Na webu najdete hromadu pokročilých předpovědí počasí, ale i specializované meteorologické služby ** Vybrali jsme 14 služeb na počasí, které se vám můžou hodit

23.  6.  2017 | Jakub Čížek | 19

Jak unikají informace o nových iPhonech? Třeba podprsenkami čínských pracovnic

Jak unikají informace o nových iPhonech? Třeba podprsenkami čínských pracovnic

** Na černém trhu mohou zaměstnanci továren za kradené součástky inkasovat částku ve výši ročního platu ** Velké množství informací je vyneseno i z centrály Applu ** Díly jsou pašovány v botách, podprsenkách i odpadem

21.  6.  2017 | Stanislav Janů | 24

Herní počítač vs. Xbox One X: Kvalita obrazu není všechno

Herní počítač vs. Xbox One X: Kvalita obrazu není všechno

** Nový Xbox One X slibuje hraní ve 4K s HDR za 13 tisíc korun ** Aby stejnou kvalitu obrazu zvládl počítač, museli byste za něj dát minimálně dvakrát tolik ** Přesto herní počítače stále svůj smysl mají

24.  6.  2017 | Tomáš Holčík | 58


Aktuální číslo časopisu Computer

Bojujeme proti Fake News

Dva velké testy: fotoaparáty a NASy

Co musíte vědět o změně evropského roamingu

Radíme s výběrem základní desky