[ dalibor_zdravkovic @ 15.08.2010. 20:31 ] @
Muci me sledeci problem.

U frejmu doadjme objekte komandom "addChild", u istom frejmu imam "MovieClip" sa dugmetom cijim klikom treba da npr. postavim parametar "alpha" na 1 objektan na poziciji 2 u roditeljskom frejmu.

MovieClip ima funkciju koja na klik dugmeta obavlja gore navedenu operaciju.

U fukciji sam pokusao da to izvedem sledecim komadnadma:

Code:

var item:Object = MovieClip(this.parent).getChildAt(2); // item je nakon izvrsenja NULL
item.alpha = 1;


Code:

var item:Object = MovieClip(this.parent.parent).getChildAt(2); // isti slucaj item je nakon izvrsenja NULL
item.alpha = 1;


Ubih se od guglanja i nista.

Da li neko ima resenje za ovaj slucaj;
[ StarCraft @ 16.08.2010. 08:51 ] @
Ako pišeš sve u prvom frejmu timeline-a onda je this u stvari root, tj. Main (document) klasa, a ona nema parent.

Evo jedno kratko objašnjenje "kada iskače greška za null object":
- Ako imaš neki object i pokušaš da pristupiš nekom njegovom null property-u (greškom naravno), onda ne dobijaš nikakav error.
primer:
a = obekat.nekiNepostojećiProperty;
trace( a ); // output: null

- Ako pokušaš da pristupiš property-u nekog već nepostojećeg objekta, onda iskače error "null object reference"
primer:
a = nullObjekat.nekiProperty;
>izbacuje error<
[ dalibor_zdravkovic @ 16.08.2010. 10:09 ] @
Citat:
StarCraft:

Ako pišeš sve u prvom frejmu timeline-a onda je this u stvari root, tj. Main (document) klasa, a ona nema parent.

Evo jedno kratko objašnjenje "kada iskače greška za null object":
- Ako imaš neki object i pokušaš da pristupiš nekom njegovom null property-u (greškom naravno), onda ne dobijaš nikakav error.
primer:
a = obekat.nekiNepostojećiProperty;
trace( a ); // output: null

- Ako pokušaš da pristupiš property-u nekog već nepostojećeg objekta, onda iskače error "null object reference"
primer:
a = nullObjekat.nekiProperty;
>izbacuje error<
 

Ma nije to problem.

Problem je kako da iz "MovieClip-a" pristupim objektima koji se nalaze u istom frejmu u kome je i sam "MovieClip", ustvari da pribavim objekat koji pretstavlja taj frejm pa da komandom "getChildAt(i)" tog objekta u petlji prodjem kroz sve objeket u datom frejmu ukljucujuci i sam "MovieClip" ali ono sto je bitno da se sve to radi u samom "MovieClipu" a ne u frejmu u kome je "MovieClip".
[ kelja @ 16.08.2010. 11:05 ] @
Nesto drugo je tu problem, ne ovaj kod, toliko mogu da kazem, jerbo ovaj tvoj kod radi. (Jednostavan test sa dva movie clipa u istom frejmu)

Citat:
U frejmu doadjme objekte komandom "addChild",


Mislim da je ovde uzrok problema, posalji ceo kod/fla fajl, pa ce ti neko vec pomoci. :)
[ StarCraft @ 16.08.2010. 13:36 ] @
Kolko sam ja skapirao, ti imaš Main klasu (da je tako nazovem, recimo) i iz nje si instancirao neki MovieClip koji je NekeKlase. I sad, ti hoćeš da ta NekaKlasa kontroliše ostale MovieClipove koji se nalaze "pored njega" tj. u Main klasi (u root-u stejdža)?

To je generalno najveći problem u AS3, što takav princip rada jednostavno više ne funkcioniše (nažalost) a mnogi vuku naviku takvog rada još iz AS2. Ranije je bilo dovoljno bilo-odakle jednostavno napisati _root.nešto.nešto i to bi radilo ko sat, a sada...
Gle, ako baš hoćeš da radiš na ovaj način, fora kako da dođeš do root-a je sledeća, ti treba da od current objekta (koji je NekeKlase) i kastuješ root tog objekta u "oblik" tvoje Main klase. Tako recimo, ako ti je document klasa zaista klase "Main" onda do root-a dolaziš uz pomoć sledećeg kôda:

var main:Main = Main(this.root);

I onda bi trebalo da možeš da pristupiš ostalim objektima u root-u normalno. Kažem "trebalo bi" zato što meni ovo čas radi - čas ne radi (iz apsolutno nepoznatih razloga) i verovatno je najbolje da ti Main klasa extenduje MovieClip (i uopšte je verovatno najbolje da svuda koristiš MovieClip umesto Sprite) zato što je MovieClip jedn aod retkih dinamičnih klasa koje ti dozvoljavaju da u njih beležiš custom promenljive "u letu". Npr:

var mc:MovieClip = new MovieClip();
mc.blabla = 5; // ovo može


var mc:Sprite= new Sprite();
mc.blabla = 5; // ovo ne može, izbacuje grešku

Vremenom sam shvatio da se ne isplati boriti se protiv toga, nego jednostavno treba promeniti način rada (jbg) tako da bi ti u stvari trebao da sve akcije definišeš unutar Main klase, a da Main klasa sluša eventove koje bacaju ti child objekti. Npr:

[ child movieClip baci event "obrišiOstaleObjekte" ] -> [ Main listenuje taj event i pokreće funkciju obrisiObjekte() ]

i onda, da mi Main klasa ne bi imala milion redova kôda, onda pravim "menager" klase za određene oblasti u mojoj aplikaciji. Evo upravo radim na virtuelnoj tastaturi koja stoji na ekranu da bi deca mogla da kucaju ćirilicu lakše uz pomoć miša. I onda sam napravio klasu pod nazivom "TastaturaMenager". I kada instanciram tu klasu, ona automatski postavi MovieClip tastature na ekran, inicijalizuje sve dugmiće da slušaju mouseEventove i reguliše prikaz otkucanih slova prilikom kucanja itd. Ta klasa naravno sadrži i public metodu obrišiTastaturu() koju samo pozovem kada mi tastatura više ne treba. Tako isto imam i menager klasu za galeriju slika, za tranziciju prilikom menjanja stranica u aplikaciji, za main meni koji je uvek vidljiv, itd.
[ dalibor_zdravkovic @ 17.08.2010. 15:22 ] @
Hvala ljudi. Tako sam na kraju i sam uradio. U Childu bacam evente a u roditeljskom objektu ih hvatam. Znaci ako is childa tereba nesto da uradim van njega kreiram event za to pa ga bacim u childu a uhvatim ga u roditejskom objektu i odradim sve stvari u roditeljskom objektu.
[ StarCraft @ 18.08.2010. 00:23 ] @
Da, ali i pored toga, ja uvek kada pravim instancu neke moje custom kalse, njoj predajem referencu ka Main klasi. Obično zatreba ;)