Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    22

    [AS3] Gestire istanze dalla DocumentClass

    Buongiorno!
    Ho un problema da principiante. E' un pò che studio as per esempi ma quando provo a fare qualcosa di mio è un dramma... Vi prego un aiuto elementare! Grazie.
    Dovrei creare un menu' per il sito di un ristorante, una cosa semplice.
    Procedura:
    Ho inserito nel primo frame della TimeLine principale un MC di nome "Menu_mc" che al suo interno ho articolato creando l'animazione desiderata. Ho inserito per ora i primi 2 bottoni e li ho istanziati con "Anti_btn" e "Primi_btn". Poi ho creato il mio DocumentClass che ho chiamato semplicemente "script" e di seguito vi riporto il codice del as:
    codice:
    package { 	
    import flash.display.MovieClip; 	
    import flash.events.MouseEvent;  	 	 	
    
    public class script extends MovieClip  	{ 		
    Anti_btn.addEventListener(MouseEvent.CLICK,vai_anti);
    Primi_btn.addEventListener(MouseEvent.CLICK, vai_primi); 		 		
    
    public function vai_anti(event:MouseEvent):void  		
    { 			
    Menu_mc.gotoAndPlay(1); 		
    } 		 		
    public function vai_primi(event:MouseEvent):void 		
    { 			
    Menu_mc.gotoAndPlay(21); 		
    } 	 	
     } 
    }
    Mi definisce questo errore per ogni istanza:
    Access of undefined property "nome_istanza"
    Mi potete dire il motivo?
    Forse sono io incapace... XD
    Grazie!!!

  2. #2
    Ciao, allora due cose.
    La prima è che non hai importato la classe SimpleButton, quindi i pulsanti non teli riconosce.
    Posso consiglairti di importare tutto il pacchetto display e quello events, facendo così:

    import flash.display.*;
    import flash.events.*;

    Seconda cosa, per riconoscere le istanze di oggetti presenti sullo stage devi aspettare che il tuo stesso fla sia "attaccato" allo stage, devi quindi aggiungere un listener nella funzione costruttore (che tu non hai messo, è buona norma metterla sempre, anche se vuota).

    Ultimo punto, i nomi delle classi vanno scritti in maiuscolo ... nel tuo caso Script (ma che si può chiamare tranquillamente Main ... anzi per convenzione è pure meglio) e le due funzioni che hai dichiarato non ha senso che siano pubbliche, dato che vengono chiamate solo all'interno della classe stessa, meglio farle private.

    A conti fatti ecco il tuo script:

    codice:
    package
    {
    	import flash.display.*;
    	import flash.events.*;
    	
    	public class Main extends MovieClip
    	{
    		public function Main()
    		{
    			addEventListener(Event.ADDED_TO_STAGE, init);
    		}
    		
    		private function init(e:Event):void
    		{
    			removeEventListener(Event.ADDED_TO_STAGE, init);
    			Anti_btn.addEventListener(MouseEvent.CLICK, vai_anti);
    			Primi_btn.addEventListener(MouseEvent.CLICK, vai_primi);
    		}
    		
    		private function vai_anti(e:MouseEvent):void
    		{
    			Menu_mc.gotoAndPlay(1);
     		}
    		
    		private function vai_primi(e:MouseEvent):void
    		{
    			Menu_mc.gotoAndPlay(12);
     		}
    	}
    }

  3. #3
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    Hai scordato di inserire nella definizione della classe il costruttore, forse il problema sta lì.
    Comunque ti consiglio, quando crei una document class di scriverla basilarmente in questo modo:

    Codice PHP:
    package {
        
    import flash.display.Sprite;
        
    import flash.events.Event;
        public class 
    NomeClasse extends Sprite {
            public function 
    NomeClasse ():void {
                if (
    stageinit();
                else 
    addEventListener(Event.ADDED_TO_STAGEinit);
            }
            private function 
    init(e:Event null):void {
                
    removeEventListener(Event.ADDED_TO_STAGEinit);
                
    // da qui il tuo codice 
            
    }
        }

    Quindi nel tuo caso avrai:

    Codice PHP:
    package {
        
    import flash.display.MovieClip;
        
    import flash.events.Event;
        public class 
    script extends MovieClip {
            public function 
    script ():void {
                if (
    stageinit();
                else 
    addEventListener(Event.ADDED_TO_STAGEinit);
            }
            private function 
    init (evt:Event=null):void {
                
    removeEventListener(Event.ADDED_TO_STAGEinit);
                
    Anti_btn.addEventListener(MouseEvent.CLICKvai_anti);
                
    Primi_btn.addEventListener(MouseEvent.CLICKvai_primi);
            }
            private function 
    vai_anti (evt:MouseEvent):void {
                
    Menu_mc.gotoAndPlay(1);
            }
            private function 
    vai_primi (evt:MouseEvent):void {
                
    Menu_mc.gotoAndPlay(21);
            }
        }


  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    22
    Grazie mille ragazzi!
    Ora ho capito, c'erano in paio di passaggi che ignoravo.

    Ho un altro dubbio: il secondo bottone "Primi_btn" funziona solo una volta. Cioè una volta clickato compie il suo lavoro di gotoAndPlay(21) e poi non è più riclickabile.
    Mentre il primo "Anti_btn" è sempre in "Ascolto".
    Non capisco.
    Grazie!

  5. #5
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    Con il codice così come te l'ho scritto non è possibile che succeda, salvo che non ci sia qualche condizione nel pulsante, che ignoro.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    22
    Si hai ragione! Errore mio... Scusate.

    Il problema che mi pongo ora è : il mio filmato ha due trasizioni che variano a seconda del momento in cui viene attivato il bottone ovvero - Se il bottone "Anti_btn" viene premuto per primo allora parte la prima trasizione dal frame 1 altrimenti dal frame 21.
    Lo stesso vale per il secondo bottone "Primi_btn" che se premuto per primo dovrà partire anche lui dal frame 1 e non più dal 21.
    E' illogico pensare che ogni utente visualizzerebbe in successione Antipasti, Primi , ...
    Quindi ho pensato di creare altre funzioni come "alternative" e usare l'istruzione
    removeEventListner ma non funziona correttamente.
    Altrimenti avevo pensato ad una flag che attraverso un'istruzione di controllo poteva inidcarmi se l'evento era già avvenuto e quindi saltare l'istruzione e passare alla seguente.

    Avete soluzioni a proposito?
    Scusate e grazie per la pazienza!

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.