• User Attivo

    Da AS3.0 a AS.20 :S

    Salve, utilizzo Flash 8 Professional e pian pianino inizio a masticare AS2.0 ...
    Ho creato un swf principale dentro cui, attraverso una barra menù, carico di volta in volta degli swf esterni posizionati nell'swf principale attraverso vari mc vuoti (tanti quanti sono gli elementi che richiamo;
    I vari mc dentro cui carico gli swf esterni sono draggabili, ma ho il problema che, a secondo il livello in cui sono posizionati nell'swf principale gli mc vuoti, i vari swf che si caricano si sovrappongono l'un l'altro... L'unico modo ''intuitivo'' per risolvere il problema è quello di far sì che ogni volta che l'utente clicca sull'mc vuoto che carica ogni swf, quest'ultimo si porti in primo piano!!
    Ho trovato che questa funzione si realizza facilmente in AS3.0 col seguente script:

    // Questo codice consente di creare un'interazione di trascinamento della selezione mediante inseguimento del mouse
    //.
    // cerchio e quadrato sono oggetti di DisplayObjects (ad es istanze di MovieClip
    // o di Sprite).

    import flash.display.DisplayObject;
    import flash.events.MouseEvent;

    var offsetX:Number;
    var offsetY:Number;
    var draggedObject: DisplayObject;

    // Questa funzione viene chiamata quando il pulsante del mouse viene premuto.
    function startDragging(event:MouseEvent):void
    {
    // ricorda quale oggetto viene trascinato
    draggedObject = DisplayObject(event.target);

    // Registra la differenza (spostamento) tra dove si trovava il cursore
    // quando il pulsante del mouse è stato premuto e le coordinate x, y
    // dell'oggetto nel momento in cui il pulsante del mouse è stato premuto.
    offsetX = event.stageX - draggedObject.x;
    offsetY = event.stageY - draggedObject.y;

    // Sposta l'oggetto selezionato al primo posto nell'elenco di visualizzazione
    stage.addChild(draggedObject);

    // Indica a Flash Player di iniziare ad intercettare l'evento mouseMove.
    stage.addEventListener(MouseEvent.MOUSE_MOVE, dragObject);
    }

    // Questa funzione viene chiamata quando il pulsante del mouse viene rilasciato.
    function stopDragging(event:MouseEvent):void
    {
    // Indica a Flash Player di cessare di intercettare l'evento mouseMove.
    stage.removeEventListener(MouseEvent.MOUSE_MOVE, dragObject);
    }

    // Questa funzione viene chiamata ogni volta che il mouse viene spostato,
    // fino a quando il pulsante del mouse resta premuto.
    function dragObject(event:MouseEvent):void
    {
    // Sposta l'oggetto trascinato nella posizione del cursore, mantenendo
    // lo scarto tra la posizione del cursore e la posizione
    // dell'oggetto trascinato.
    draggedObject.x = event.stageX - offsetX;
    draggedObject.y = event.stageY - offsetY;

    // Istruisce Flash Player di aggiornare lo schermo dopo questo evento.
    event.updateAfterEvent();
    }

    circle.addEventListener(MouseEvent.MOUSE_DOWN, startDragging);
    circle.addEventListener(MouseEvent.MOUSE_UP, stopDragging);

    square.addEventListener(MouseEvent.MOUSE_DOWN, startDragging);
    square.addEventListener(MouseEvent.MOUSE_UP, stopDragging);

    Ma io con AS3.0 sono davvero confuso ed impacciato, perché essendo alle prime armi col 2.0 non so come costruirmi bottoni, loadMovie etc...
    Qualcuno sa dirmi se c'è un modo per strutturare questa funzione in AS.20 anziché in AS.3.0image?
    AIUTOOOOOO!!! image image


  • Super User

    Ciao,
    se le tue clip sono tutte sulla _root, con AS 2.0 basta che dici alla tua clip:

    • quando sei premuta .getDepth(_root.getNextHighestDepth());

    PS:
    nello script che hai pubblicato non vedo nessuno scambio di livelli :bho:


  • User Attivo

    Ciao, grazie per la risposta... ora provo!! 😉

    Per quanto riguarda lo scambio di livelli ti assicuro che funziona!!

    Dentro Flash Cs3, nuovo file.fla, due livelli

    1. azioni
    2. forme

    dentro forme due mc uno di istanza square e l'altra circle,
    quando clicco su square o circle questi sono trascinabili e se si sovrappongono, basta cliccare su quello che sta dietro perché passi avanti!!

    Ma forse non c'entra in relazione a swf esterni :S pensavo che non dipendesse da quello che carico o meno dentro circle o square!!

    Cmq provo la tua soluzione e ti faccio sapere!! 😉

    Grazie mille!!


  • User Attivo

    Non funziona 😢😢😢

    E tra l'altro non capisco perché non mi funzionano neanche i drag... Fatti semplicemente:

    nome_mc.onPress = function () {
    startDrag ("_root.nomeclipdatrascinare", true);
    }
    nome_mc.onRelease = function () {
    stopDrag ();
    }

    nome_mc è il movieclip vuoto che carica gli swf esterni (ovviamente il comando è inserito nel gestore eventi e i movieclip vuoti sono istanziati)

    😢😢😢


  • User Attivo

    P.S.

    Flep, io avevo scritto

    nome_mc.onPress = function () {
    on.Press.getDepth(_root.getNextHighestDepth());
    }

    secondo me ci sono troppi onPress e troppi on release 😮

    :?:?:?:?:?:?:?:?:?:?:?:?:?:?:?:?:?


  • User Attivo

    // Sposta l'oggetto selezionato al primo posto nell'elenco di visualizzazione
    stage.addChild(draggedObject);


  • Super User

    Scusa, ma questo codice:
    nome_mc.onPress = function () {
    startDrag ("_root.nomeclipdatrascinare", true);
    }

    che fai premi nome_mc per trascinare un' altra MovieClip :mmm:


  • User Attivo

    Oddio, in genere quando devo trascinare un oggetto qualsiasi faccio così

    Importo l'oggetto, lo converto in clip filmato, chiamiamolo mc1, e dentro mc1, creo un pulsante sullo stato sopra (quindi trasparente) che mi copra tutto mc1, torno ad mc1, seleziono il pulsante e vi associo lo script:

    on (press) {
    startDrag ("_root.mc1", true);
    }
    on (release) {
    stopDrag ();
    }

    e in genere funziona!! (dimmi se sbaglio)!!

    Ma questa volta devo trascinare un swf esterno caricato nell'swf principale tramite loadMovie (rilascio di un tasto carica dentro un movie clip vuoto, diciamo load_mc), e questo swf esterno, tra l'altro, deve essere ''utilizzabile'' dall'utente...quindi non posso coprire load_mc con un bottone trasparente, anche perché il bottone si troverebbe sotto l'swf che carico...come faccio a renderlo draggabile alla pressione e non draggabile al rilascio del mouse???
    ed in oltre, ho sempre il problema, che l'utente dovrebbe poter cliccare su uno o un altro swf in modo che questi si spostino in primo piano!! 😞
    Non so se sono stato chiaro!!
    Tu sei molto gentile però 🙂

    Se è il caso ti allungo i file 😉 (ma non voglio chiedere troppo!!)
    Grazie ancora!!


  • Super User

    Invece di creare un' area sopra al bottone o MovieClip, puoi fare semplicemente così:
    nomeMovieClip.onPress=function()
    {
    this.startDrag();
    }

    da quel codice quindi:

    nomeClipCheContieneSWFCaricato.onPres=function()
    {
    this.getDepth(_root.getNextHighestDepth());
    this startDrag();
    }


  • User Attivo

    Niente ... 😞 ho inserito il tuo codice nel gestore ClipEvent assegnandolo ad ogni istanza filmato che mi carica i rispettivi swf esterni ma non accade nulla!!

    Non ci capisco!! :mmm:
    A te grazie comunque !!


  • Super User

    non nel gestore clipEvent ! 🙂

    Impara a scrivere codice sulla timeline, non sui bottoni o sulle MovieClip.

    Usa la mia tecnica dalla timeline e vedrai che ti troverai meglio.


  • User Attivo

    In che senso??

    Io ho un solo livello che chiamo ''azioni'' e scrivo tutto lì, ed il codice l'ho immesso in questo livello ''azioni''... Sono d'accordo con te, scrivo codice nei movieclip solo quando è relativo ad una sua animazione particolare, indipendente dal filmato!!

    Ma poi la cosa strana è che per un istante mi ha fatto muovere gli swf, poi niente più (ma ad ogni modo non li portava uno avanti l'altro a secondo di quello che selezionavo) 😞

    😢😢😢


  • User Attivo

    P.S,
    i vari movie clip, pulsanti etc. sono su livelli separati da quello ''azioni'' 😉


  • User Attivo

    ah, dimenticavo.... se si muovevano non erano però attivi, cioé l'swf si muoveva ma i bottoni al suo interno non si azionavano!! 😞


  • Super User

    Se dentro agli SWF hai dei bottoni, allora ecco perchè creavi 'la finta area' sull' swf caricato, ma non credo ti serva a molto.

    Purtroppo in queste situazioni non posso aiutarti molto, ho caricato swf esterni molto raramente, sono abituato a sviluppare con classi AS per cui non so che dirti al momento...

    Con Flash se lavori dalla timeline e scrivi tutto lì, se hai bottoni dentro ad una MovieClip a cui applichi degli eventi del mouse sono problemi.

    Se sei sulle classi lo gestisci molto meglio.

    :bho:


  • Super User

    Prova a crare un bordo all' interno della MovieClip che carica l' swf e rendi trascinabile solo quello.


  • User Attivo

    Ho inserito:

    bottone1.onRelease = function() {
    mc1.loadMovie("xxxxx1.swf");
    };

    bottone2.onRelease = function() {
    mc2.loadMovie("xxxxx2.swf");
    };

    var mc1(mcvuoto che carica l'swf esterno 1):MovieClip;
    var mc2(mcvuoto che carica l'swf esterno 2):MovieClip;

    mc1._level = mc1.getDepth;
    mc2._level = mc2.getDepth;

    var myRoot:MovieClip = this.mc1;
    var myRoot:MovieClip = this.mc2;

    var maxLength:Number = myRoot.getNextHighestDepth();

    mc1.onMouseDown = function() {
    this.startDrag();
    this.swapDepths(maxLength++);
    };

    mc1.onMouseUp = function() {
    this.stopDrag();
    mc1.swapDepths(loadingcruciverba._level);
    };

    mc2.onMouseUp = function() {
    this.startDrag();
    this.swapDepths(maxLength++);
    };

    mc2.onMouseDown = function() {
    this.stopDrag();
    mc2.swapDepths(mc2._level);
    };

    e i movimenti (alla pressione o al rilascio del mouse) e gli avanzamenti in primo piano funzionano...ma le azioni degli swf esterni sono andate a farsi benedire!! :mmm:

    Niente...devo trovare altre soluzioni!! ... Ma ci sono quasi :P....credo :eheh:

    Ti ringrazio comunque per l'attenzione!! 🙂


  • User Attivo

    ora provo a spostare la discussione su AS.2.0 ...magari lì c'è qualcuno che ha avuto il mio stesso problema 😉