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.

Diskuze (1) Další článek: Ke stažení: aktualizované produkty Macromedie

Témata článku: Software, Programování, Hry, Success, Třetí snímek, Nejzajímavější řešení, Stat, Echo, Hlavní pole, Druhý snímek, Elsa, Dokončení, Časová osa, Boole, Klíčový snímek, Díl, Hra, Celkový čas, Celková statistika, Stisknutá klávesa, Dok


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

Nejlepší příslušenství k počítači. Tipy na osvědčené klávesnice, tiskárny, routery…

Nejlepší příslušenství k počítači. Tipy na osvědčené klávesnice, tiskárny, routery…

** Tipy na klávesnice, myši, routery, tiskárny, sluchátka a další věci k počítačům ** Poradíme, s jakými produkty neuděláte chybu ** Vybíráme jak příslušenství na běžnou práci, tak na hraní her

David Polesný | 22

Vybrali jsme 21 programovatelných hraček a stavebnic pro děti i jejich rodiče

Vybrali jsme 21 programovatelných hraček a stavebnic pro děti i jejich rodiče

** Získejte děti pro matematiku a základy techniky ** Kupte jim hračku nebo stavebnici, které vdechnou vlastní život ** Vybrali jsme 21 stavebnic pro malé caparty i budoucí experty na A.I.

Jakub Čížek | 11

Pozor, na Česko v těchto dnech útočí falešné Tesco, Penny Market a Lidl

Pozor, na Česko v těchto dnech útočí falešné Tesco, Penny Market a Lidl

** Máme tu další českou phishingovou vlnu ** Podle průzkumů máme stále problém s kybernetickou gramotností ** Nebezpečím jsou děti, které opouštějí rodiče

Jakub Čížek | 37

Podívejte se, jak umírá váš laptop. Desítky na to mají mocný nástroj powercfg

Podívejte se, jak umírá váš laptop. Desítky na to mají mocný nástroj powercfg

** Hardware současných laptopů už tak rychle nestárne ** Tedy až na baterie – ty umírají děsivou rychlostí ** Ve Windows to můžete sledovat skoro v přímém přenosu

Jakub Čížek | 69



Aktuální číslo časopisu Computer

Test 9 bezdrátových reproduktorů

Jak ovládnout Instagram

Test levných 27" herních monitorů

Jak se zbavit nepotřebných věcí na internetu