obiectele din flash


vectorialpx


avem asa:

CODE
class myClas {

var but = null;

function myClass(obj){
this.but = obj;
this.but.onRelease = function(){
this.alta(); // ca sa am OUTPUT 'ceva'
// DAR acum this NU mai face parte din clasa mare, e un alt obiect
// so, cum as putea apela functia alta() ? huh.gif
// cred ca ar trebui ceva gen PARENT, cum are PHP sau, nu stiu..
// as prefera sa nu fie nimic "static"
}
}

function alta() { trace('ceva'); }

}
sergiu_spooky
Nu are absolut nicio legătură cu clasele sau obiectele.

CODE
var but = new Button();
this.but.onRelease = function(){
this.alta();
}
function alta() { trace('ceva'); }


Codul ăsta nu o să facă ce vrei tu nici în afara unei clase. De ce? Simplu. Așa e gândit AS2, e o regulă stabilită de proiectanții limbajului.

Nu e cod valid, dar așa o să înțelegi:
CODE
this.foobar() {
// aici this = _root
this.orice.foo() {
// aici this = _root.orice
this.orice.ion.bar() {
// aici this = _root.orice.ion
}
}
}


Da, fiind vorba de instanțe de MovieClip și Button poți să folosești this._parent.
_root.orice.ion._parent = _root.orice
Te sfătuiesc să renunți la AS2 și să treci la AS3 dacă vrei să poți controla totul și vrei să folosești clase. AS2 e la nivelul JavaScript, AS3 e la nivelul Java.


Ai auzit de încapsulare? De ce ai vrea să folosești clase dacă nu respecți principiul de bază? Folosești absolut degeaba clase și complici și mai tare codul dacă vrei așa ceva, nu simplifici nimic.
Dacă vrei să apelezi o funcție din afara clasei atunci trebuie ca acea clasă să primească referință către părintele funcției respective la inițializare.

CODE
class foo {
var parent = null;
function foo(parent) {
this.parent = parent;
}

function say() {
this.parent.say();
}
}

function say() {
trace('Hello Dolly!');
}

var a:foo = new foo(this);
a.say();


Flash Player nu are de unde să știe ce înseamnă părintele unei clase, cum de altfel nu se poate în niciun alt limbaj. Se poate totuși cunoaște părintele unei instanțe a unei clase (= un obiect), dar doar dacă există un mecanism special pentru asta. proprietatea parent a clasei foo în cazul de sus e tocmai mecanismul ăsta. E identic cu ce face automat Flash Player legat de propietatea _parent a MovieClip-urilor, unde nu specifici tu care e părintele la inițializarea obiectului ci o face el automat.
 
vectorialpx
am nevoie de clase pentru ca am nevoie de obiecte... oarecum. Vreau sa fac ceva generic si sa fac un lant de functii ar fi destul de aiurea. Referitor la AS3, cu scuzele de rigoare, au stricam ceea ce-a inceput Macromedia [partial, cel putin] si, (probabil si pentru ca nu am inceput eu sa invat inca) mi se pare o mare prostie.
Whatever... trecem peste.

deci, ce ai scris tu...

CODSURSA
var but = new Button();
this.but.onRelease = function(){ this.alta(); } function alta() { trace('ceva'); }


nu merge... sau cel putin, nu la mine, care am toate astea intr-o clasa.
Si, are legatura cu clasele, pentru ca "this" este foarte generic, adica se refera la obiect in toata "abstratitatea"[scuze de inventie!] lui.
nu functioneaza nici this._parent.alta();

Sa repet ce-am scris mai sus, cu detalii... poate sunt si astea importante.
CODSURSA
class some {
    var ob = new Array();

    function some(clp) {
        this.ob = clp;
        // de fapt, e un array cu movieClip-uri
        for (i=0; i<this.ob.length; i++) {
        // parcurgem acest array
            var temp = this.ob[i].but;
            temp.id = i;
            // avem in CLP un buton, "but"
            temp.onRelease = function() {
                // ??? aici apare problema
                this.other(this.id);
            };
        }
    }
    function other(ce) {
        trace('other - '+ce);
    }
}
sergiu_spooky
Cum am mai spus, this în cazul tău nu se referă la un obiect de tip "some" ci la MovieClip-ul "temp".
În contextul unui event listener al unui obiect (onRelease al lui "temp"), this = obiectul respectiv(this="temp").
Asta ar însemna că "temp" trebuie să aibe o metodă cu un parametru numită "other", dar "other" la tine e o metodă în interiorul clasei și nu te ajuta cu nimic pentru că this = "temp" iar _parent e proprietate a MovieClip-urilor, nu există așa ceva în cadrul structurii codului și nu există în niciun limbaj.

