Questa discussione continua da qui
Questa discussione continua da qui
Cominciamo dal commento sul codice:
codice:#initclip // Non chiamare una classe Class... :) // Chiamala con un nome che: // 1. non sia una parola chiave, come lo è Class in flash mx 2004 // 2. sia un po' esplicativo, ad esempio: FaderClass = function () { this.init(); }; // l'oggetto prototype della Classe deve essere definito // come un nuovo MovieClip, non l'oggetto prototype di ogni // istanza. quindi questa riga va fuori, definita una volta sola FaderClass.prototype = new MovieClip(); // e definisco il metodo enterFrame nella funzione richiamate nel costruttore FaderClass.prototype.init = function() { // definiscili dentro la funzione init // e usa percorsi relativi this.fadein_btn.onRelease = function() { this._parent.fade_in(); }; this.fadeout_btn.onRelease = function() { this._parent.fade_out(); }; this.onEnterFrame = function() { this.fade(); }; }; // Metodo che setta l'oggetto target del mio componente FaderClass.prototype.setObject = function(oggetto) { this.oggetto_fade = oggetto; }; // metodi che controllano il fade dell'oggetto target FaderClass.prototype.fade_in = function() { this.start_fade_in = true; this.start_fade_out = false; }; FaderClass.prototype.fade_out = function() { this.start_fade_in = false; this.start_fade_out = true; }; FaderClass.prototype.fade = function() { if (this.oggetto_fade._alpha>0 && this.start_fade_out == true) { this.oggetto_fade._alpha -= 5; } else { this.start_fade_out = false; } if (this.oggetto_fade._alpha<100 && this.start_fade_in == true) { this.oggetto_fade._alpha += 5; } else { this.start_fade_in = false; } }; // Registro la classe "FaderClass" e la associo al mio componente Object.registerClass("FaderSymbol", FaderClass); #endinitclip
Ora, senza dover richiamare il metodo setObject, hai la possibilità di passare il parametro automaticamente alla creazione di un'istanza del componente (questo senza il pannello "Component Parameters").
Togli il componente dallo stage, e scrivi invece come codice:
codice:this.attachMovie("FaderSymbol", "fader", 1, {oggetto_fade: istanza_mc_target});
Ok
Gli eventi dei pulsanti li avevo scritti fuori da init clip perchè non ero riuscito a metterli dentro la classe! Dici cmq che è sbagliato anche se funziona?
questa non l'ho capita beneOriginariamente inviato da negatyve
Cominciamo dal commento sul codice:
codice:... // l'oggetto prototype della Classe deve essere definito // come un nuovo MovieClip, non l'oggetto prototype di ogni // istanza. quindi questa riga va fuori, definita una volta sola FaderClass.prototype = new MovieClip(); ...
Quindi riepilogando nel metodo di "inizializzazione della classe" bisogna inserire
- I metodi o eventi relativi ai clip o pulsanti contenuti nel componente
- tutti gli eventuali metodi di MovieClip ereditati dalla classe *
* Mi spiegheresti anche il motivo di questo?
Funziona!Originariamente inviato da negatyve
Ora, senza dover richiamare il metodo setObject, hai la possibilità di passare il parametro automaticamente alla creazione di un'istanza del componente (questo senza il pannello "Component Parameters").
Togli il componente dallo stage, e scrivi invece come codice:
codice:this.attachMovie("FaderSymbol", "fader", 1, {oggetto_fade: istanza_mc_target});
mi piace questa discussione![]()
>Dici cmq che è sbagliato anche se funziona?
mah, concettualmente si, dato che comunque sono i medoti della Classe che gestiscono gli oggetti contenuti nell'istanza..
>questa non l'ho capita bene
questa riga:
serve a far ereditare a tutte le istanze della Classe FaderClass tutti i metodi della Classe MovieClip. Ora, dato che tutte le istanze ereditano i metodi tramite l'oggetto prototype, questo può essere sovrascritto, come in questo caso, una sola volta: non ha senso sovrascriverlo ogni volta che viene instanziata un nuovo oggetto..codice:FaderClass.prototype = new MovieClip();
>Quindi riepilogando nel metodo di "inizializzazione della
>classe" bisogna inserire
non *bisogna* inserire niente, dato che il metodo "init" è solo una prassi diffusa, assolutamente non necessario. potresti scrivere, avendo gli stessi effetti e risparmiando memoria:
ma utilizzare un altro metodo (init, comunemente) è meglio come pratica (considerando anche che non "sporchi" la funzione di costruzione)codice:FaderClass = function() { // definiscili dentro la funzione init // e usa percorsi relativi this.fadein_btn.onRelease = function() { this._parent.fade_in(); }; this.fadeout_btn.onRelease = function() { this._parent.fade_out(); }; this.onEnterFrame = function() { this.fade(); }; };
>I metodi o eventi relativi ai clip o pulsanti
>contenuti nel componente
non è "obbligatorio", è una buona norma, se i metodi gestiscono questi oggetti (solitamente si creano delle Classi per gestire i dati, che ereditano le une dalle altre, e poi una classe finale che gestisce gli oggetti contenuti nell'istanza. ora, non è necessario che vengano definiti lì, ma sempre buona norma che vengano definiti tramite un metodo della Classe, e non al di fuori della sua definizione
>tutti gli eventuali metodi di MovieClip ereditati dalla classe
affatto, anzi, il sistema di usare quell'onEnterFrame non è proprio un granchè.. sarebbe meglio utilizzare un setInterval, da impostare solo quando premi i pulsanti, invece che avere un ciclo continuo anche quando non è necessario..
Ok, magari poi sul fatto di separare le classi per la gestione dei dati (anche se non ho capito cosa intendi per dati) e la classe per gestire gli oggetti faremo un'approfondimento in futuro?Originariamente inviato da negatyve
>I metodi o eventi relativi ai clip o pulsanti
>contenuti nel componente
non è "obbligatorio", è una buona norma, se i metodi gestiscono questi oggetti (solitamente si creano delle Classi per gestire i dati, che ereditano le une dalle altre, e poi una classe finale che gestisce gli oggetti contenuti nell'istanza. ora, non è necessario che vengano definiti lì, ma sempre buona norma che vengano definiti tramite un metodo della Classe, e non al di fuori della sua definizione
Diciamo però se ad esempio io ho un evento onData però sarebbe opportuno metterlo lì?Originariamente inviato da negatyve
>tutti gli eventuali metodi di MovieClip ereditati dalla classe
affatto, anzi, il sistema di usare quell'onEnterFrame non è proprio un granchè.. sarebbe meglio utilizzare un setInterval, da impostare solo quando premi i pulsanti, invece che avere un ciclo continuo anche quando non è necessario..
Appunto io non ho capito perchè non funziona se io definisco i metodi ereditati da MovieClip fuori da un metodo della classe stessa in questo modo:
codice:FaderClass.prototype.onEnterFrame = function(){ ... };
Come no, questa cosa funziona benissimo:
solo che non è buona pratica...codice:FaderClass.prototype.onEnterFrame = function() { this.fade(); } FaderClass.prototype.init = function() { // definiscili dentro la funzione init // e usa percorsi relativi this.fadein_btn.onRelease = function() { this._parent.fade_in(); }; this.fadeout_btn.onRelease = function() { this._parent.fade_out(); }; };
Si è vero funzionaOriginariamente inviato da negatyve
Come no, questa cosa funziona benissimo:
...
solo che non è buona pratica...avevo dimenticato di inserire prototype quando l'avevo provata!
Per me sarebbe solo un modo di rendere il codice più pulito e distinguere gli eventi (metodi) del clip/componente da quelli della classe...
L'inglese lo leggi (e capisci) bene?