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

    Duplicare un MovieClip in AS3

    Ho messo le mani su Flash CS3, e quindi AS 3.0, ieri e devo dire che mi trovo abbastanza spaesato
    Fra le varie cose cambiate ho letto nella documentazione che il duplicateMovieClip è stato rimosso .... la documentazione stessa dice di usare il new per creare una nuova istanza.
    Francamente non mi è ben chiaro come agire ... in sostanza in AS2 ho sto codice in timeline:

    codice:
    for (var i:Number = 0; i<10; i++) {
    	this["mc"+i].duplicateMovieClip("mc"+(i+1), this.getNextHighestDepth());
    	this["mc"+(i+1)]._x += 100;
    }
    Dove mc0 è un movieclip che ho sullo stage ... chiaramente funzia tutto benone e l'mc di duplica senza problemi.
    Ora la domanda è: come caxxo si traduce in AS 3?

  2. #2
    ciao,

    occorre usare la keyword new, ogni oggetto ora viene istanziato in quanto classe.

    - definisci un symbol in libreria, se a questo symbol non associ una classe ci pensera' flash a crearne una di default, che conterra' il minimo indispensabile per poter trattare questo symbol a run-time

    - assegna un nome di linkage usando la convenzione per il naming di classe, ovvero con la prima lettera maiuscola, p.e. MyClip

    - dal punto di vista visivo lo puoi personalizzare come ti pare (immagini, suoni, grafica)

    per poterlo usare:

    codice:
    for(var i:int = 0; i < 10; i++) {
      var mc:MyClip = new MyClip();
      mc.x = i * 50;
      addChild(mc);
    }
    conviene guardarsi subito la sezione riguardante displaylist



    Jaco

  3. #3
    Ok perfetto, in effetti ho provato e mi duplica l'oggetto.
    Unica cosa che mi sfugge ora è come poter interagire con uno di questi nuovi oggetti creati.
    Cioè mi sfugge come poter identificare uno in particolare fra questi oggetti creati ... ho anche provato ad aggiungere al codice mc.name = "mc"+i per dare una sorta di nome istanza agli oggetti creati e in effetti facendo un trace li prende (mc0, mc1, ecc).
    Come faccio però a interagire con uno in particolare?
    Per esempio voglio che il primo oggetto abbia una y di 300, mente tutti gli altri vanno bene come sono ... come cacchio faccio ad identificare solo quello e manipolarlo?

    Grazie e scusa la mia completa ignoranza di AS3

    EDIT: Ho appena provato da dentro il ciclo a fare un semplice if sul nome ed in effetti funziona, unica cosa ancora non capisco come poterlo pescare e idenfiticare in generale (cioè fuori dal ciclo).
    Il codice ora è diventato il seguente:

    codice:
    for (var i:int = 0; i < 10; i++) {
    	var mc:MyMc = new MyMc();
    	mc.x = i * 200;
    	mc.name = "mc"+i;
    	if (mc.name == "mc0") {
    		mc.y = 300;
    	}
    	addChild(mc);
    }
    E in effetti il primo oggetto viene spostato in basso, mentre tutti gli altri stanno come prima .... ma se sta cosa la volessi fare a posteriori fuori dal clip?

  4. #4

    Risposta alla tua domanda

    Ciao Kaneda81!
    Anch'io ho avuto la stessa tua richiesta e guardando un po' sull'help di flash puoi trovare l'istanza che ti interessa e eventualmente eseguire operazione con il metodo

    <contenitore_delle_istanze_duplicate>.getChildByNa me(<nome_stanza>);

    Ovviamente funziona se hai dato un valore alla proprietà "name" di ogni istanza creata se no devi viaggiare con il getChildById (secondo me più scomodo)

    al tuo codice inserisci questa riga dopo il for e poi fai partire il filmato

    Codice PHP:
    this.getChildByName("mc1").y=150;
    this.getChildByName("mc1").alpha=150
    Puoi ovviamente per eseguire queste istruzioni a tutte le istanze basta fare un for staccato e mettere nel for

    Codice PHP:
    this.getChildByName("mc"+i).y=150;
    this.getChildByName("mc"+i).alpha=150
    Spero di esserti stato utile.

    My site: www.andreaciani.com

  5. #5

    Ulteriore esempio

    Ciao di nuovo!

    Visto che ci sono copia e incolla nel primo fotogramma questo codice (il nome della classe del tuo mc è MyClip se no non funziona)

    Potevo benissimo integrare gli addEventListener direttamente nel primo for ma l'ho fatto apposta per farti vedere come funziona il tutto (se li metti nel primo for attenzione che non devi più scrivere <this.getChildByName("mc" + i).> ma solo <mc.>. Il listener meglio inserirlo prima dell'addChild())

    Codice PHP:
    for (var i:int 010i++) {
        var 
    mc:MyClip = new MyClip();
        
    mc.40;
        
    mc.name "mc"+i;
        
    addChild(mc);
    }
    for (
    010i++) {
        
    this.getChildByName("mc" i).addEventListener(MouseEvent.CLICK,printa);
        
    this.getChildByName("mc" i).addEventListener(MouseEvent.MOUSE_DOWN,drag_start);
        
    this.getChildByName("mc" i).addEventListener(MouseEvent.MOUSE_UP,drag_stop);
    }
    function 
    printa(event:MouseEvent):void {
        
    trace("Hai cliccato su "+event.target.name);
    }
    function 
    drag_start(event:MouseEvent):void {
        
    event.target.startDrag();
    }
    function 
    drag_stop(event:MouseEvent):void {
        
    event.target.stopDrag();

    ciao.
    My site: www.andreaciani.com

  6. #6

    Focus sul clip su cui selezioni

    Ciao, un altro esempio carino è quello del portare il focus di un oggetto su cui clicchi sopra tutti gli altri mantenendo la parentela tra tutti:

    prova questo codice e quando fai partire il filmato sovrapponi i clip e vedrai che se clicchi su uno "sotto" un altro si posizionerà direttamente davanti a tutti.

    Codice PHP:
    for (var i:int 010i++) {
        var 
    mc:MyClip = new MyClip();
        
    mc.40;
        
    mc.name "mc"+i;
        
    mc.addEventListener(MouseEvent.MOUSE_DOWN,drag_start);
        
    mc.addEventListener(MouseEvent.MOUSE_UP,drag_stop);
        
    addChild(mc);
    }
    function 
    drag_start(event:MouseEvent):void {
        
    trace("Hai cliccato su "+event.target.name);
        
    addChild(this.getChildByName(event.target.name));
        
    event.target.startDrag();
    }
    function 
    drag_stop(event:MouseEvent):void {
        
    event.target.stopDrag();

    My site: www.andreaciani.com

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    26
    Scusate, ho seguito il vostro esempio ma da un errore:
    1120: Accesso alla proprietà non definita drag_start
    1120: Accesso alla proprietà non definita drag_stop

    dati da this.getChildByName("mc"+i).add................

    dove sbaglio?

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    26
    ok sono un cretino
    sistemato quell'errore adesso ho questo (non come errore del compilatore ma come output):
    TypeError: Error #1009: Impossibile accedere a una proprietà o a un metodo di un riferimento oggetto null.
    at Prova_fla::MainTimeline/Prova_fla::frame1()

    che è????

  9. #9
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    Meglio se apri un nuovo thread, m'era sfuggita la risposta un po' ritardataria di Flugger

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.