V ďaľšom pokračovaní série článkov o ActionScripte 2.0 si povieme o dedení. Konečne sa v sérii dostaneme k serióznemu písaniu tried a zúročíme naše vedomosti z predchádzajúcich článkov.

Dedenie

Na vysvetlenie dedenia potrebujeme nejakú ukážkovú triedu, tak začneme hneď naostro a napíšeme si všeobecnú triedu „Osoba“, ktorú potom budeme rozširovať použitím dedenia.

Otvorte si nový ActionScript file vo Flash MX 2004 Professional alebo vo vašom obľúbenom textovom editore. Uložme si ho na pevný disk pod menom „Osoba.as“ a napíšte v ňom nasledujúci kód.

Pozor! Tým, ktorí sa chcú naozaj niečo naučiť, neodporúčam kód len skopírovať a vložiť ale poctivo si ho ručne napísať a uvedomovať si, prečo daný riadok kódu píšem a akú má vlastne funkciu.

class Osoba
{
  // vlastnosti triedy Osoba
  // charakteristika osoby
  private var __meno:String;
  private var __vek:Number;
  private var __vyska:Number;
  private var __vaha:Number;
  // pozícia osoby
  private var __posx:Number;
  private var __posy:Number;
  // constructor triedy Osoba
  public function Osoba (meno:String, vek:Number, vyska:Number, vaha:Number, x:Number, y:Number):Void
  {
    // pridelenie vlastností charakteristiky ososby
    __meno = meno;
    __vek = vek;
    __vyska = vyska;
    __vaha = vaha;
    // pridelenie vlastností pozície osoby
    __posx = x;
    __posy = y;
  }
}

Zadefinovali sme si vlastnosti triedy Osoba. O typoch vlastností a o striktnom definovaní som písal v predchádzajúcich článkoch. Ja len vysvetlím prečo práve tieto vlastnosti. Predpokladajme, že plánujeme ďalej rozširovať našu triedu Osoba a pridávať jej ďaľšie vlastnosti a metódy. Trieda Osoba bude obsahovať len základné vlastnosti a metódy, ktoré sú rovnaké pre triedy, ktoré plánujeme vytvoriť jej dedením. Takže vlastnosti ako __meno, __vek, __vyska, __vaha patria medzi tie najzákladnejšie a dvojitý podtrhovník som využil len ako pomôcku, ktorá je dobrovolná. Vďaka nej budeme vedieť neskôr odlíšiť vlastnosti triedy od lokálnych premenných. Použitie vlastností __pox a __posy je na umiestnenie visuálnej podoby triedy na plochu, využijeme ho v ďaľších triedach. Tried, ktoré by mohli dediť od triedy Osoba, môže byť veľa, napríklad trieda Dieťa, Učiteľ, Starec, Hráč a tak ďalej.

Ak jedna trieda dedí od druhej, znamená to, že môže využívať všetky vlastnosti a metódy triedy od ktorej dedí. Trieda od ktorej sa dedí sa nazýva „supertrieda“ (superclass) a trieda ktorá dedí sa nazýva „podtrieda“ (subclass).

Ďalej sme si zadefinovali konštruktor triedy Osoba. Konštruktor, ako by sme už z predchádzajúcich článkov série mali vedieť, je funkcia, ktorá sa volá pri vytvorení instancie (instance) triedy v samotnom .fla dokumente. Náš konštruktor plní len jednu funkciu, a to priraduje hodnoty, ktoré mu my zadáme, vlastnostiam triedy, aby sa tieto mohli ďalej v triede využívať.

Momentálne sa naša trieda nemôže chváliť veľkou funkcionalitou, pridajme preto metódu „pohybujSa“, ktorá má za úlohu uviesť našu osobu do pohybu. Konečná podoba našej základnej triedy Osoba bude teda nasledujúca (po dopísaní kódu nezabudnite súbor uložiť):

