Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 29
  1. #1

    [MX 2004] Aggiungere metodi personalizzati con eventi alla classe MovieClip

    in Flash MX se volevo aggiungere un metodo personalizzato ad una classe preesistente facevo:

    codice:
    MyClass.prototype.customMethod = function(){
       // azioni
    };
    se la stessa cosa la volevo fare per una classe preesistente tipo la classe MovieClip seguivo la stessa procedura, con la possibilità di creare metodi che sfruttassero gli eventi associati alla classe in questione, quindi ad esempio:

    codice:
    MovieClip.prototype.customMethod = function(){
       this.onEnterFrame = function(){
          // azioni
       };
    };
    Ieri sera guardando per la prima volta il nuovo AS ho visto che per creare una classe e quindi i propri metodi si crea il file esterno .as con il medesimo nome della classe che contiene la dichiarazione della classe ed il costruttore, quindi:

    codice:
    class MyClass{
       private var myName:String;
       // esempio di costruttore
       function MyClass(theName:String){
          this.myName =  theName;
       }
       // esempio di metodo
       function showName(){
          trace(this.myName);
       }
    }
    e fino qui non ci piove. Se voglio aggiungere funzionalità personalizzate alle classi preesistenti, ad esempio alla classe MovieClip in teoria la procedura è la seguente:

    codice:
    class CustomMC extends MovieClip{
       // costruttore
       // metodi
    }
    Ma ho notato che se io non istanzio la classe in pratica non riesco ad assegnare nessun nuovo metodo alle clip filmato presenti nel mio movie e in ogni caso, anche istanziando la sottoclasse non riesco ad avere nessun riferimento alla MovieClip che richiama i suoi metodi, quindi non riesco nemmeno ad assegnare delle azioni su un evento, tipo enterFrame.

    Ad esempio:
    codice:
    class CustomMC extends MovieClip{
       // costruttore
       function customMethod = function(){
          trace(this); // mi ritorna undefined;
          this.onEnterFrame = function(){
             // azioni  --> questo evento non viene preso in considerazione poiché non ho nessun riferimento all'istanza MovieClip che richiama il metodo customMethod.
          };
       }
    }
    qualcuno ha già affrontato il problema? Avete la soluzione? Sicuramente è una stupidaggine ma da ieri sera non ho ancora trovato la via migliore per capire come sbloccare il mio ragionamento.

  2. #2
    io posso dirti che il buon vecchio prototype mi sembra di gran lunga più comodo del "nuovo" metodo di implementare gli oggetti!

    però in teoria come hai fatto tu dovresti gia ereditare i metodi della classe MovieClip... hai provato ad estendere una classe che hai creato tu e provare ad utilizzarne i metodi?
    Tu non vedrai nessuna cosa
    al mondo
    maggior di Roma...
    Io su Flashkit.com

  3. #3
    rileggendo bene, in realtà tu non hai nessun riferimento a MovieClip, ma semplicemente ne dovresti ereditare i metodi quindi non capisco il problema... siamo alle solite questo secondo me è un aggiornamento del tutto inutile di flash MX2004
    Tu non vedrai nessuna cosa
    al mondo
    maggior di Roma...
    Io su Flashkit.com

  4. #4
    Diciamo che non è inutile, perché il modo in cui vengono gestite ora le classi è davvero OOP, peccato che però il compilatore continui a compilare in AS 1.0, quindi in realtà è tutto lavoro inutile dato che a livello di risultato non se ne trae alcun beneficio, è il metodo di lavoro che c'è dietr che diventa sicuramente più professionale.

    In realtà ho provato con una mia classe e funziona tranquillamente, il problema l'ho riscontrato solo con la classe MovieClip per adesso e sinceramente non riesco a trovare da dove iniziare il mio ragionamento affinché sia corretto.

  5. #5
    Con AS 1.0 per poter utilizzare gli eventi MovieClip devi cmq registrare una classe su un movieClip (come si fa per i componenti) e devi istanziare il clip sullo stage
    codice:
    #initclip
    CustomClass = function () {
    	this.init();
    };
    CustomClass.prototype = new MovieClip();
    CustomClass.prototype.init = function() {
    	this.cont = 0;
    	trace(this.cont);
    	this.onEnterFrame = function() {
    		this.cont++;
    		trace(this.cont);
    	};
    };
    Object.registerClass("mioClip", CustomClass);
    #endinitclip
    se allo stesso modo non associ la classe ad un clip, ma istanzi semplicemente un istanza della classe allora i metodi di MovieClip non funzionano lo stesso:
    codice:
    _global.CustomClass = function () {
    	this.init();
    };
    CustomClass.prototype = new MovieClip();
    CustomClass.prototype.init = function() {
    	this.cont = 0;
    	trace(this.cont);
    	this.onEnterFrame = function() {
    		this.cont++;
    		trace(this.cont);
    	};
    };
    myObject=new CustomClass();
    quindi quello che fai tu non è aggiungere/definire il metodo onEnterFrame della classe MovieClip (cosa che non so fare davvero con la nuova sintassi) ma definire l'evento onEnterFrame ereditato dalla classe MovieClip nella tua classe e quindi solo per gli oggetti di quella nuova classe, che peraltro nello specifico per poterlo utilizzare devi comunque registrare la classe su un movieCLip come ho fatto nel primo esempio

    Spero (ma non credo ) di essere stato chiaro

    Ciao
    Tu non vedrai nessuna cosa
    al mondo
    maggior di Roma...
    Io su Flashkit.com

  6. #6
    Tutt'altro, sei stato molto chiaro, il problema è capire se anche con AS 2 vale la stessa regola e se sì come viene applicata

  7. #7
    io credo che valga la stessa regola, e credo anche che non si potranno più "estendere" gli oggetti predefiniti (MovieClip ecc), e qui sta il vero limite provocato dalla scomparsa di prototype, ma semplicemente bisognerà definire delle classi che ereditano da MovieClip ecc... e definirne gli eventi (metodi) solo per le sottoclassi, non si possono quindi (credo sia così) aggiungerne nuovi o definire gli eventi di MovieClip per tutti i movie clip cosa che prototype ti permetteva! (mamma mia come scrivo!!!!)

    A questo punto tu dovresti definire la tua classe come hai fatto prima, ereditando (extends) i metodi da MovieClip, e registrare tale classe sui clip dove vuoi utilizzarla scrivendo nel primo fotogramma dei clip:

    codice:
    #initclip
    // mioclip è il nome di concatenamento del clip non il nome di istanza
    Object.registerClass("mioClip", CustomClass);
    #endinitclip
    Tu non vedrai nessuna cosa
    al mondo
    maggior di Roma...
    Io su Flashkit.com

  8. #8
    forse prototype aggiungeva solo una grande estendibilità al metodo di implementazione, ora non è detto che passare al classico metodo di definizione delle classi sia più professionale, perchè anche le classi create come si faceva prima erano professionali in quanto le funzionalità erano le stesse, si poteva ereditare ad esempio che è la prima peculiarità della programmazione ad oggetti, ma si poteva anche estendere una classe senza doverne creare una nuova che ereditava dalla classe principale (qui si entra in un ciclo infinito )!

    Aspetto delucidazioni anche io!
    Tu non vedrai nessuna cosa
    al mondo
    maggior di Roma...
    Io su Flashkit.com

  9. #9
    Ok, aspettiamo, in ogni caso non è vero che non si possono più estendere le classi predefinite, sul manuale di AS 2 c'è perfino un esempio con la classe Sound e dice che si deve creare una sottoclasse, proprio come ho scritto nel mio esempio. Solo che non sembra ereditare il riferimento all'istanza corrente, o sicuramente sbaglio qualcosa io

  10. #10
    è appunto quello che ti dicevo io... cioè per estendere una classe devi crearne una che eredita dalla prima... in realtà poi utilizzerai la sottoclasse però per utilizzarne i nuovi metodi!

    dall'istanza non eredita nulla, perchè un nuovo oggetto sarà una nuova istanza! tu erediti metodi e proprietà dalla classe e non dalle istanze, ad esempio la proprietà position di Sound ti indicherà la proprietà position della tua istanza e di nessun'altra la definizione della classe è una cosa, l'oggetto (istanza) è un altra.

    EVVIVA IL PROTOTYPE
    Tu non vedrai nessuna cosa
    al mondo
    maggior di Roma...
    Io su Flashkit.com

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.