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, Klíčový snímek, Celková statistika, Dok, Stisknutá klávesa, Echo, Díl, Hlavní pole, Elsa, Success, Časová osa, Celkový čas, Hra, Stat

Určitě si přečtěte

Tesla chce změnit nákladní dopravu. Její elektrický náklaďák má ohromující parametry

Tesla chce změnit nákladní dopravu. Její elektrický náklaďák má ohromující parametry

** Tesla představila elektrický kamion ** Má obdivuhodný výkon i dojezd ** Prodávat by se měl už za dva roky

17.  11.  2017 | Vojtěch Malý | 188

30 počítačových brzd, které vám zpomalí Windows

30 počítačových brzd, které vám zpomalí Windows

Na webu najdete hromadu rad, jak zrychlit počítač a Windows. My jsme na to šli opačně a naopak jsme hledali činnosti, které ho nejvíce zpomalují. Toto je třicítka těch základních.

12.  11.  2017 | Jakub Čížek | 91

Elektronika, která nepotřebuje kabel ani baterii. Živí se rádiovým šumem

Elektronika, která nepotřebuje kabel ani baterii. Živí se rádiovým šumem

** Každá elektrická krabička má konektor pro napájení nebo baterii ** Jenže pozor, jednou by to tak nemuselo být ** Drobná elektronika se může živit rádiovými vlnami

14.  11.  2017 | Jakub Čížek | 15

Nejlepší notebooky do 10 tisíc, které si teď můžete koupit

Nejlepší notebooky do 10 tisíc, které si teď můžete koupit

** I pod hranicí desíti tisíc korun existují dobře použitelné notebooky ** Mohou plnit roli pracovního stroje i zařízení pro zábavu ** Nejlevnější použitelný notebook koupíte za pět a půl tisíce

16.  11.  2017 | Stanislav Janů | 53


Aktuální číslo časopisu Computer

Otestovali jsme 5 HDR 4K televizorů

Jak natáčet video zrcadlovkou

Vytvořte si chytrou domácnost

Radíme s koupí počítačového zdroje