Umíme ve Flashi - 23. díl - akční hra 5. díl

Dnes do hry přibudou nepřátelé, kteří budou ohrožovat naší figurku. Aby ale figurka nebyla bezbranná, umožníme jí jednoduchým způsobem nepřátele zneškodnit pomocí střely.

Nepřátelé

V minulém díle jsme do hry přidali objekty, které, při dotyku s figurkou, snižovali počet životů. Dnes k těmto statickým objektům přidáme další, které se již budou pohybovat. Otevřeme si zdrojový soubor z minulého dílu, který si můžeme stáhnout zde. Vytvoříme si nový symbol, který bude představovat pohybujícího se protivníka. Tento symbol bude pouze v knihovně symbolů dokumentu, na scénu jej budeme přidávat pomocí metody „attachMovie()“

Pokud máme protivníka nakresleného, vložíme do prvního snímku jeho časové osy tento skript:

koef = 1;
this.onEnterFrame = function() {
 dotyk3 = _root.hit(this, _root.obj);
 if (dotyk3.cast != "nic") {
  _root.zivotu = -1;
 }
 _root.posun_nepritel(this);
};

Proměnná „koef“ bude označovat směr v x-ových souřadnicích, kterým se bude objekt pohybovat. Změna tohoto koeficientu na „-1“ bude znamenat změnu směru pohybu. Samotný pohyb objektu nepřítele bude realizován funkcí „posun_nepritel“, kterou si za chvíli vytvoříme na hlavní scéně. Ještě ale zůstaneme chvilku u objektu nepřítele.

Nepřítel po dotyku s objektem figurky zruší veškeré životy. To zajistíme pomocí již vytvořené funkce „hit“, která nám detekuje právě průnik dvou objektů. V případě, že se objekt figurky „obj“ a objekt nepřítele setkají, změníme hodnotu proměnné „zivotu“ na „-1“. Figurka tak přijde o všechny životy a hra končí.

Než se přesuneme na hlavní scénu, otevřeme si knihovnu symbolů a pomocí pravého tlačítka myši zobrazíme na novém objektu nepřítele menu, ze kterého vybereme položku „Linkage“. Zaškrtneme položku „Export for ActionScript“ a do pole „Identifier“ napíšeme identifikátor objektu, pomocí kterého jej budeme vkládat na scénu. Tento objekt bude mít identifikátor s názvem „nepritel“.

Funkce pro pohyb nepřátel

Pokud máme export nastaven, přejdeme na hlavní scénu, kde si vytvoříme jednoduchou funkci pohybu nepřátel:

posun_nepr = 4;
posun_nepritel = function (target) {
 if (posunStart != true) {
  dt = hit(scena.podl, target);
  if (dt.cast != "nic") {
   target.koef *= -1;
   target._x += target.koef*posun_nepr;
  } else {
   target._x += target.koef*posun_nepr;
  }
 }
};

Funkci s proměnnou „posun_nepr“ umístíme až na konec celého skriptu prvního snímku. Proměnná „posun_nepr“ zde určuje rychlost, s jakou se budou nepřátelé pohybovat. Rychlost bude o něco menší než rychlost pohybující se figurky, která je rovna „5“.

Samotná funkce pro pohyb s nepřítelem je velmi jednoduchá. Pokud od ní budeme požadovat pouze horizontální pohyb, tedy pouze v x-ových souřadnicích, vystačíme si s detekcí dotyku s objektem podlahy. Pokud se nepřítel s objektem podlahy setká, změníme hodnotu proměnné „koef“ na její opak, pohyb nepřítele se obrátí.

Zde je důležití umístit objekt nepřítele tak, aby se již od počátku nedotýkal samotného objektu podlahy.

Jakmile máme funkci hotovou, můžeme na scénu vložit objekty nepřítele:

this.attachMovie("nepritel", "nepr1", this.getNextHighestDepth());
this.attachMovie("nepritel", "nepr2", this.getNextHighestDepth());
this.attachMovie("nepritel", "nepr3", this.getNextHighestDepth());
nepr1._x = 580;
nepr1._y = 470;
nepr2._x = -400;
nepr2._y = 435;
nepr3._x = 1300;
nepr3._y = 508;

Když nyní hru otestujeme, nepřátelé se pohybují, ale nemáme je jak zastavit. Je nutné umožnit figurce nepřátele zneškodnit. Vytvoříme si proto nový symbol, který bude představovat střelu, kterou figurky vyšle na nepřítele.

Opět do prvního snímku objektu střely vložíme skript:

this.onEnterFrame = function() {
 dotyk1 = _root.hit(_root.nepr1, this);
 dotyk2 = _root.hit(_root.nepr2, this);
 dotyk3 = _root.hit(_root.nepr3, this);
 if (dotyk1.cast != "nic") {
  this.unloadMovie();
  _root.nepr1.unloadMovie();
 }
 if (dotyk2.cast != "nic") {
  this.unloadMovie();
  _root.nepr2.unloadMovie();
 }
 if (dotyk3.cast != "nic") {
  this.unloadMovie();
  _root.nepr3.unloadMovie();
 }
 if (_root.posunStart != true) {
  _x += koef;
 }
};