Ce vrei tu nu se poate. Ori ai acces la MovieClip-ul care a declanșat event-ul release, ori ai acces la metodele clasei.
Dacă vrei acces la metodele clasei poți folosi clasa Delegate:

CODE
// în constructor
temp.onRelease = mx.utils.Delegate.create(this, release);
function release() {
this.other('other');
// this.id nu mai funcționează pentru că this=obiect de tip "some", nu MovieClip-ul care a declanșat event-ul
}



Dacă ai fi avut un singur MovieClip care să declanșeze event-ul atunci l-ai fi putut declara proprietate a clasei și ai fi avut acces la el în listener ca variabilă a părintelui:

CODE
var b = null; // proprietate a clasei

// in constructor
b = temp;
temp.onRelease = mx.utils.Delegate.create(this, release);
function release() {
this.other(this.b.id);
}


Dar cu mai multe MovieClip-uri care pot declanșa același event nu mai ai cum să aflii în listener care anume l-a declanșat.

Soluția venită o dată cu AS3 e ca event listener-ii să primească parametru un obiect de tip Event la declanșare în care se pot transmite orice informații, inclusiv obiectul care a declanșat event-ul.
Mecanismul era existent și în AS2 încă de la versiunea CS4 (AS2 Langref), până la care nu exista așa ceva oficial dar era destul de ușor să îți scrii o clasă proprie care să facă același lucru ca și clasa EventDispatcher apărută mai târziu.

După cum vezi în AS2 te poți lovi relativ repede de probleme fără o soluție simplă și bună. Pe lângă asta te încurajează să gândești că dacă îți e ție, ca începător, mai ușor să programezi AS2 înseamnă că AS3 e o prostie.
Adevărul e că ambele își au rostul lor și mulți se pot mulțumi cu facilitățile oferite de AS2 atâta timp cât nu încearcă lucruri mai complexe.

Ce ai testat tu e greșit. Am specificat că acel cod rulează în afara unei clase. Scopul lui era de a te face să înțelegi în ce context funcționează _parent, proprietate a MovieClip-urilor și ce înseamnă this în interiorul unui event listener.
vectorialpx
ok. 10x!

Da, si eu am specificat ca e posibil sa nu-mi palca AS3 pentru ca nu l-am invatat... asta nu inseamna ca e "o prostie".

Stiu ca e foarte puternic dar, ceea ce voiam sa zic, este ca acest "the new" AS este de fapt un AS2 "reinventat", cu destul de multe diferente. Asta ca un comment la ceea ce zic cei de la Adobe, ca este asemanator, compatibil, bla bla, dar in acelasi timp, in manual scriu
- A single SWF file cannot combine ActionScript 1.0 or 2.0 code with ActionScript 3.0 code
- ActionScript 3.0 code can load a SWF file written in ActionScript 1.0 or 2.0, but it cannot access the SWF file's variables and functions.
- SWF files written in ActionScript 1.0 or 2.0 cannot load SWF files written in ActionScript 3.0
-- si asa mai departe

Deci, compatibiltatea e de fapt un soi de marketing ieftin... Whatever, multam inca o data!
O sa imi iau gandul de la clase, și fac băbește.
Fl4SH'ER
CITAT (vectorialpx @ 13th July 2009, 16:26) *
Stiu ca e foarte puternic dar, ceea ce voiam sa zic, este ca acest "the new" AS este de fapt un AS2 "reinventat", cu destul de multe diferente. Asta ca un comment la ceea ce zic cei de la Adobe, ca este asemanator, compatibil, bla bla, dar in acelasi timp, in manual scriu
- A single SWF file cannot combine ActionScript 1.0 or 2.0 code with ActionScript 3.0 code
- ActionScript 3.0 code can load a SWF file written in ActionScript 1.0 or 2.0, but it cannot access the SWF file's variables and functions.
- SWF files written in ActionScript 1.0 or 2.0 cannot load SWF files written in ActionScript 3.0
-- si asa mai departe

Deci, compatibiltatea e de fapt un soi de marketing ieftin... Whatever, multam inca o data!
O sa imi iau gandul de la clase, și fac băbește.

Nu stiu ce articole ai citit tu, dar eu nu tin minte sa fi dat vreodata peste un articol scris de cei de la Adobe unde sa se laude de compatibilitatea AS 3.0 cu versiunile mai vechi. Ar fi si normal sa fie asa din cauza ca AS 3.0 e construit cam de la 0 ( prin sintaxa mai seamana cu AS 2.0, ai dreptate, dar felul in care functioneaza e diferit pe putin spus fata de restul versiunilor ).

