2010-02-05 12 views
7

C'è un modo per accedere o ripetere un elenco di tutti gli oggetti esportati in ActionScript dall'IDE Flash? Sto cercando di risparmiarmi dei problemi semplicemente iterando attraverso MC selezionati e processandoli in un certo modo, senza conoscerne i nomi.Flash AS3 - Ottenere un elenco di oggetti Libreria?

Grazie.

risposta

0

Ho avuto un problema simile e sarei interessato a una soluzione se ce n'è una migliore. Quello che ho finito, però, era che il costruttore di ogni elemento trovasse la classe del documento (chiamando this.parent finché non ne trovava uno che era della classe giusta) e poi chiamando una funzione di quella classe di documento.

Stavo cercando di fornire le informazioni sul gioco relative alle posizioni che ho inserito nell'IDE.

così ho dato Località un costruttore come questo:

public function Location(){ 
    var d:DisplayObject = parent; 
    while(!(d is Game)){ 
     d = d.parent 
    } 

    d.addLocation(this); 
} 

Poi nella classe di gioco sono stato in grado di aggiungere loro di un array e scorrere attraverso di loro. Sono sicuro che questo non può essere il modo migliore per farlo, ma ha funzionato.

+0

È possibile aggiungere ogni MC per un contenitore e poi iterare che per le posizioni e roba. Speravo di evitare quel passo intermedio. – Scott

0

Fondamentalmente, No ... Quando si esporta in ActionScript nella libreria, diventa una classe. Come le altre classi - MovieClip, Loader ... ecc. queste sono tutte proprietà in fase di compilazione. Fondamentalmente, non c'è modo di scoprire queste classi durante l'esecuzione.

Ma, hai menzionato iterando tramite MC e facendo qualcosa per loro. Se avete bisogno di fare qualcosa con il MCs già in scena a seconda della loro classe, è possibile farlo utilizzando il seguente:

for (var i=0; i<this.numChildren; i++){ 
    trace("Movie Name: "+this.getChildAt(i).name); 
    trace("Movie Class: "+getQualifiedClassName(this.getChildAt(i))); 
} 

Utilizzando il ciclo sopra e getQualifiedClassName può essere una soluzione alternativa.

1

Non in fase di esecuzione, n. È tuttavia possibile manipolare oggetti di libreria con JSFL nell'IDE: http://livedocs.adobe.com/flash/9.0/main/flash_cs3_extending.pdf. Non sono sicuro che questo sia di aiuto, ma forse puoi generare codice da utilizzare nella tua applicazione analizzando la libreria in qualche modo.

var lib = fl.getDocumentDOM().library; 
for (var i = 0; i < lib.items.length; i++) 
{ 
    var item = lib[0]; 
    fl.trace(item.name + " " + item.getItemType()); 
} 

Forse generare del codice in base a oggetti della libreria getItemProperty() o getItemType().

Oltre a ciò, penso che la cosa migliore da fare sia fare come gli altri hanno detto. Crea un filmato fittizio contenente ogni elemento al suo interno e nascondilo fuori dal palco. Aggiungi un listener per "aggiunto allo stage" su di esso e passa in rassegna i suoi figli e usa "reflection" getQualifiedClassName per eseguire azioni basate sulla sua classe o semplicemente usa un nome di istanza e un'istruzione switch.

Infine, cosa si sta esattamente "elaborando" su ciascuno di questi MovieClip? Forse è più un problema di progettazione e dovrebbero estendere una sottoclasse comune di MovieClip che ha aggiunto un gestore "aggiunto allo stage" dove si guarda il tipo di MovieClip quando viene aggiunto all'applicazione ed esegue alcune azioni in quello single funzione. Sto lavorando ad alcuni lavori di localizzazione al lavoro in questo momento e questo è il modo in cui gestiamo l'elaborazione di più clip diversi in fase di esecuzione.

1

Queste domande sono in qualche modo simili a this one.

Questa è la JSFL è necessario elencare i solo i MovieClips che vengono esportati in ActionScript:

var doc = fl.getDocumentDOM(); 
var libItems = doc.library.items; 
var libItemsNum = libItems.length; 
var classesString = 'var '+doc.name.substr(0,doc.name.length-4)+'Classes = ['; 
var classesNum = 0; 
var classes = []; 

fl.outputPanel.clear(); 
for(var i = 0 ; i < libItemsNum; i++){ 
if(libItems[i].linkageExportForAS){ 
    classes[classesNum] = libItems[i].linkageClassName; 
    classesNum++; 
} 
} 
for(i = 0; i < classesNum; i++){ 
if(i < classesNum-1) classesString += '"'+classes[i]+'",'; 
else  classesString += '"'+classes[i]+'"];'; 
} 
fl.clipCopyString(classesString); 
fl.trace(classesString); 

Si traccia il nome delle classi esportate come un array di stringhe in modo da poter utilizzare tale con ApplicationDomain's GetDefinitionByName() o flash.utils.getDefinition(). Inoltre, copia il messaggio tracciato negli Appunti. Se si salva JSFL nella cartella Commands, è possibile impostare una scorciatoia da tastiera per un po 'di velocità.

HTH, George

Problemi correlati