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.

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

Původní Starcraft: Brood War je nyní zdarma. Konec práce! Jde se pařit

Původní Starcraft: Brood War je nyní zdarma. Konec práce! Jde se pařit

** Legendární hra Starcraft je nyní k dispozici zdarma ** Chystá se i nová remasterovaná verze s hezčí grafikou

19.  4.  2017 | Jakub Čížek | 25

Brno otevřelo největší českou dílnu pro bastlíře. Kladívka, vrtačky, 3D tiskárny, laserové řezačky. Je tu vše

Brno otevřelo největší českou dílnu pro bastlíře. Kladívka, vrtačky, 3D tiskárny, laserové řezačky. Je tu vše

** Máte nápad, ale chybí vám stroje a pořádná dílna? ** Chcete postavit ptačí budku, nebo krabičku pro Arduino? ** Brno otevřelo svůj FabLab – laboratoř pro bastlíře

19.  4.  2017 | Jakub Čížek | 31

Operační systém běžným počítačům nedal Bill Gates, ale Gary Kildall

Operační systém běžným počítačům nedal Bill Gates, ale Gary Kildall

** Gary Kildall pochopil, že levné výpočetní čipy mohou posloužit jako univerzální počítače pro všechny ** Připravil pro ně proto první operační systém ** Později mu systém vyfoukl Microsoft a nazval ho MS DOS

Včera | Pavel Tronner | 22


Aktuální číslo časopisu Computer

První test AMD Ryzen

Velké testy: 22 powerbank a 8 bezdrátových setů

Radíme s koupí Wi-Fi routeru

Co dokáží inteligentní domy?