Iar treaba cu comunicarea nu e chiar asa cum spune cea de a doua liniuta. Este adevarat ca nu poti comunica chiar in orice fel din AS 3.0 cu o versiune mai veche dar exista ExternalInterface-u care ofera posibilitatea comunicarii. Iar faptul ca un .swf compilat cu o versiune mai veche sa nu poate incarca un .swf care contine cod AS 3.0, mi se pare normal ( pana la urma, avem si 2 VM-uri diferite pentru cele 3 versiuni ). Cum spuneam, diferentele sunt extrem de mari iar o versiune veche, normal, nu poate rula ceva ce are o structura total diferita si functioneaza total diferit ( si nici nu cred ca au avut ca si scop o astfel de compatibilitate ).

EDIT: Asa, nu am dat cu scroll-u suficient ca sa vad ce scrie in primul post... Daca vrei apelezi functia 'alta' atunci in AS 2.0 ai fi facut cu _root.alta(); In legatura cu AS 2.0 vs 3.0, simplu: AS 2.0 e praf ( atat la performanta cat si la orice iti vine in minte ). Daca esti "scripter" care face copy-paste la bucati de cod si arunca linii cu lopata, atunci da, go PHP, go Javascript, go AS 2.0. Dar in caz de esti programator care chiar vrea sa faca ceva calumea, atunci go ASP.NET, go Java, go C# si go AS 3.0! Asta pe scurt...

PS: "clasele" pe care le poti scrie in AS 2.0 ma fac sa plang... serios, nu merita efortul, invata AS 3.0 daca chiar vrei sa lucrezi "the OO way".
sergiu_spooky
"Daca vrei apelezi functia 'alta' atunci in AS 2.0 ai fi facut cu _root.alta();"
Ar merge dacă "alta" nu ar fi membru în clasă și dacă am fi siguri că nu o să folosească clasa decât în locul unde a fost definită.
 
Fl4SH'ER
Nu am mai putut edita post-u, am vazut si eu greseala. Prima oara nu mi-a sarit in ochi ca are o clasa acolo si nu doar cod paste-uit de pe timeline... asta e.
vectorialpx
bine, sunt programator, nu "programator" si, nu "pestuiesc" cod, asta ca sa se stie de la inceput smile.gif
Adica, daca eram "programator" nu ma apucam sa scriu o clasa... whatever.

CITAT
Daca esti "scripter" care face copy-paste la bucati de cod si arunca linii cu lopata, atunci da, go PHP, go Javascript, go AS 2.0. Dar in caz de esti programator care chiar vrea sa faca ceva calumea, atunci go ASP.NET, go Java, go C# si go AS 3.0! Asta pe scurt...

Fiecare cu parerea lui si cu domeniul lui dar, nu cred ca ar trebui sa jignesti programatorii PHP, Javascript sau AS2 doar pentru ca stii tu AS3, .NET, Java sau C#. Referitor la web, atat .NET cat si Java au probleme serioase... iar C# nu prea-si are locul aici [decat vag]. Nu vreau sa intram in polemici... inchei aici smile.gif

Am incercat si _root, pentru ca am incercat cam tot ce se putea. PHP are "parent::", si m-am gandit ca merge si la Flash cu parent... apoi am vazut ca apartine de AS3 tongue.gif

Oricum, multam pentru timp
sergiu_spooky


Scuză-mă, dar încurci lucrurile rău de tot.
1) Nu văd ce legătură are PHP-ul cu ActionScript-ul. Nu au absolut nicio legătură.
2) Scopul lui parent într-o clasă PHP e de a avea acces la metoda suprascriă de o clasă care extinde clasa inițială. Nu are absolut nicio legătură cu situația ta din ActionScript, care e strict legată de arhitectura dispatcher-event-listener implementată de AS2.

NU mai compara PHP cu ActionScript. Niciodată. Nu au nicio legătură.
Toată treaba cu parent e artificială (decât în cazul de la punctul 2 în care își are rostul dar nu e nicidecum ce crezi tu că e). Niciun limbaj nu ar trebui să mențină referințe pe care programatorul nu le-a cerut explicit sau care nu țin de buna funcționare.
În primul rând ar trebui să poți face distincție clară între o clasă și un obiect, adică o instanță a unei clase. O clasă poate să aibe un parametru parent, dar el nu are nicio semnificație în aplicația ta. Îi dai semnificație când instanțiezi clasa și inițializezi proprietatea parent cu o valoare utilă pentru tine. Dacă limbajul ar menține proprietatea asta automat și ar seta-o la instanțiere atunci ai avea o groază de referințe inutile: a) pentru că aproape întotdeauna nevoia unei astfel de referințe înseamnă o greșeală de design a aplicației; cool.gif pentru că ai avea referințe circulare peste tot și aș vrea să te văd cum serializezi așa ceva fără compicații; c) pentru că există cazuri în care o să vrei să controlezi manual valoarea lui parent. Deși probabil nu ai folosit serializarea niciodată, într-o aplicație server-client cu mai multe limbaje și platforme implicate serializarea e esențială.

