Visualizzazione dei risultati da 1 a 8 su 8

Discussione: problemi con le classi

  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    86

    problemi con le classi

    Salve a tutti ragazzi anche oggi vi chiedo di aiutarmi e come sempre vi ringrazio in anticipo per la vostra collaborazione.
    Sono alle prese con le basi della programmazione ad oggetti con Action Script 3. Il mio problema è questo:
    Sto cercando di creare un menu a tendina, che banalità direte voi, eppure, non ci riesco o meglio non capisco quale sia l'errore!!
    Ho creato il mio pacchetto con la classe che mi serve per spostarmi dal frame 1 di un movieclip al frame 2 dello stesso. Vi riporto il codice del paccheeto per farmi capire meglio.

    package prova_per_menu {
    import flash.display.*;
    import flash.events.MouseEvent;

    public class nuovo_movimento extends MovieClip {
    public var mc : MovieClip = new MovieClip();

    public function visualizza_menu (mc) {
    //mc.gotoAndStop(2);
    mc.addEventListener(MouseEvent.MOUSE_OVER, visualizza_sub);
    mc.addEventListener(MouseEvent.MOUSE_OUT, nascondi_sub);
    }
    public function visualizza_sub(event:MouseEvent) : void {
    mc.gotoAndStop(2);
    trace("OK");
    }
    public function nascondi_sub(event:MouseEvent) : void {
    mc.gotoAndStop(1);
    }
    }
    }

    apparentemente tutto ok ma quando mi voglio spostare al secondo frame al passaggio del mouse questo non va, pero ho porvato a mettere un trace all'interno della funzione e questo si che me lo visualizza.
    Mi potete aiutare please..... Granzia ancora AP

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

    La funzione costruttrice deve avere lo stesso nome della classe.
    Con il tuo codice puoi vedere un trace nella dichiarazione di classe se questa è collegata allo stage ma la funzione "visualizza_menu" non viene letta e di conseguenza nemmeno i Listener assegnati a "mc".

    Inoltre, non serve che istanzi e crei una variabile di tipo MovieClip se questo è già presente con il suo <nome istanza> sullo stage.

    Prova così:
    Nel .fla colleghi la classe come documentClass inserendo il nome del pacchetto in cui è inserita seguito dal nome della classe: prova_per_menu.nuovo_movimento, nell'apposito campo Classe del .fla.
    Nel .fla posizioni anche il tuo MovieClip sullo stage con il suo nome istanza: mc

    La classe Nuovo_movimento (consigliato il maiuscolo come prima lettera del nome per distinguere una classe da una variabile) va scritta così:

    Codice PHP:
    package prova_per_menu
    {
        
    import flash.display.*;
        
    import flash.events.MouseEvent;

        public class 
    Nuovo_movimento extends MovieClip
        
    {
     
            public function 
    Nuovo_movimento():void
            
    {
                
    mc.addEventListener(MouseEvent.MOUSE_OVERvisualizza_sub);
                
    mc.addEventListener(MouseEvent.MOUSE_OUTnascondi_sub);
            }
            private function 
    visualizza_sub(evento:MouseEvent):void
            
    {
                
    mc.gotoAndStop(2);
            }
            private function 
    nascondi_sub(evento:MouseEvent):void
            
    {
                
    mc.gotoAndStop(1);
            }
        }

    Nella dichiarazione della classe, puoi mettere tutte le variabili e costanti globali che ti servono ma non chiamate alle funzioni, cosa invece che puoi tranquillamente fare nella funzione costruttrice della classe.

    ciao

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    86

    grazie

    Ciao grazie mille per i tuoi suggerimenti mi sono molto utili ma purtroppo ora ho un altro problema cioè, quando mando in esecuzzione il .swf mi dice che "mc" non è definito da nessuna parte ma il nome dell'istanza all'interno del .fla è mc......
    come mai?
    grazie in anticipo AP.

    Ho modificato cosi il mio pacchetto

    package prova_per_menu
    {
    import flash.display.*;
    import flash.events.MouseEvent;
    import flash.events.Event;

    public class Nuovo_movimento extends MovieClip
    {
    public function Nuovo_movimento():void
    {
    if (stage) init();
    else addEventListener(Event.ADDED_TO_STAGE, init);
    }

    private function init (evt:Event=null):void {
    removeEventListener(Event.ADDED_TO_STAGE, init);
    mc.addEventListener(MouseEvent.MOUSE_OVER, visualizza_sub);
    mc.addEventListener(MouseEvent.MOUSE_OUT, nascondi_sub);
    }

    private function visualizza_sub(evento:MouseEvent):void
    {
    mc.gotoAndStop(2);
    }
    private function nascondi_sub(evento:MouseEvent):void
    {
    mc.gotoAndStop(1);
    }
    }
    }

    e nel .fla richiamo in questo modo la classe

    import prova_per_menu.Nuovo_movimento;

    var scelta : Nuovo_movimento = new Nuovo_movimento();

    scelta.Nuovo_movimento();

    ma mi da errore aiutoooooooooooooooooooooooooooooooooo............ ..
    e scusate per la mia ignoranza....

  4. #4
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    La gestione delle classi di visualizzazione all'interno di flash è abbastanza rigida e l'accesso a determinati elementi è fattibile solo nel momento in cui quella determinata classe è effettivamente presente nell'elenco di visualizzazione.
    Anche gli oggetti già presenti fisicamente sullo stage sono istanze di una determinata classe, nel tuo caso "mc" è un'istanza di MovieClip presente sulla timeline principale (root).

    Per evitare di ottenere errori all'interno della tua classe dovresti scrivere una verifica per cui, se "mc" esiste, allora gli fai fare qualcosa.

    Codice PHP:
    private function visualizza_sub(evento:MouseEvent):void {
        if (
    mcmc.gotoAndStop(2);
    }
    private function 
    nascondi_sub(evento:MouseEvent):void {
        if (
    mcmc.gotoAndStop(1);


  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    86

    problemi con le classi

    Ciao grazie ancora per rispondermi.
    Niente da fare ho fatto le verifiche che mi hai suggerito ma l'errore me lo da sempre...

    e me lo segnala anche nell'istruzione if (mc) -> "mc non definito"

    questo è quanto riporta il file .fla

    import prova_per_menu.Nuovo_movimento;

    var scelta : Nuovo_movimento = new Nuovo_movimento();

    è possibile che l'errore sia proprio qui? manca qualcosa?

    PS se aggiungo
    scelta.Nuovo_movimento();
    mi da sempre errore pero stavolta che non è definito il metodo Nuovo_movimento
    Ragazzi scusate la mia ignoranza ma non ci sto capendo niente magari devo fare una pausa mentre aspetto un vostro aiuto.....

  6. #6
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    Mmh no, io ero rimasto al suggerimento di Sleter, che diceva di usare la classe come "document class", se invece lo usi così le cose cambiano, perché quell'oggetto (scelta) non è stato aggiunto alla lista di visualizzazione da nessuna parte e non può accedere in quel modo a "mc", perché mc per lei non esiste, giustamente.

  7. #7
    Utente di HTML.it L'avatar di Sleter
    Registrato dal
    Aug 2005
    Messaggi
    465
    mi dice che "mc" non è definito da nessuna parte ma il nome dell'istanza all'interno del .fla è mc....
    Infatti se usi quella classe come classe secondaria, mc non è definito da nessuna parte perchè non necessariamente la classe deve fare riferimento allo stage principale.
    Potrebbe dover fare riferimento solo al MovieClip, al suo stage, alla sua timeline, a eventuali movieClip annidati e potrebbe essere già presente e aggiunto allo stage principale da un'altra classe.

    Il codice che ti ho proposto sopra è valido e funziona nel caso la classe sia la DocumentClass e quindi in pratica sostituisce perfettamente il codice inserito nel primo fotogramma del .fla.

    Se la tua classe non è la DocumentClass puoi fare così:

    1. Elimina il tuo MovieClip dallo stage e vai nelle sue proprietà da libreria.
    Nella finestra che si apre metti la spunta su Concatenamento > esporta per ActionScript.
    Inserisci un nome univoco nel campo Classe, es.: Mc
    Dai l' OK

    A questo punto è come se avessi creato una nuova classe di nome: Mc > estensione della classe MovieClip.

    2. Nel primo fotogramma del .fla inserisci questo codice:

    Codice PHP:
    import prova_per_menu.Nuovo_movimento
    var scelta:Nuovo_movimento = new Nuovo_movimento();
    addChild(scelta); 
    3. Invece la classe NuovoMovimento va scritta così:

    Codice PHP:
    package prova_per_menu
    {
        
    import flash.display.*;
        
    import flash.events.MouseEvent;
        
    import flash.events.*;

        public class 
    Nuovo_movimento extends MovieClip
        
    {
            var 
    mc:Mc = new Mc();

            public function 
    Nuovo_movimento():void
            
    {
                
    addEventListener(Event.ADDED_TO_STAGEinit);
            }
            private function 
    init(evento:Event):void
            
    {
                
    removeEventListener(Event.ADDED_TO_STAGEinit);
                
    addChild(mc);
                
    mc.addEventListener(MouseEvent.MOUSE_OVERvisualizza_sub);
                
    mc.addEventListener(MouseEvent.MOUSE_OUTnascondi_sub);
            }
            private function 
    visualizza_sub(evento:MouseEvent):void
            
    {
                
    mc.gotoAndStop(2);
            }
            private function 
    nascondi_sub(evento:MouseEvent):void
            
    {
                
    mc.gotoAndStop(1);
            }
        }

    Nota che nella dichiarazione della classe ho istanziato una variabile di nome mc e di tipo: Mc ( che corrisponde al nome del MovieClip esportato per AS presente nella libreria del .fla).
    Nella funzione init lo aggiungo allo stage con addChild(mc).

    Così funziona !

    ciao

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    86

    risolto

    Grazie ragazzi siete come sempre fantastici finalmente ho cpito cosa devo fare. DEVO IMPARARE MEGLIO TUTTO!!!!!

    cmq rileggendo un po le guide dopo una piccola pausa (benedizione) ho capito il problema sbagliavo a definire la documentClass..
    Grazie ancora e alla prossima...

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.