reklama

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

1 komentář

Nejnovější komentáře

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

Vybíráte herní periferii nebo hardware? Pak zapomeňte na nálepku Gaming

Vybíráte herní periferii nebo hardware? Pak zapomeňte na nálepku Gaming

** Herní hardware se od toho běžného často liší jen vzhledem ** Při výběru stále nezapomínejte na základní parametry ** Poradíme jak vybrat herní hardware i periferie

20.  2.  2017 | Stanislav Janů | 36

10 nejhorších produktů v historii Microsoftu

10 nejhorších produktů v historii Microsoftu

20.  2.  2017 | Karel Javůrek | 141

AMD oficiálně představilo procesory Ryzen. Známe i jejich české ceny

AMD oficiálně představilo procesory Ryzen. Známe i jejich české ceny

** AMD uvedlo první tři procesory Ryzen 7 ** Všechny budou pracovat s osmi jádry a šestnácti vlákny ** Na pulty obchodů se dostanou už za týden

22.  2.  2017 | Stanislav Janů | 132

EU se děsí Windows 10. Prý o nás vědí až příliš. Microsoft chystá změny

EU se děsí Windows 10. Prý o nás vědí až příliš. Microsoft chystá změny

** Evropští úředníci chtějí, aby byly Desítky transparentnější ** Microsoft od jara skutečně chystá změny ** Ochráncům soukromí to ale nestačí

21.  2.  2017 | Jakub Čížek | 218

Remix Singularity: Microsoft si na tom vylámal zuby. Jak dopadne Android?

Remix Singularity: Microsoft si na tom vylámal zuby. Jak dopadne Android?

** Microsoft do svých telefonů integroval desktopové prostředí ** Moc to ale nevyšlo, chyběl pořádný výkon ** Teď to zkoušejí ex-googleři s Remix Singularity

23.  2.  2017 | Jakub Čížek | 74


Aktuální číslo časopisu Computer

Supertéma o počítačové bezpečnosti

AMD Ryzen přichází

Velké testy kinoprojektorů a levných špuntových sluchátek

Příslušenství do USB-C

reklama
reklama