Marcin Knitter

Marcin Knitter Senior PHP Developer

Temat: AS3. Owoływanie się do obiektów/zmiennych w innych swf.

Witam!
Mam problem z odwołaniami do obiektów zawierających się wewnątrz załadowanych do filmu swf'ów.

SYTUACJA:
Mam 3 pliki swf: Player, Mapa, Kwadrat.
Po uruchomieniu pliku Player wczytywany jest za pomocą FUNKCJI plik Mapa (do którego podpięta jest klasa Loaderek - listing niżej), a następnie za pomocą klasy ładowany jest plik Kwadrat do swf'a Mapa.
Czyli otrzymuje takie schodki Player->Mapa->Kwadrat.

Problem polega na tym, że chcę odwołać się z kwadratu do pola txt w Player. Kiedy mapa wczytywała kwadrat za pomocą funkcji (tak jak Player wczytuje Mapę), mogłem odwoływać się do tego pola tekstowego w taki sposób:
(parent.parent... as Object).txt_php.text = "Napis";

Kiedy zmieniłem funkcje na klasę (która tworzy obiekt Loaderek), wyskakuje błąd gdy jest jedno parent:
"ReferenceError: Error #1069: Nie znaleziono właściwości txt_php w flash.display.Loader, a wartość domyślna nie istnieje.
at 2_fla::MainTimeline/frame1()"
A dla większej liczby parentów:
"TypeError: Error #1009: Nie można uzyskać dostępu do właściwości lub metody dla odniesienia do obiektu null.
at 2_fla::MainTimeline/frame1()"
Oczywiście próbowałem zastosować wiele wariantów z parentami.
Nie wiem co jest nie tak, jednak mogę przypuszczać, że jest to związane z klasą bo wcześniej działało. Proszę o pomoc.

Kod Klasy Loaderek:
package
{
import flash.display.*;
import flash.net.*;
import flash.events.*;
public class Loaderek extends Sprite
{
//Zmienne globalne
var pobieranieMapy:Loader;
public var kwadrat:MovieClip;
var iks:Number;
var igrek:Number;
//KONSTRUKTOR
public function Loaderek(adres:String, ikss:Number, igrekk:Number)
{
iks = ikss;
igrek = igrekk;
pobieranieMapy = new Loader();
pobieranieMapy.load(new URLRequest(adres));
pobieranieMapy.contentLoaderInfo.addEventListener(Event.INIT, poWczytaniuMapy);
//addChild(pobieranieMapy);
//trace("stworzono obiekt: "+pobieranieMapy);
}
private function poWczytaniuMapy(e:Event)
{
kwadrat = pobieranieMapy.content as MovieClip;
kwadrat.x = iks;
kwadrat.y = igrek;
kwadrat.width = 410;
kwadrat.height = 405.85;
//trace("stworzono obiekt: "+kwadrat);
addChild(kwadrat);
}
}
}


Kod wywołujący Loaderka:
var pliki = new Array(new Array(), new Array(), new Array(), new Array(), new Array(), new Array(), new Array(), new Array(), new Array(), new Array(), new Array(), new Array(), new Array(), new Array(), new Array(), new Array(), new Array());
function wczytywanieWstepne (x_m:Number, y_m:Number, sz_m:Number, w_m:Number, ilosc_wierszy:int, ilosc_kolumn:int, sz_m2:Number, w_m2:Number)
{
for (var i:int=0; i<ilosc_kolumn; i++) //w poziomie
{ for (var j:int=0; j<ilosc_wierszy; j++) //w pionie
{
var kw:String = "pliki/mapa2/kw/" + j + "-" + i + ".swf";
pliki[i][j]=newLoaderek(kw,i*410),j*405.85)); kw = null; //addChild(pliki[i][j]); }
}
}


Proszę o Pomoc!
Jak zmodyfikować z poziomu Kwadrat zmienić tekst w polu txt w Playerze? Może źle napisałem klasę? Muszę tworzyć obiekt jak tablicę gdyż mam wiele kwadratów do załadowania do mapy. I muszę mieć możliwość włączania i wyłączania ich ze sceny. Pozdrawiam

POMOCY!!Marcin Knitter edytował(a) ten post dnia 01.03.10 o godzinie 09:36
Marcin Knitter

Marcin Knitter Senior PHP Developer

Temat: AS3. Owoływanie się do obiektów/zmiennych w innych swf.

Pomóżcie proszę...
Piotr Mederak

Piotr Mederak Development Team
Leader

Temat: AS3. Owoływanie się do obiektów/zmiennych w innych swf.

zle do tego podchodzisz - nie powinienes nigdy odwolywac sie do funkcji rodzica. podstawy obiektowego programowania sie...