Pomocí tohoto skriptu budeme testovat kolizi s některým z nepřátel, kteří se budou pohybovat po scéně. Pokud ke kolizi dojde, objekt střely a objekt zasaženého nepřítele odstraníme ze scény pomocí metody „unloadMovie()“.

Pokud máme objekt střely upraven, v knihovně symbolů opět nastavíme export pro AS, identifikátor se bude jmenovat „strela“.

Vrátíme se nyní na hlavní scénu a přidáme funkci, pomocí které budeme snadněji pohybovat s objekty při přechodu s figurkou mimo aktuální scénu:

objektyPosun = new Array();
objektyPosun.push(obj);
objektyPosun.push(scena);
posunObjektu = function (posuvX) {
 for (i=0; i<objektyPosun.length; i++) {
  trace(objektyPosun[i]);
  posunSceny(objektyPosun[i], posuvX);
 }
};

Tato funkce využívá pole „objektyPosun“ jehož prvky jsou objekty, kterými chceme posouvat. Do pole tedy umístíme jak objekt podlahy „scena“ tak objekt figurky „obj“. Jako poslední upravíme funkce události „onEnterFrame“ na objektu podlahy:

strelaNum = 0;
scena.podl.onEnterFrame = function() {
 if (zivotu<0) {
  if (konec != true) {
   obj.gotoAndStop("smrt");
   zivoty.text = "Konec hry";
   konec = true;
  }
 } 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.5) {
   posunObjektu(-1*sirkaSceny/2);
  }
  if (posunStart != true) {
   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");
    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)) {
    _root.test_hit(scena.podl, obj, -1, 0);
    obj.gotoAndStop("leva");
    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.UP)) {
    _root.test_hit(scena.podl, obj, 0, -1);
    obj.gotoAndStop("skok");
   } else {
    _root.test_hit(this, obj, 0, 1);
   }
  }
 }
};

Nahradili jsme původní posun jednotlivých objektů novou funkcí, která zajišťuje posun všemi objekty, uloženými v poli „objektyPosun“. Kromě této úpravy jsme navíc přidali funkci, která vloží s knihovny symbolů objekt střely. Tato akce se provede pouze při stisknutí klávesy „Shift“ v případě že figurka jde vlevo nebo vpravo.

Jako úplně poslední funkcí bude přidání objektů nepřítele do pole, ze kterého bereme objekty pro posun:

objektyPosun.push(nepr1);
objektyPosun.push(nepr2);
objektyPosun.push(nepr3);

Tyto poslední řádky umístíme až na konec všech akcí prvního snímku. Nyní už můžeme otestovat výslednou hru, která by měla vypadat takto. Zdrojový soubor dnešní lekce je k dispozici zde.

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

1 komentář

Nejnovější komentáře

  • gully, gully 13. 3. 2006 0:38:48
    http://diskuse-zaciname-s-flash-mx-2004.wz.cz
Určitě si přečtěte

Kde nejlevněji uložit 1 TB dat: Srovnali jsme aktuální ceny cloudových úložišť

Kde nejlevněji uložit 1 TB dat: Srovnali jsme aktuální ceny cloudových úložišť

** Srovnali jsme známá cloudová úložiště podle toho, kolik měsíčně zaplatíte za 1TB ** Ceny se pohybují od dvou stovek až po tisíc korun ** Google umožní uložit až 30 TB dat

18.  3.  2017 | Stanislav Janů | 115

Špičkoví hackeři útočili na prohlížeče. Chrome odolal, ale Edge je tragédie

Špičkoví hackeři útočili na prohlížeče. Chrome odolal, ale Edge je tragédie

** Do Vancouveru se sjeli hackeři ** Soutěžili v útocích na prohlížeče ** Chrome odolal, ale Edge to projel na celé čáře

22.  3.  2017 | Jakub Čížek | 79

Pojďme programovat elektroniku: Meteostanice, která bude díky Sigfoxu posílat stav počasí třeba z vrcholu Sněžky

Pojďme programovat elektroniku: Meteostanice, která bude díky Sigfoxu posílat stav počasí třeba z vrcholu Sněžky

** Příští roky budou ve znamení internetu věcí ** Podívali jsme se podrobně na síť Sigfox ** Takhle s ní komunikují krabičky z celé Evropy

19.  3.  2017 | Jakub Čížek | 18

Obří Mechroboti jsou realitou, měří čtyři metry a mají hmotnost přes 1,5 tuny

Obří Mechroboti jsou realitou, měří čtyři metry a mají hmotnost přes 1,5 tuny

** Jihokorejská společnost Hankook Mirae Technology vyrábí obří Mechroboty ** Jsou určené pro ovládání člověkem uvnitř ** V prodeji se objeví koncem tohoto roku za 200 milionů korun

20.  3.  2017 | Karel Javůrek | 18


Aktuální číslo časopisu Computer

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

AMD Ryzen přichází

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

Příslušenství do USB-C