• User

    invocare una funzione in un oggetto istanziato

    vorrei realizzare "n" oggetti grafici animati (per fare un esempio diciamo una faccina ed una manina).
    tali oggetti grafici saranno poi istanziati in un numero imprecisato (tipo 3 o 4 manine, 5 o 6 faccine) sulla clip principale dell'applicazione attraverso il metodo attachMovie.
    vorrei che ogni oggetto abbia degli stati a se e che questi stati fossero attivati dalla clip principale, mi spiego con un esempio:
    le 3 o 4 manine dovrebbero avere gli stati: 1-mano chiusa, 2-mano aperta, 3-mano che saluta, etc...
    le 5 o 6 faccine dovrebbero avere gli stati: 1-faccina triste, 2-faccina indifferente,3-faccina sorridente, etc.
    gli oggetti dovrebbero avere una funzione in as che accetti un parametro dall'esterno (un numero) e "attivi" il relativo stato.
    il discorso è : dopo che ho istanziato e posizionato le istanze dei vari oggetti, con attachMovie, come faccio a dire: mano 1 saluta, faccina 2 ridi... dalla clip che ospita il movie istanziato?

    in pratica come faccio a scrivere una funzione in un oggetto grafico e a richiamarla poi dalla movie che lo ospita?

    grazie ciao.


  • Super User

    Ciao bubbolo,
    credo che la miglior cosa sia innanzitutto creare un keyframe con il proprio stato all'interno di ogni manina (es: keyframe1: manina ferma, keyframe2:manina che saluta, keyframe3:manina aperta ecc ecc).

    Fatto questo crei una funzione in questo modo:

    
    function changeStatement(m:MovieClip,n:Number):Void
    {
     m.gotoAndStop(n);
    }
    
    

    e la chiami così:

    
    changeStatement(manina_1_mc,2);
    
    

  • User

    ok, può andar bene.
    la mia reale esigenza è però richiamare dalla movieclip principale una funzione della movieclip istanziata (con attachMovie), dove poi tale funzione fà quello che ci siamo detti.
    ovviamente deve esserci un modo per identificare a quale istanza richiamare tale funzione, perchè potrei avere 100 istanze dello stesso clip ma vorrei invocare la funzione solo per l'instanza n. x.
    è possibile?


  • Super User

    Devi utilizzare un Array in questo modo:

    
    var clips_array:Array=new Array();
    var maninaCheSaluta:Number=2;
    var maninaAperta:Number=3;
    var maninaChiusa:Number=4;
    for(var i:Number=0;i<50;i++)
    {
     var clip:MovieClip=_root.attachMovie('nomeclip','clip_'+_root.getNextHighestDepth()+'_mc',_root.getNextHighestDepth());
     clips_array.push(clip);
    }
    for(var i:Number=0;i<clips_array.length;i++)
    {
     clips_array*.onPress=function()
     {
      changeStatement(this,maninaCheSaluta);
     }
    }
    function changeStatement(m:MovieClip,n:Number):Void
    {
     m.gotoAndStop(n);
    }
    
    

  • User

    quindi non posso avere una movieclip con le sue funzioni in un'altra movie clip e da questa usare le funzioni della movieclip incorporata?


  • Super User

    @bubbolo said:

    quindi non posso avere una movieclip con le sue funzioni in un'altra movie clip e da questa usare le funzioni della movieclip incorporata?

    Adesso non ti seguo... :mmm:


  • User

    lo so potrebbe sembrare strano.

    mi spiego meglio, magari con un esempio:

    poniamo di avere un cane che, in qualità di OGGETTO, ha dei metodi che potrebbero essere SEDUTO, CORRI, FERMO, etc.etc.

    poniamo ora di farne un clone e "consegnarlo" ad un padrone, che sarà abituato a impartire i comandi di cui sopra.

    se facessimo 1000 cloni tutti utilizzerebbero gli stessi comandi.

    quindi se il cane è l'oggetto che vorrei creare esso dovrebbe avere da qualche parte incorporato il codice per eseguire i comandi (diciamo delle funzioni).

    la clip che lo ospiterà dovrà semplicemente inviargli questi comandi; scrivendo del codice (ma probabilmente sbagliando):

    ponendo "aaa" l'oggetto origine e pensando che questo abbia una funzione, diciamo, myFunc()

    nella clip principale se faccio
    _root.attachMovie("aaa","mynewmovie1",1);
    quello che vorrei ottenere è qualcosa del genere
    mynewmovie1.myFunc();

    è possibile?


  • Super User

    Stai parlando di Object Oriented Programming.
    Certo che è possibile ma devi lavorare con le Classi di Flash e sfruttare l' Ereditarietà.
    Crei i tuoi Oggetti (Classi) e li implementi con i propri metodi (funzioni) e proprietà.


  • User

    mi faresti un esempio in tal senso?


  • Super User

    E' difficile fare un esempio di Object Oriented Programming.
    E' come dire ad un geometra se ti fa un esempio su come si costruisce una casa...

    Hai già delle basi di OOP ?


  • User

    si, capisco.
    ho gia' delle basi di OOP, ma con flash sono agli albori.


  • Super User

    Questo potrebbe essere un primo esempio:

    
    class Manina
    {
     private var clip:MovieClip;
     
     public function Manina()
     {
      this.init();
     }
     
     private function init(Void):Void
     {
      this.clip=_root.attachMovie('ma_manina','manina_mc',_root.getNextHighestDepth());
     }
     
     public function saluta(Void):Void
     {
      this.clip.gotoAndPlay(3);
     }
    }
    
    

    Salvi il file come Manina.as

    Dalla timeline istanzi l'oggetto Manina in questo modo:

    
    var my_manina:Manina=new Manina();
    
    

    e chiami i suoi metodi in questo modo:

    
    my_manina.saluta();
    
    

  • User

    ok grazie
    proverò...
    ciao