jesli chcesz do rodzica wyslac jakies dane - wywolaj zdarzenie w owym kwadracie, a w playerze ustaw listenera, ktory bedzie to zdarzenie przechwytywal i wykonywal akcje, ktora teraz probujesz za pomoca parentow wykonac - tj wpisac cos do pola tekstowego.
Piotr Mederak

Piotr Mederak Development Team
Leader

Temat: AS3. Owoływanie się do obiektów/zmiennych w innych swf.

mala podpowiedz:
http://livedocs.adobe.com/flash/9.0/ActionScriptLangRe...

drugi parametr 'bubbles' - jesli go ustawisz na true, to zdarzenie to przechwyci nie tylko Mapa, ale i wszystkie inne obiekty 'w dol', w tym Twoj Player
Marcin Knitter

Marcin Knitter Senior PHP Developer

Temat: AS3. Owoływanie się do obiektów/zmiennych w innych swf.

Dzięki za poradę, spróbuje przetestować to rozwiązanie z Eventem. Na razie kręcę się w kółko bo jestem raczej początkowym programistą OOP. Jeżeli mielibyście jeszcze jakieś uwagi lub strony które mogły by mi rozwiązać problem to nie krępujcie się i wrzucajcie tutaj.

Z góry dziękuje.

Pozdrawiam

Bardzo dziękuje Piotrku za podpowiedź.
Marcin Knitter

Marcin Knitter Senior PHP Developer

Temat: AS3. Owoływanie się do obiektów/zmiennych w innych swf.

Piotrku, czy mógłbyś napisać mi jakieś przykład takiego zdarzenia które przechwyci rodzic, w tym przypadku player.
Bo czynność przypisania wartości do pola txt rodzica ma się wykonać zaraz po załadowaniu pliku.

Pozdrawiam
Kuba Regucki

Kuba Regucki IT Team Leader

Temat: AS3. Owoływanie się do obiektów/zmiennych w innych swf.


class Dziecko extends Sprite{
function placz():void{
dispatchEvent(new Event("placze", true));
}
}

class Rodzic extends Sprite{
function Rodzic(){
addChild(new Dziecko());
addEventListener("placze", gdyPlacze);
}
function gdyPlacze(e:Event):void{
trace("nakarm");
}
}


Taki pseudokodzik.
Dzieci mogą mieć dzieci, rodzic wyłapie także ich płacz, dzięki bubbles=trueKuba R. edytował(a) ten post dnia 02.03.10 o godzinie 11:52
Marcin Knitter

Marcin Knitter Senior PHP Developer

Temat: AS3. Owoływanie się do obiektów/zmiennych w innych swf.

Wydaje się że dispatchEvent jest lekarstwem o które mi chodziło.
Dzięki za podpowiedz.Marcin Knitter edytował(a) ten post dnia 02.03.10 o godzinie 14:48
Marcin Knitter

Marcin Knitter Senior PHP Developer

Temat: AS3. Owoływanie się do obiektów/zmiennych w innych swf.

I chyba już mam ostatnie pytanie:

Jak użyć dispatchEvent w drugą stronę.
Tzn. mam 2 pliki jeden ładuje drugi.
Rodzic -> Dziecko

W Rodzic:

this.addEventListener("placze", gdyPlacze);

function gdyPlacze(e:Event):void{
trace("nakarm");
}


W Dziecko:

dispatchEvent(new Event("placze", true));

Ten kod nasłuchuje płaczu dziecka i kiedy Dziecko "płacze", Rodzic to usłyszy i przyjdzie coś zrobić.

ALE jak to wykorzystać w drugą stronę? Tzn. Kiedy Rodzic stoi na dzieckiem i się "uśmiechnie" to żeby dziecko (w Odpowiedzi) też się uśmiechnęło? (wiem że to przykład trochę toporny ale utrzymuje konwencje całego wątku) :)

Próbowałem tak, ale nie działa:
W Rodzic:

dispatchEvent(new Event("usmiech", true));


W Dziecko:

this.addEventListener("usmiech", gdySmiech);

function gdySmiech(e:Event):void{
trace("nakarm");
}


Proszę o radę. Pozdrawiam

Heh, może trochę jaśniej.
Chodzi o bliźniaki. Dziecko1 i Dziecko2. Kiedy rodzic uśmiechnie się chciałbym aby zarówno Dziecko1 jak i Dzicko2 zareagowały jednocześnie.
W swoim programie mam kilka potomnych klipów swf ładowanych do Playera i chciałbym aby jednym poleceniem od rodzica(playera) wszystkie niezależnie wykonywały zadane czynności. Przy tym nie chce odwoływać się do nich po imieniu (nazwie instancji). Stąd próby z parentami a teraz z dispatchEvent.Marcin Knitter edytował(a) ten post dnia 02.03.10 o godzinie 15:17
Marcin Knitter

