Pa pazi, ja tako sigurno ne bih radio kako si ti počeo, ali svaki metod je dobar ako su na kraju rezultati dobri.
Problem kod razumevanja OOP-a je što je to nešto što ti moraš da razdvojiš u svojoj glavi. Ja radim već par godina u AS3 i mogu da ti kažem da sam možda jedamput samo extendovao neku svoju klasu (nekom drugom mojom klasom). Tako da za razumevanje OOP-a ne moraš da lupaš glavu o multi-level extendovanju klasa previše jer generalno to nije neophodno. Ali ono za šta to tebi treba jeste da bi razumeo kako je dokumentacija organizovana (AS3 reference). Kad jednom skapiraš "tech-tree" objekata u flashu (onih default ugrađenih klasa u flešu) mnogo bolje će ti ceo fleš biti jasniji i lakše ćeš razmišljati o svojim klasama kad ih budeš pravio.
Prvo, imaj na umu da tvoje klase
ne moraju da extenduju uvek MovieClip. Obrati pažnju da SVI objekti u flešu nasleđuju osnovnu klasu Object. To važi za
apsolutno sve objekte u flešu što uključuje i Number,String, Array, MovieClip, BitmapData, Event, MouseEvent... sve.
Ti kad praviš svoju klasu, ona ne mora a extenduje ništa, što te i dalje ne sprečava da instanciraš tu klasu (biće Object po defoltu) a ta "prazna" klasa (koja ne extenduje ništa) može u sebi da instancira druge MovieClipove, da ih čuva u sebi (u nekom areju ili u pojedinačim variablama) i da im kaže da se šetju levo-desno, da prikazuju određene vrednosti u TextFieldovima itd. Na taj način ti si praktično njima napravio njihov lični _root objekat koji može u sebi da radrži informacije koje nima trebaju.
Recimo primer takve strukture bi bila:
Main klasa instancira SeloMenager (Main -> SeloMenager:Object )
SeloMenager posle instancira druga Sela (SeloMenager -> Selo:MovieClip, Selo:MovieClip, Selo:MovieClip...)
Svako selo ima svoju thumbnail sliku koja predstavlja to selo na globalnoj mapi i listenuje mouseEvent da možeš da klikneš na njega.
Kad klikneš na neku instancu sela, ono onda otvara novi prozor i prikazuje ti zgrade koje sadrži u sebi (Selo -> Zgrada:MovieClip, Zgrada:MovieClip Zgrada:MovieClip...)
Sve zgrade su iste klase, jedina razlika je u tome što im se predaje drugi parametar koju sliku treba da prikazuju. (Selo.addChild( new Zgrada(slikaSilosa); )
Mada bi verovatno trebalo da i za sve te zgrade napraviš posebnu klasu ZgradeMenager koja ce sama da ispostavlja sve te zgrade, čisto da bi imao centralizovano mesto gde ćeš držati informaciju o svim zgradama nekog sela.
Tada recimo ako hoćeš da getuješ koliko neko selo ima zgrada, onda path do toga bi bio:
MainKlasa.SeloMenagerInstanca.SeloBroj72.ZgradeMenagerInstanca.getBrojZgrada();
Isto tako bi trebalo da imaš i path do svih resursa nekog sela na sličan način:
MainKlasa.SeloMenagerInstanca.SeloBroj72.ResursMenager.getGlina();
Naravno, nećeš morati svaki put da pišeš ceo path do konkretnog sela. Ako takve informacije recimo tražiš iz SeloMenager klase, onda je dovoljno da napišeš:
SeloBroj72.ResursMenager.getGlina();
ili
SeloBroj72.getVlasnikSela(); // ako treba da proveriš ko je vlasnik sela
Obrati pažnju da ja nisam extendovao ni jednu svoju klasu nekom drugom svojom klasom, ovde se čisto radi o parent.child strukturi instanci tih klasa.
Ako hoćeš da dinamički instanciraš neki MovieClip iz library-a, onda mu kaži u properties-u da je taj MovieClip u stvari NekeKlase i da extenduje MovieClip (jer i jeste MovieClip). Kada klikneš OK fleš će ti reći da NekaKlasa ne postoji i da će automatski biti generisana prilikom kompajliranja (samo kažeš OK). Šta sad ovo znači? to znači da sada u library-u imaš jedan MovieClip koji extenduje NekuKlasu i da možeš iz koda da ga instanciraš preko:
var instancaNekeKlase:NekaKlasa = new NekaKlasa();
this.addChild( instancaNekeKlase );
Ne moraš da praviš poseban as fajl za taj objekat.
Evo ti dole u atačmentu moja custom klasa za bacanje custom eventova. Možeš da predaš Object kao parametar u koji možeš da trpaš promenljive bilo koje vrste.
dispatchEvent(new Ev(Ev.GOTOVI_XMLOVI, {ucitaniXML:xmlData, dodatniParametar:"dodatni prametar"} ));
u tu Ev klasu možeš da stavljaš dodatne public static promenljive kao što je recimo ova gore GOTOVI_XMLOVI.
public static const GOTOVI_XMLOVI :String = "gotoviXMLovi";
a sve te dodatne parametre izvlačiš preko "data" property-a
public function pokreniPreloader(e:Ev):void {
trace( e.data.dodatniParametar ); // trejsuje: dodatni prametar
}
www.zeitgeistmovie.com - film koji mora svako da vidi! (free to download)