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.

Diskuze (1) Další článek: Ke stažení: torrenty, hudba a HTML

Témata článku: , , , , , , , , , , ,