Marcin Knitter Senior PHP Developer

Temat: AS3. Owoływanie się do obiektów/zmiennych w innych swf.

Wiem, że jestem już trochę męczący ale proszę was, pomóżcie mi jeszcze tym razem. Czekam z niecierpliwością i ze drżeniem :)
Kuba Regucki

Kuba Regucki IT Team Leader

Temat: AS3. Owoływanie się do obiektów/zmiennych w innych swf.

Prawie dobrze, tyle, że w rodzicu robisz np. tak:

var dziecko_1:Dziecko=new Dziecko();
dziecko_1.dispatchEvent(new Event("usmiech", true));


Jeśli chcesz wywołać to u wszystkich, to jakaś pętla.
Lub poczytaj o: broadcaster

Generalnie polecam google, ale trzeba wiedzieć czego szukać.
Na początek wystarczy rozwiązanie z pętlą - zbieraj dzieci do tabeli a w momencie gdy płaczą, pobieraj z niej elementy i wywołuj event lub po prostu funkcję w klasie Dziecko, wtedy listener nie jest potrzebny.
Andrzej Styś

Andrzej Styś Lorem ipsum ex modus
laboramus nam, duo
eu denique reform...

Temat: AS3. Owoływanie się do obiektów/zmiennych w innych swf.

Kuba R.:
Prawie dobrze, tyle, że w rodzicu robisz np. tak:

var dziecko_1:Dziecko=new Dziecko();
dziecko_1.dispatchEvent(new Event("usmiech", true));

Nie prosciej napisac publiczna metode
w klasie Dziecko i 'po prostu' ja wywolac:

class Dziecko extends Sprite{
public function usmiechajSieGowniarzu():void{
trace('sie smieje');
}

}



// a gdzies-tam w Rodzic:

dziecko.usmiechajSieGowniarzu();
Kuba Regucki

Kuba Regucki IT Team Leader

Temat: AS3. Owoływanie się do obiektów/zmiennych w innych swf.

Andrzej Styś:
Nie prosciej napisac publiczna metode
w klasie Dziecko i 'po prostu' ja wywolac:
Jasne, zaznaczyłem to na końcu. Kolega chciał na eventach...
Marcin Knitter

Marcin Knitter Senior PHP Developer

Temat: AS3. Owoływanie się do obiektów/zmiennych w innych swf.

Bardzo dziękuje - dzięki wam wszystko działa :)

Pozdrawiam
Marcin Knitter

Marcin Knitter Senior PHP Developer

Temat: AS3. Owoływanie się do obiektów/zmiennych w innych swf.

Witam, przepraszam że zaśmiecam forum ale coś się wydarzyło po stronie GoldeLine i do mojego tematu nie mogę wejść dlatego piszę teraz w moim starym poście bo jak by nie było problem dotyczy podobnych kwestii.
Mianowicie mam problem z migracją na Flash CS5.

OPIS PROBLEMU:
Mam do zaktualizowania projekt, w którym zagnieżdżono 2 pliki swf, jeden w drugim. Player wysyła wywołanie funkcji do obiektu klasy odpowiedzialnego za wczytanie Dziecka. Tutaj wszystko jest w porządku = parametr przekazany do klasy jest w niej widziany. Następnie publiczna funkcja w klasie ładującej plik (klasa Loaderek) ma ustawić wartość zmiennej globalnej w pliku Dziecka na wartość przekazaną do funkcji Loaderka. I tutaj klops. Wartość się nie ustawia, po prostu nic się nie dzieje. Oczywiście we flashu CS4 wszystko działa, dopiero po przekompilowaniu fla na CS5 zaczynają się kłopoty.

Czy macie może pojęcie co to może być?

KOD PROGRAMU:

(Player)
plikDziecka:Loaderek = new Loaderek();
addChild(plikDziecka);

.
.
.

button.addEventListener(MouseEvent.Click, przekazParametr);

function przekazParametr(e:Event)
{
plikDziecka.ustawParametr(true);
}


(klasa Loaderek)

public var pobieranieMapy:MovieClip;
public var kwadrat:MovieClip;

public function Loaderek()
{
this.pobieranieMapy = new Loader();
this.pobieranieMapy.load(new URLRequest(adres));
this.pobieranieMapy.contentLoaderInfo.addEventListener(Event.INIT, poWczytaniuMapy);
}

private function poWczytaniuMapy(e:Event)
{
.
.
.
this.kwadrat = this.pobieranieMapy.content as MovieClip;
.
.
.
}

public function ustawParametr(parametr:Boolean) //wartość parametru:
//parametr = true
{
this.kwadrat.stan_dymka = parametr;
}


kwadrat - właśnie plik swf dziecka
stan_dymka - zmienna którą chcę ustawić

