• User Attivo

    Classe per visualizzare del testo in AS3

    ciao a tutti, sto cercando di capire il funzionamento di AS3 da circa un paio d'ore, ed ecco il primo problema:

    ho creato una classe main.as ed una classe Messaggio.as

    main.as

    
    import Messaggio;
    
    var mess:Messaggio = new Messaggio();
    mess.creaMessaggio("casa");
    
    

    Messaggio.as

    
    package {
    	import flash.text.TextField;
    	import flash.text.TextFormat;
    	import flash.display.*;
    
    
    	public class Messaggio extends MovieClip {
    var testo:TextField = new TextField;
    		public function Messaggio():void {
    
    			function creaMessaggio(v:String):TextField{
    			testo.text = v;
    			testo.width = 500;
    			testo.x = (stage.stageWidth/2)-(testo.width/2);
    			
    			return (testo);
    			}
    addChild(testo);
    		}
    	
    	}
    }
    
    

    il risultato è questo messaggio di errore:

    1061: Chiamata a un metodo non definito creaMessaggio mediante un riferimento con tipo statico Messaggio.

    mi aiutate a correggere, non ho molta base teorica e mi sono bloccata


  • User Attivo

    scusate, ho notto che la prima versione della classe era totalmente sbagliata adesso ho modificato cosi

    Messaggio.as

    
    package {
    	import flash.text.TextField;
    	import flash.text.TextFormat;
    	import flash.display.*;
    
    
    	public class Messaggio extends MovieClip {
    
    		public var testoString:String;
    
    		public function Messaggio(testoString:String) {
    
    			var testo:TextField = new TextField;
    			testo.text = testoString;
    			addChild(testo);
    			testo.width = 500;
    			testo.x = (stage.stageWidth/2)-(testo.width/2);
    
    		}
    
    	}
    }
    
    

    main.as

    
    var mess:Messaggio = new Messaggio("casa");
    
    

    risultato:
    TypeError: Error #1009: Impossibile accedere a una proprietà o a un metodo di un riferimento oggetto null.
    at Messaggio$iinit()


  • User

    Ciao

    Il primo codice che riporti main.as non è un codice per una classe ma potrebbe essere l'importazione della classe Messaggio.as sullo stage del .fla.
    Tuttavia manca l'addChild della classe e pertanto, non è fisicamente collegata allo stage (potresti avere una classe che svolge funzioni autonome e le trasmette ad altre classi che a loro volta sono collegate allo stage e agli oggetti contenuti).

    La classe Messaggio.as non è correttamente formattata:
    Nella dichiarazione di classe istanzi e crei una variabile senza definirne l'attributo pubblico o privato e anche se non ti dà errori è sempre meglio fornire al codice tutte le informazioni utili, anche se a volte non necessarie.

    Stesso discorso per la funzione 'creaMessaggio' che richiami da altre posizioni, deve assolutamente essere definita pubblica.
    Anche se l'hai annidata nella funzione costruttrice della classe (che deve essere sempre pubblica), non ti serve annidarla e può benissimo stare fuori.

    La stessa funzione dovrebbe restituire un valore di tipo TextField e anche questo non è esatto, per quello che mi è sembrato di capire, vuoi che il campo di testo già creato nella dichiarazione di classe con 'new' ti riporti la variabile stringa che hai già passato alla funzione nella chiamata per cui, la funzione non deve restituire alcun valore dato che il valore che ti serve l'hai già assegnato a 'v' come stringa.

    Comunque, e scusami se mi sono dilungato, ottieni il campo di testo con il valore stringa che hai passato alla funzione se fai così:

    Questo codice inserito nel pannello azioni di Flash al primo fotogramma del .fla:

    [PHP]var mess:Messaggio = new Messaggio();
    addChild(mess);
    mess.creaMessaggio("casa");[/PHP]

    E la classe Messaggio.as nella stessa cartella de .fla deve essere compilata così:

    [PHP]package
    {
    import flash.text.TextField;
    import flash.text.TextFormat;
    import flash.display.*;

    public class Messaggio extends MovieClip
    {
    	private var testo:TextField = new TextField  ;
    
    	public function Messaggio():void
    	{
    		trace("OK Classe Messaggio istanziata correttamente");
    	}
    	public function creaMessaggio(v:String):void
    	{
    		trace("sono in creaMessaggio");
    		testo.text = v;
    		testo.width = 500;
    		testo.x = stage.stageWidth / 2 - testo.width / 2;
    
    		addChild(testo);
    	}
    }
    

    }[/PHP]

    ciao


  • User

    ... ho visto solo adesso il tuo messaggio precedente.

    Probabile che l'errore che riscontri sia dovuto alla proprietà stage perchè come ti ho scritto sopra, la classe non necessariamente ha una proprietà 'stage'.

    ciao


  • User Attivo

    Ti Adoro

    grazie mille per la spiegazione.


  • User Attivo

    scusa, ovviamente il tuo codice funziona alla perfezione.

    riguardo alla tua seconda risposta:
    facendo così

    import flash.display.*;

    non ho importato anche stage?


  • User

    Ciao

    Si in effetti la tua domanda è pertinente, nel pacchetto flash.display ci sono tutte le classi principali utilizzate dal FlashPlayer e pertanto c'è la classe Stage ma quest'ultima non è accessibile a livello globale e per accedervi occorre fare riferimento alla proprietà stage (minuscolo).

    Se la tua classe.as non è fisicamente collegata allo stage e usi appunto la proprietà stage, ti ritorna un errore del tipo che hai riscontrato.

    Se provi a commentare l'addChild(mess); nel codice che ti ho suggerito sopra, vedi che ricevi lo stesso errore.
    Lasciando commentato l'addChild e nella classe.as vai a commentare la riga dove c'è la proprietà stage, ti accorgi che la classe risulta sempre collegata al .fla e istanziata correttamente (perchè è presente nella stessa cartella e Flash la trova automaticamente), non vengono segnalati errori ma non viene nemmeno aggiunto allo stage il campo di testo.

    Ci sarebbe da dire altro sull'evento: ADDED_TO_STAGE utilissimo e che in certi casi fa risparmiare il ricovero alla neuro ma per ora mi fermo qui per non rischiare di confonderti e anche perchè molte cose non sono ancora chiare nemmeno a me o perlomeno, non abbastanza chiare per spiegarle chiaramente.

    ciao e alla prossima


  • User Attivo

    confermo quello che ho detto prima

    Ti adoro