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

    Portare un pulsante in primo piano

    Ciao a tutti.
    Sto cercando di fare un swf di dimensioni 600x600 con 4 pulsanti all'interno, tutti di 300x300. Quando il mouse passa sopra a un bottone (onRollOver), questo s'ingrandisce con un'animazione e diventa 600x600. Successivamente, quando il mouse si porta fuori dal bottone (onRollOut), quest'ultimo torna 300x300.
    Mi sembrava semplice da fare, ma ho un problema... durante l'animazione gli altri pulsanti vanno a finire sopra.

    La mia domanda è: come posso portare in primo piano un pulsante durante l'animazione?

  2. #2
    SE VAI SULLA GUIDA INTERNA DI FLASH TROVI swapDepths SERVE PROPRIO PER FARE QUELLO CHE VUOI TU

    myMC1_mc.onRelease = function() {
    this.swapDepths(myMC2_mc);
    };
    myMC2_mc.onRelease = function() {
    this.swapDepths(myMC1_mc);
    };

    il codice che vedi sopra scambia di livello due mc, in sostanza tra parentesi puoi dichiarare il livello che sia numerico o riferito ad un Mc. nel tuo caso devi portare sopra un pulsante e sotto gli altri.

  3. #3
    Innanzitutto ti ringrazio per la risposta, ma non ho capito bene come funziona... non ci capisco molto di AS3
    con AS2 per me è più semplice fare le azioni con il RollOver e il RollOut, solo che non posso usare swapDepths (almeno credo) perché ho dei pulsanti e non dei MC...

    Potete farmi un piccolo esempio per favore? Sto diventando matto......

  4. #4
    Stamattina ho fatto una prova con AS3:
    codice:
    btn1.addEventListener(MouseEvent.MOUSE_OVER,mouseSopra);
    btn1.addEventListener(MouseEvent.MOUSE_OUT,mouseFuori);
    btn2.addEventListener(MouseEvent.MOUSE_OVER,mouseSu);
    btn2.addEventListener(MouseEvent.MOUSE_OUT,mouseGiu);
    
    function mouseSopra(evt:MouseEvent):void{
    	trace("ciao");
    }
    
    function mouseFuori(evt:MouseEvent):void{
    	trace("a tutti");
    }
    
    function mouseSu(evt:MouseEvent):void{
    	trace("questo");
    }
    
    function mouseGiu(evt:MouseEvent):void{
    	trace("funziona!");
    }
    funziona perfettamente, ma se provo ad aggiungere la riga che mi ha detto daniele63, mi dà i seguenti errori:
    1119: Accesso a una proprietà non definita onRelease mediante un riferimento con tipo statico flash.display:SimpleButton.
    Warning: 1090: Problema relativo alla migrazione: In ActionScript 3.0, il gestore di eventi onRelease non viene attivato automaticamente da Flash Player in fase di runtime. Prima è necessario registrare il gestore per l'evento mediante addEventListener ( 'click', callback_handler).
    Aiuto... non so che fare!

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

    Il codice proposto da daniele63 è ActionScript 2.0 e come hai ben intuito swapDepths è un metodo della classe MovieClip e non funziona su istanze della classe Button.

    Con ActionScript 3.0, stesso discorso, ogni classe ha le sue proprietà e i suoi metodi.
    Io uso AS3 quindi tutto quello che segue, anche se ha similitudini con AS2 si riferisce a AS3.

    La classe MovieClip è più potente della classe Button in quanto tutto quello che si può fare con un Bottone, si può ottenere con una MovieClip mentre invece con un Bottone, non è possibile fare tutto quello che si può fare con una MovieClip.

    E' consigliato quindi utilizzare istanze della classe Button solo quando non si devono ottenere funzionalità particolari riservate alla classe movieClip e per comodità, in quanto certe funzionalità come il mouse Over, mouse Out, Click e manina sono già configurate nella classe Button e non serve scrivere il codice AS per utilizzarle.

    Ora, il tuo problema è che ingrandendo il pulsante, questo non va a coprire i pulsanti vicini e l'ingrandimento finisce sotto di essi.
    Vorresti invece che il pulsante che vai a ingrandire si posizioni sopra tutti gli altri, al rilascio, torni alle dimensioni iniziali per lasciare spazio all'ingrandimento dei pulsanto vicini che vai a toccare con il mouse.

    Per fare questo occorre giocare sui livelli in dinamico utilizzando la proprietà numChildren e il metodo setChildIndex.

    Per prima cosa ti serve lavorare su pulsanti creati da MovieClip.
    Nel primo fotogramma della sua timeline metti uno stop();
    Nel secondo, puoi creare la tua animazione fotogramma per fotogramma o importare un altro clip con la sua timeline completa.

    Sposti quindi i tuoi pulsanti (movieClip) sulla timeline principale, su un'unico livello, e dai a ognuno il suo nome istanza nelle sue proprietà.
    Inserisci quindi questo codice:

    Codice PHP:
    var num:int numChildren;

    pulsante1.addEventListener(MouseEvent.MOUSE_OVER,ingrandisci1);
    pulsante2.addEventListener(MouseEvent.MOUSE_OVER,ingrandisci2);

    pulsante1.addEventListener(MouseEvent.MOUSE_OUT,rimpicciolisci1);
    pulsante2.addEventListener(MouseEvent.MOUSE_OUT,rimpicciolisci2);


    function 
    ingrandisci1(evento:MouseEvent):void{
        var 
    oggettoDisplayObject DisplayObject(evento.target)
        
    pulsante1.gotoAndStop(2);
        
    setChildIndex(oggetto,num-1);
    }
    function 
    ingrandisci2(evento:MouseEvent):void{
        var 
    oggettoDisplayObject DisplayObject(evento.target)
        
    pulsante2.gotoAndStop(2);
        
    setChildIndex(oggetto,num-1);
    }
    function 
    rimpicciolisci1(evento:MouseEvent):void{
        
    pulsante1.gotoAndStop(1);
    }
    function 
    rimpicciolisci2(evento:MouseEvent):void{
        
    pulsante2.gotoAndStop(1);

    Ovviamente questo è un esempio applicato a 2 soli pulsanti di nome "pulsante1" e "pulsante2" che puoi clonare per un numero indefinito di pulsanti.
    Come puoi vedere il Listener associato al mouse Over e al mouse Out richiamano una funzione che fa spostare la timeline del clip sul fotogramma richiesto.

    Essendo funzioni uguali per tutti i pulsanti si potrebbe ottimizzare e ridurre tutto il codice in molte righe in meno ma credo che per ora, per capire bene la logica di ActionScript 3.0 utilizzata, possa esserti utile studiarlo scritto così.

    ciao e buon lavoro !

  6. #6
    Sleter... GRAZIE!!! Non finirò mai di ringraziarti abbastanza!

  7. #7
    Utente bannato
    Registrato dal
    May 2010
    Messaggi
    16

    ignoranza da principiante

    Scusate la mia ignoranza da principiante, ma non è più semplice usare il metodo visible = settando false o true alla bisogna.

    Che sò, si possono mettere le istanze dei pulsanti in un array, quindi all'evento ON, oltre a ingrandire il pulsante attivato, si setta uno switch con l'indice relativo al pulsante che deve rimanere attivo e si richiama una function che rende invisibili gli altri pulsanti e al rilascio si richiama la function che li rende di nuovo visibili.
    dite che non funziona?

  8. #8
    Utente di HTML.it L'avatar di Sleter
    Registrato dal
    Aug 2005
    Messaggi
    465
    Certo che funziona JpCloe ma con il visible = true o false non otterremmo l'effetto voluto in quanto al mouse Over, il pulsante in questione deve apparire su un livello superiore lasciando visibili i pulsanti sotto.

    Resta valido, che si potrebbe ottimizzare il codice e invece di duplicare la stessa funzione per i diversi pulsanti, inserire le funzioni in un ciclo for che preleva l'indice numerico e quindi il nome dall' Array dell'effettivo pulsante che dovrà attivare l'evento.

    Per ottimizzare il tutto si può fare così:

    Codice PHP:
    var num:int=numChildren;
    var 
    listaPulsanti:Array=new Array(pulsante1,pulsante2,pulsante3);

    for (var 
    i:int=0i<3i++) {

        
    listaPulsanti[i].addEventListener(MouseEvent.MOUSE_OVER,ingrandisci);
        
    listaPulsanti[i].addEventListener(MouseEvent.MOUSE_OUT,rimpicciolisci);

        function 
    ingrandisci(evento:MouseEvent):void {
            var 
    oggettoDisplayObject=DisplayObject(evento.target);
            
    evento.currentTarget.gotoAndStop(2);
            
    setChildIndex(oggetto,num-1);
        }
        function 
    rimpicciolisci(evento:MouseEvent):void {
            
    evento.currentTarget.gotoAndStop(1);
        }

    Oltre che a ridurre notevolmente le righe del codice precedente (ora abbiamo 3 pulsanti invece di 2) in questo modo possiamo aggiungere un numero indefinito di pulsanti semplicemente aggiungendo il loro nome istanza nell' Array e incrementando il numero della condizione (i<3) in relazione al numero dei pulsanti presenti sullo stage e nell' Array.

    Le funzioni saranno eseguite dall'effettivo pulsante che scatena l'evento (currentTarget) evitando quindi di riscrivere le stesse funzioni per ogni pulsante.

    ciao

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.