Dacă vrei așa ceva te sfătuiesc să folosești o arhitectură proprie, gândită bine înainte.
Fl4SH'ER
@ vectorialpx: Nu jignesc pe nimeni, atat PHP, Javascript cat si AS 2.0 sunt "scripting language" -> cei care folosesc aceste limbaje "script-uiesc" ( bine, ar fi exceptie daca la PHP folosesti un framework gen Zend ). Din experienta mea, atat C# cat si Java stau mercy foarte bine... nu stiu la ce probleme te referi. Am enumerat Java, C# si AS 3.0 din cauza ca sunt limbaje OOP ( AS 3.0 este prima versiune care chiar face trecerea de la "scripting" la "programare efectiva"... evident, trebuie sa ai si oameni care sa nu scrie cod pe timeline all the time ).

Nu repet ceea ce a spus si Sergiu mai spus, dar daca vrei sa faci mai mult decat bannere si site-uri cu 4-5 butoane atunci AS 3.0 is the way to go ( chiar si pentru site-uri cu 3-4 butoane daca e pana acolo ). De fapt, in parerea mea, toti cei care inca mai scriu cod in AS 2.0 sau fac aplicatii extrem, extrem de simple sau pur si simplu nu le merge rotitza si nu inteleg ca AS 2.0 e expirat de o vreme buna... sa continui sa script-uiesti pe AS 2.0 nu e altceva decat o pierdere imensa de timp.
vectorialpx
CITAT (""sergiu)
Scuză-mă, dar încurci lucrurile rău de tot.
1) Nu văd ce legătură are PHP-ul cu ActionScript-ul. Nu au absolut nicio legătură.
2) Scopul lui parent într-o clasă PHP e de a avea acces la metoda suprascriă de o clasă care extinde clasa inițială. Nu are absolut nicio legătură cu situația ta din ActionScript, care e strict legată de arhitectura dispatcher-event-listener implementată de AS2.

Nu, nu incurc... i-am dat doar un raspuns lui Fl4SH'ER.
CITAT ("vectorialpx")
m incercat si _root, pentru ca am incercat cam tot ce se putea. PHP are "parent::", si m-am gandit ca merge si la Flash cu parent...

Am vrut sa zic faptul ca am incercat mai multe... si parent si _root si _parent, pentru ca nu stiam ce sa fac. Apoi mi-ai dat tu raspunsul pe care speram sa nu-l citesc: nu se poate in AS2, si am inteles. Nu stiu de unde ati dedus confuzia.

Nu sunt expert in nic-unul din cele doua [PHP or Flash] dar am o oarecare experienta si, stiu diferentele, crede-ma. Si, da stiu ce e serializarea [nu-s chiar la nivelul in care sa nu stiu ce se afla intr-un fisier de sesiuni... e doar un exemplu, sper sa nu se ajunga la alte confuzii] si da, stiu si despre ce vorbesti smile.gif


CITAT ("Fl4SH'ER")
Din experienta mea, atat C# cat si Java stau mercy foarte bine...

Da, dar pe domeniul lor. Desktop da, sunt foarte OK dar... referitor la web [ca eu asta fac], dintre PHP si .NET prefer PHP [am un car de motive, printre care 'gratuitate', portabilitate si multe altele. PHP5+ este foarte puternic, deci nu se pune problema de inferioritate], intre Java si Javascript, prefer Javascript, care desi e mai limitat, e web-based si, repet, ma refer la domeniul web strict. Daca te referi la JSP [care e cu totul alt drac], tot PHP prefer. Intre AS2 si AS3, o sa prefer AS3 cand o sa ma apuc de invatat... cam atat, nu confund nimic.

[offtopic] [no-offence] Nu vreau sa-mi vizitati site-ul sau sa ma cautati pe Google [e stupid!!] dar mi se pare aiurea atitudinea cu privirea atat de "de sus" pentru o persoana necunoscuta. Cum ziceam, multumiri pentru lamurire si, sunt recunoscator, nu e la misto.

Am rezolvat clasic si static. Aveam nevoie sa-mi fac o componenta checkbox si radio printr-o singura clasa... am renuntat pentru ca m-am enervat si pentru ca aveam multe altele de facut [time is money, vorb-aia!]. Voiam ceva generic, cu grafica proprie pentru ca aproape toate componentele Adobe/Macromedia mi se par foarte greoaie pentru ceea ce am eu nevoie. Customizarea lor necesita mult timo si multe resurse inutile pentru a ajunge la o forma mai complexa/proprie.

Cheers!
Aceasta este o versiune simplificată a paginii originale. Pentru a vizita versiunea originala click aici.