Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    passaggio comandi tra classi

    Non riesco a capire con in AS3 si faccia a fare questa cosa:
    ho una classe main con una funzione "update"
    in questa classe costruisco un oggetto della funzione "menu"
    posso all'interno di menu chiamare la funzione "update"?
    Credo proprio di sì, ma come?

    Vin ringrazio...
    ---smile is your life---:-)---

  2. #2
    Il procedimento più pulito per fare quello che chiedi è far dispacciare a menù un evento, che intercetti dalla main e all'handler chiami la funzione update.
    In alternativa dovresti fare la funzione update nella main pubblica, e poi ricavarti una referenza della main dal menù (var main:MovieClip = this.parent as MovieClip) e chiamare main.update(); ma è un modo osceno.

    Ti faccio l'esempio del primo metodo che ti dicevo io.

    Document Class
    Codice PHP:
    package
    {
        
    import flash.display.*;
        
    import flash.events.*;
        
        public class 
    Main extends MovieClip
        
    {
            private var 
    menu:MyMenu;
            
            public function 
    Main()
            {
                if (
    stageinit();
                else 
    addEventListener(Event.ADDED_TO_STAGEinit);
            }
            
            private function 
    init(e:Event null):void
            
    {
                if (
    eremoveEventListener(Event.ADDED_TO_STAGEinit);
                
                
    menu = new MyMenu();
                
    addChild(menu);
                
    menu.addEventListener(MyMenu.UPDATEupdate);
            }
            
            private function 
    update(e:Event null):void
            
    {
                
    trace("update!");
            }
        }

    Classe associata al menu
    Codice PHP:
    package
    {
        
    import flash.display.*;
        
    import flash.events.*;
        
        public class 
    MyMenu extends MovieClip
        
    {
            public static const 
    UPDATE:String "update";
            
            public function 
    MyMenu()
            {
                
    addEventListener(Event.ADDED_TO_STAGEinit);
            }
            
            private function 
    init(e:Event):void
            
    {
                
    removeEventListener(Event.ADDED_TO_STAGEinit);
                
                
    bottone.addEventListener(MouseEvent.CLICKonClick);
            }
            
                   
    // al click del bottone la classe dispaccia l'evento.
            
    private function onClick(e:MouseEvent):void
            
    {
                
    dispatchEvent(new Event(MyMenu.UPDATE));
            }
        }

    Praticamente quando viene cliccato il bottone (nome istanza bottone) dentro a menù, menù dispaccia l'evento che viene intercettato nella main, e viene così chiamata la funzione update (alla quale dai il null di default come parametro, così la puoi chiamare anche in maniera diretta nel corso della tua applicazione).

  3. #3
    Grazie Kaneda81, interessante come soluzione!
    Per quale ragione però usare gli init? Per purezza della soluzione oppure è strutturale... mi sfugge!

    Grazie comunque per l'interessante risposta!
    ---smile is your life---:-)---

  4. #4
    Per essere sicuro che il tuo oggetto abbia un valido riferimento allo stage.
    Sopratutto quando la tua classe è associata ad una clip in libreria è praticamente obbligatorio mettere un listener all'ADDED_TO_STAGE, in caso contrario otterresti degli errori.

  5. #5
    ancora più semplice è rendere la funzione pubblica

    Codice PHP:
    public function update():void 
            
    {           
      
    trace("update!");     
            } 
    poi per passre la main al menu è molto più semplice


    Codice PHP:
    menu = new MyMenu(this); 
    nel menu converti il this

    Codice PHP:

    private var myMain:*;
    ...
    public function 
    MyMenu(_main)
    myMain=_main
    e così hai la main dentro la classe menu senza fare parent e lazzi vari

    poi puoi tranquillamente chiamare la funzione pubblica, da menu e dalle altre classe se ti serve

    Codice PHP:
    myMain.update(); 
    Photogallery Flash Gratis - http://www.flashfiles.biz -
    Template in Flash con pannello di Amministrazione e deeplinking Guarda il template qui

  6. #6
    Per essere più semplice lo è, ma non è molto corretto dal punto di vista OOP (dove è raro dichiarare funzioni pubbliche, a meno di lavorare anche con le interfacce).
    Sarebbe più semplice anche dichiarare direttamente le variabili come public, così ci puoi accedere come ti pare ... però i getter & setter li hanno inventati apposta.

    Cmq, by the way, nel tuo esempio la variabile myMain non ha bisogno di essere tipizzata universalmente, dato che sarà sempre di tipo MovieClip (nel caso lavori con Flash). Volendo puoi anche non passarlo il main come paramentro, dato che telo ricavi con un this.parent as MovieClip.

  7. #7
    a livello teorico hai perfettamente ragione ma basta analizzare il codice di qualche classe tween, tweenmax, caurina ecc.. per rendersi conto di quanto siano comode le funzioni pubbliche.

    Fra l'altro in questo esempio la main la ricavi certamente da da un this.parent ma se tu dovessi passare un bottone istanziato nella main come lo ricavi? è molto più semplice passarlo per poi poterlo utilizzare.

    In vecchio post che nn trovo spiegavo ad un utente come utilizzare il dispatch di eventi personalizzati, sistema che io uso abbondantemente con le classi loader per caricare xml o file esterni a catena. Ma chi usa flash da tempo come me (versione 3) sa perfettamente che il puro OOP a volte va scavalcato utilizzando sistemi meno formali ma più funzionali.

    poi ognuno si gestisce a suo modo e quasto è chiaro
    Photogallery Flash Gratis - http://www.flashfiles.biz -
    Template in Flash con pannello di Amministrazione e deeplinking Guarda il template qui

  8. #8
    Assolutamente si
    E' chiaro anche che dipende dalle esigenze, sotto deadline stringenti e alla 230esima modifica che ti chiede il cliente mandi a putt... i canoni OOP e vai di metodi pubblici, basta che funziona e basta che ti levi di torno quel lavoro.
    Unica cosa è sempre meglio sottolineare le best practice, a maggior ragione a fronte di una richiesta di spiegazione o aiuto, così uno sceglie la strada che vuole seguire con cognizione di causa.

    Happy coding

  9. #9


    hai ragione

    sicuro che una buona classe scritta correttamente è sicuramente riutilizzabile molto meglio di una scritta tanto per far funzionare

    c'è anche da dire che importando la classe si aprono ancora altre possibilità
    Photogallery Flash Gratis - http://www.flashfiles.biz -
    Template in Flash con pannello di Amministrazione e deeplinking Guarda il template qui

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.