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

    Trovare istanze e applicare metodi

    Salve a tutti!
    Ho già esperienza con i linguaggi di programmazione ad oggetti e sto provando per curiosità Actionscript 3.0

    Vi spiego con un esempio il mio problema
    Sto cercando di creare un piccolo sito in flash. Per farlo ho creato un file .fla e associato una classa .as esterna, ovvero non ho voluto programmare le azioni nel primo frame "alla vecchia maniera". Nel primo fotogramma ho messo il preloader. Da secondo inizia la scena vera e propria, che contiene due bottoni (Home e Gallery), che se premuti portano alla Home (frame 2) o alla gallery (frame 3). Quest'ultima contiene un rettangolo, che ho convertito in movieclip ed instanziato come "myrectangle" Qui è il mio mio problema.
    Nel codice .as associato all'evento della pressione del bottone gallery ho scritto:

    codice:
    function loadScene(e:Event):void{ 
    home_btn.addEventListener(MouseEvent.CLICK, goHome);
    gallery_btn.addEventListener(MouseEvent.CLICK, goGallery); 		
    }
    
    function goGallery (e:MouseEvent):void{
    			gotoAndStop("Gallery");
                            trace(myrectangle);
    		}
    la risposta del debugger alla pressione del pulsante è: null;
    Se invece scrivo:
    codice:
    function goGallery (e:MouseEvent):void{
    			gotoAndStop("Gallery");
                           var secondRectangle:Rectangle = new Rectangle();
                           appendChild(secondRectangle);
                           trace(secondRectangle);
    		}
    allora la risposta è Object Rectangle, così ho creato una nuova istanza... infatti sullo stage adesso mi appare sia il nuovo oggetto che il precedente che ancora è null, ma è quello che mi interessa manipolare.

    Mi potete aiutare a comprendere meglio cosa succede?

    Spero di essermi spiegato bene. Grazie a tutti in anticipo!

  2. #2
    Utente di HTML.it L'avatar di Sleter
    Registrato dal
    Aug 2005
    Messaggi
    465
    Ciao

    Trovare istanze e applicare metodi ?

    Esattamente come hai trovato l'istanza dei bottoni e hai applicato il Listener ovvero:

    nomeIstanza.metodo

    Quindi se il tuo MovieClip: "myrectangle" è posizionato sullo stage con il suo <nome istanza> nel fotogramma con etichetta "Gallery", in un fotogramma precedente hai il pulsante "gallery_btn" e questo codice:

    Codice PHP:
    gallery_btn.addEventListener(MouseEvent.CLICKgoGallery);         
    function 
    goGallery (e:MouseEvent):void{
    gotoAndStop("Gallery");
    trace(myrectangle);} 
    Ricevi come output: [object MovieClip]

    Mi sembra strano anche l'output che ricevi con il secondo esempio di codice in quanto utilizzi un "appendChild" che, per quel che ne sò è un metodo per aggiungere stringhe a un .xml e la classe Rectangle serve per creare aree rettangolari per diversi scopi ma non mi risulta che disegni rettangoli sullo stage.
    L'ho usata per riempire con testi caricati dall'esterno aree scrollabili oppure, per delimitare un'area su cui fare calcoli sullo spostamento del mouseX e mouseY.

    Per disegnare un rettangolo con AS3 e utilizzarlo come un MovieClip, devi istanziarlo e crearlo usando una variabile di tipo MovieClip e quindi disegnarlo con i metodi della proprietà graphics :

    Codice PHP:
    function goGallery(e:MouseEvent):void{
    gotoAndStop("Gallery");
    var 
    secondRectangle:MovieClip = new MovieClip;
    secondRectangle.graphics.lineStyle(1,0x000000);// (spessore linea,colore)
    secondRectangle.graphics.beginFill(0x000000);// (colore)
    secondRectangle.graphics.drawRect(100,100,100,50); // (x,y,larghezza,altezza)
    addChild(secondRectangle);
    trace(secondRectangle);} 
    Ricevi come output [object MovieClip] e puoi gestirlo con metodi e proprietà riservati ai MovieClip o usare metodi e proprietà create da te.

    Comunque, tornando al tuo progetto di sito in flash considera che non è necessario utilizzare la timeline principale e puoi utilizzare il tuo filmato principale come base in cui richiamare le varie sezioni sulla scena solo quando richiesto.

    ciao

  3. #3
    mmm... mi sa che non ci siamo capiti, probabilmente per colpa mia, perché Rectangle non è una classe Actionscript di default, ma un movieclip di esempio che ho disegnato e creato io, chiamandoli così...
    Cmq per spiegare il problema a cui mi rifersico sarebbe più facile se potessi allegare i sorgenti .fla e as qua sul forum. Posso farlo oppure vi sono delle restrizioni?

  4. #4
    Utente di HTML.it L'avatar di Sleter
    Registrato dal
    Aug 2005
    Messaggi
    465
    ... Allora, se hai creato un movie clip e l'hai nominato nel campo "Classe" > "Rectangle" per importarlo da libreria (sconsigliatissimo usare parole chiave riservate a ActionScript in quanto "Rectangle" E' una classe di default del pacchetto flash.geom (vedi guida di riferimento).

    Sicuramente non la richiami sullo stage con un "appendChild" che usato in quel modo, ti darebbe un errore del tipo: "Chiamata a metodo non definito: appendChild".

    Non sò se sia possibile allegare file .fla e .as.
    Nel modulo per allegare i file pare non siano ammesse questo tipo di estensioni.

    Comunque credo che la risposta alla tua domanda sia chiara ed esauriente.
    Se hai ancora dubbi e riscontri problemi, chiedi pure e se posso darti le indicazioni adeguate, ovviamente in relazione alle mie conoscenze, lo farò !

    ciao

  5. #5
    Per spiegarmi meglio, utilizzerò degli screenshot.
    Allora questa è la situazione posiziondomi sul frame 2:




    Se mi posiziono sul frame 3, etichettato con Gallery:


    Questo invece è il codice che ho scritto su un file chiamato TestAS.as:
    codice:
    package{    
     import flash.display.*;     
    import flash.events.*; 	
    import flash.text.*;          
    public class TestAS extends MovieClip{
       public function TestAS():void {             
          stop(); 			
           this.addEventListener(Event.ENTER_FRAME, loading); 
       } 		
      function loading(e:Event):void{ 
          var total:Number = this.stage.loaderInfo.bytesTotal; 			
          var loaded:Number = this.stage.loaderInfo.bytesLoaded; 		 
         preloader_bar.scaleX = loaded/total; 			
        preloader_text.text = Math.floor((loaded/total)*100)+ "%";
        if (total == loaded){
           gotoAndStop("Home"); 
         this.removeEventListener(Event.ENTER_FRAME, loading);
         /*Listener per il frame successivo contenente la scena. Senza questo non trova le istanze  della scena */ 
         this.addEventListener(Event.ENTER_FRAME,loadScene); 
        }//end if 
     }//end function 
    
    function loadScene(e:Event):void{ 
         this.removeEventListener(Event.ENTER_FRAME, loadScene);
        home_btn.addEventListener(MouseEvent.CLICK, goHome); gallery_btn.addEventListener(MouseEvent.CLICK, goGallery);
    } 		 
    
    
    /* Funzioni dei bottoni del Menu IL PROBLEMA STA QUA:*/ 		
    function goHome (e:MouseEvent):void{
      gotoAndStop("Home"); 			 		
    } 
    function goGallery (e:MouseEvent):void{
        gotoAndStop("Gallery"); 			
       var  tf:TextField = new TextField(); 
      tf.text = "Hello"; 
    /*container_left è l'istanza della class ContainerLeft che si vede nello screenshot precedente, ovvero il rettangolo trasparente senza bordi*/
      container_left.addChild(tf); 		//RIGA 46
    }     
    } 
    }
    Dopo il preloader(che ho omesso in quanto funzionante) la situazione inizialmente è questa(i commenti li ho aggiunti con Paint per chiarezza):

    cliccando sul bottone gallery, il debugger mi risponde nel seguente modo:
    TypeError: Error #1009:
    Impossibile accedere a una proprietà o a un metodo di un riferimento oggetto null.
    at TestAS/::goGallery()[D:\Documents\My Web Sites\giri in moto flash\flashEXP\TestAS.as:46]
    la riga 46 è evidenziata nello script che ho messo sopra...

    Adesso dovrei essermi spiegato un pochino meglio :-)
    Spero che possiate aiutarmi a capire cosa sto sbagliando e sopratutto se il mio approccio alla creazione di un sito Flash è giusta... lo sto imparando da autodidatta aiutandomi con i tutorial della rete.

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.