(plik swf Dziecko)

var stan_dymka:Boolean = false
trace(stan_dymka); //daje cały czas false

.
.
.

ExternalInterface.call("alert", stan_dymka); //daje cały czas false

.
.
.


PRZYPUSZCZENIA:
Czy jest możliwe, że za całe zajście odpowiada jakiś konflikt z uprawnieniami?
A może ktoś z was miał podobny problem i potrafi mnie naprowadzić?

No powiedzcie sami - to nie ma prawa nie działać!? :-)

Z góry dziękuje za pomoc
Jerzy Wierzchowski

Jerzy Wierzchowski Senior Software
Developer

Temat: AS3. Owoływanie się do obiektów/zmiennych w innych swf.

a co jeślijeszcze się nie załdował?

plikDziecka:Loaderek = new Loaderek();
addChild(plikDziecka);

.
.
.

button.addEventListener(MouseEvent.Click, przekazParametr);

function przekazParametr(e:Event)
{
plikDziecka.ustawParametr(true); //WALI NULEM JEŚI KTOŚ KLIKNIE PRZED ZAŁADOWANIeM
}


Generalnie nie wiem co się u Ciebie dzieję... Wzorzec projektowy trochę "partyzantSolution" :)
Dziernałem coś takiego(moze mieć błedy pisałem na sucho z głowy:

package com
{
import flash.display.MovieClip;
import flash.events.Event;
/**
* ...
* @author Jerzy W
*/
public class MainSwf extends MovieClip
{
var chLoader:ChildrenLoader = null;
var children:Object = mull;
public function MainSwf() {
if (stage) {
init();
}else {
addEventListener(Event.ADDED_TO_STAGE,init)
}
}
private function init(e:Event = null)
{
chLoader = new ChildrenLoader();
addEventListener(ChildrenLoaderEvent.LOADCOMPLETE, loadComp);
chLoader.load("url do pliku swf");
}
private function loadComp(e:ChildrenLoaderEvent)
{
children = e.data;
children.smile();
}
}
}



package com
{
import flash.display.Loader;
import flash.display.MovieClip;
import flash.events.Event;
import flash.net.URLRequest;
/**
* ...
* @author Jerzy W
*/
private var loader:Loader
public class ChildrenLoader extends MovieClip
{
loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE , loaded);
}
public function load(url) {
loader.load(new URLRequest (url) );
}
private function loaded(e:Event)
{
var content:MovieClip = loader.content as MovieClip;
dispatchEvent(new ChildrenLoaderEvent( ChildrenLoaderEvent.LOADCOMPLETE, content) );
}
}



package com
{
import flash.events.Event;
/**
* ...
* @author Jerzy W
*/
public class ChildrenLoaderEvent extends Event
{
private var data:Object = null;
public static const LOADCOMPLETE = "load_complete"
public function ChildrenLoaderEvent(type:String , data:Object = null )
{
this.data = data;
super(type)
}
}
}



package
{
import flash.display.MovieClip;
/**
* ...
* @author Jerzy W
*/
public class NoughtyChild extends MovieClip
{
public function smile()
{
trace(" ZLOoooooooooooooooo 8D" );
}
}
}

Mam nadzieję że pomoże. W głównej klasie masz kilka linijek, bez bałaganu.Jerzy Roman Wierzchowski edytował(a) ten post dnia 22.06.10 o godzinie 15:52
Marcin Knitter

Marcin Knitter Senior PHP Developer

Temat: AS3. Owoływanie się do obiektów/zmiennych w innych swf.

Dzięki, za pomoc - zabieram się za studiowanie :)
Odnośnie do mojego "Partyzanckiego rozwiązania" - metody klasy "Loaderek" stosowane są po kliknięciu na obiekt w pliku dziecka - czyli siłą rzeczy plik musi być załadowany (dlatego nie muszę tego sprawdzać wcześniej).

Problem tkwi w czymś innym, jednak na razie nie odkryłem jeszcze w czym ;-P

Pozdrawiam

Edycja
Problem pojawia się w momencie gdy do pliku dziecka dodaje tekst typu TLFTextField (nowość w CS5) - w tym momencie psuje się komunikacja pomiędzy playerem a plikiem dziecka. Domyślam się, że wykorzystując nową funkcje programu Flash CS5 - plik dziecka (bo to w nim zagnieżdżam nowy tym tekstu) kompiluje się w nowy/dziwny sposób i plik wynikowy nie łączy się z plikiem Playera. Jeżeli komuś się coś nasunie to zachęcam do wypowiedzenia się na ten temat. Jeżeli znajdę rozwiązanie opisze je tutaj. Pozdrawiam wszystkich!Marcin Knitter edytował(a) ten post dnia 24.06.10 o godzinie 10:32



Wyślij zaproszenie do