class Osoba
{
  //vlastnosti triedy Osoba
  //charakteristika osoby
  private var __meno:String;
  private var __vek:Number;
  private var __vyska:Number;
  private var __vaha:Number;
  //pozicia osoby
  private var __posx:Number;
  private var __posy:Number;
  //constructor triedy Osoba
  public function Osoba (meno:String, vek:Number, vyska:Number, vaha:Number, x:Number, y:Number)
  {
    //pridelenie vlastnosti charakteristiky ososby
    __meno = meno;
    __vek = vek;
    __vyska = vyska;
    __vaha = vaha;
    //pridelenie vlastnosti pozicie osoby
    __posx = x;
    __posy = y;
  }
  //metoda, ktora umoznuje osobe pohybovat sa
  public function pohybujSa (rychlost:Number, smer:String)
  {
    if (smer == „hore“)
    {
      __posy -= rychlost;
    }
    if (smer == „dole“)
    {
      __posy += rychlost;
    }
    if (smer == „vpravo“)
    {
      __posx += rychlost;
    }
    if (smer == „vlavo“)
    {
      __posx -= rychlost;
    }
    trace (__meno+“ sa pohybuje smerom “ + smer + “ rýchlosťou „+rychlost+“.“);
  }
}

Naša metóda „pohybujSa“ akceptuje dva parametre, a to rýchlosť, ktorou sa osoba pohybuje, a smer, v ktorom sa pohybuje. Metóda si po zavolaní skontroluje, ktorým smerom sa má pohybovať, a na základe toho zmení zodpovedajúcu vlastnosť pozície triedy o rýchlosť. Vzhľadom na to, že naša trieda zatiaľ nemá vizuálnu podobu, pridal som na koniec metódy „trace“ príkaz, ktorý nám do Output okna vypíše meno osoby, akým smerom a akou rýchlosťou sa pohybuje.

Poďme si vyskúšať, čo naša trieda zatiaľ dokáže. Vytvorme nový .fla súbor a uložme si ho pod ľubovolným názvom do rovnakého adresára, v ktorom máme uložený súbor Osoba.as. Do prvej frame napíšme tento kód:

// vytvoríme si instanciu triedy Osoba
var mojaOsoba=new Osoba(„Milan“,23,185,90,0,0);
// priradíme funckiu onClipEventHandleru hlavnej časovej osi
_root.onEnterFrame=function () {
  mojaOsoba.pohybujSa(1,“hore“);
}

Pri vytváraní instancie triedy Osoba využijeme kľúčové slovo new a konětruktor triedy, do ktorého zadáme premenné. Potom využijeme našu metódu „pohybujSa“. Chceme aby sa naša osoba pohybovala neustále a nie aby urobila iba jeden krok. Na to využijeme clip event handler hlavnej časovej osi „onEnterFrame“, ktorý spôsobí to, že metóda pohybujSa sa vyvolá toľko krát, koľko frames per second (fps) máme nastavené v políčku „Frame rate“ v nastaveniach .fla dokumentu (Ctrl+j). Preddefinovaná hodnota Frame rate je 12. V takom prípade by sa naša metóda vyvolala 12 krát za sekundu, čo spôsobí neustále pohybovanie sa našej Osoby.

Pripravené na testovanie. Ak použijete Debugger, čiže klávesovú skratku Ctrl+Shift+Enter, uvidíte v premenných hlavnej časovej osi aj instanciu našej triedy Osoba s jej vlastnosťami.

Debugger - "Osoba" a jej vlastnosti

Na ploche síce neuvidíme nič, pretože zatiaľ naša trieda nemá žiadnu vizuálnu podobu, ale my sme pridali do metódy „pohybujSa“ aj trace akciu a tá nám spôsobí, že v Output okne vidíme meno, smer a rýchlosť našej Osoby.

Output - "Osoba" a jej chovanie

Prejdime teda k samotnému dedeniu. Hladal som nejaký obrázok osoby a prvý som našiel obrázok golfového hráča, tak si teda vytvorme novú triedu „GolfovyHrac“, ktorá bude dediť od našej základnej triedy Osoba.

Vytvorme si nový ActionScript súbor a uložme ho pod menom GolfovyHrac.as do adresára, kde máme uložený súbor Osoba.as. Napíšme nasledujúci kód a uložme súbor“

class GolfovyHrac extends Osoba
{
  //vlastnosti triedy GolfovyHrac
  private var __score:Number;
  private var __postavaHraca:MovieClip;
  //constructor triedy GolfovyHrac
  function GolfovyHrac (meno:String, vek:Number, vyska:Number, vaha:Number, x:Number, y:Number, score:Number)
  {
    //zavolanie constructoru super triedy Osoba a priradenie premenných
    super (meno, vek, vyska, vaha, x, y);
    __score = score;
    //z knižnice dynamicky pripojíme movie clip
    __postavaHraca = _root.attachMovie („golfovyHrac_mc“, „golfovyHrac“, 1);
    __postavaHraca._x = __posx;
    __postavaHraca._y = __posy;
  }
  //rozšírili sme metódu super triedy pohybujSa o ďalšiu funkcionalitu
  public function pohybujSa (rychlost, smer)
  {
    super.pohybujSa (rychlost, smer);
    __postavaHraca._x = __posx;
    __postavaHraca._y = __posy;
  }
}

Pri dedení sa využíva kľúčové slovo extends v prvom riadku definície triedy, za ktorým nasleduje meno supertriedy. A to je všetko, od tohto momentu môžeme využívať všetky vlastnosti a metódy triedy Osoba.

Keďže vlastnosti triedy Osoba sú automaticky zdedené, nemusíme ich znova zadávať, ale môžeme si pridať iné vlastnosti ako treba __score. Táto trieda už bude mať aj visuálnu podobu na ploche a na tento účel sme si vytvorili vlasnosť __postavaHraca dátového typu MovieClip.

Aj táto subtrieda musí mať svoj konštruktor a ten môže ale nemusí akceptovať parametre supertriedy Osoba. Ďalej by mal akceptovať parametre, ktoré priradíme novým vlastnostiam (__score). Konštruktor volá konštruktor supertriedy v riadku:

super (meno, vek, vyska, vaha, x, y);

Na zavolanie konštruktoru supertriedy sa využíva kľúčové slovo super a akceptuje parametre presne ako keď vytvárame instanciu triedy. Tým, že zavoláme konštruktor supertriedy, priradíme vlastnostiam triedy ich hodnoty a môžeme ďalej v triede s nimi narábať.

Z knižnice potom pripojíme na plochu movie clip s obrázkom nášho golfového hráča a umiestnime ho na x-ovú a y-ovú pozíciu. Tento movie clip si najskôr vytvoríme, ale to až keď sa dostaneme opäť k .fla dokumentu. Bude vlastne tvoriť vizuálnu podobu našej triedy GolfovyHrac.

Metódu „pohybujSa“ zo supertriedy Osoba v tejto triede rozšírime o pohyb nášho movie clipu s obrázkom golfového hráča. Opäť zavoláme pomocou kľúčového slova super metódu supertriedy Osoba, čím sa vykoná jej funkcionalita, a potom sa vykoná naša pridaná funkcionalita pohybu movie clipu s obrázkom.

Prejdime späť k .fla dokumentu a pomocou klávesovej skratky Ctrl+F8 vytvorme nový movie clip s menom „golfovyHrac_mc“. V pravom dolnom rohu kliknime na talčítko „Advanced“ aby sme videli aj „Linkage“ sekciu, v ktorej zaškrtnime políčka „Export for ActionScript“ a „Export in first frame“. Týmto umožníme pristupovať k movie clipu dynamicky. Kliknime na OK. Stále s otvoreným movie clipom „golfovyHrac_mc“ si okopírujte nasledujúci obrazok golfového hráča a vložte ho do flashu. Zarovnajte obrázok na x:0 a y:0 a prejdite na hlavnú časovú os.

Golfový hráč

Na hlavnej časovej osi označte prvú frame a doplňte napísaný kód na nasledujúcu podobu:

// vytvoríme si instanciu triedy Osoba
var mojaOsoba=new Osoba(„Milan“,23,185,90,0,0);
// vytvoríme si instanciu subtriedy GolfovyHrac
var mojGolfovyHrac=new GolfovyHrac(„Jano“,22,180,83,100,100,10);
// priradíme funckiu onClipEventHandleru hlavnej časovej osi
_root.onEnterFrame=function () {
  mojaOsoba.pohybujSa(1,“hore“);
  mojGolfovyHrac.pohybujSa(2,“vpravo“);
  mojGolfovyHrac.pohybujSa(2,“hore“);
}

Pridali sme instanciu subtriedy GolfovyHrac a doplnili dva riadky pohybu GolfovehoHraca. Ak dokument otestujete, mal by sa vám na ploche objaviť pohybujúci sa obrázok golfového hráča.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět