The Nothing Blog

The corporate blog of Nothing.

Photos

Archiv

Loop

Compiled und Runtime Assets in AS3

Dienstag, 27.02.2007

Letzthin führte ich mein erstes richtiges Flash-9-Projekt nicht mit Flex sondern vollständig mit AS3 durch. Wie bei Flash 8 gewohnt, öffnete ich in Flash 9 public alpha, zeichnete dort meine Grafiken auf die Bühne, wies eine Document-Klasse zu und… konnte nicht auf die Grafiken auf der Bühne zugreifen. Auch das direkte Zugreifen auf die Bibliothek schien nicht mehr nach alter Manier zu funktionieren.

Nach einiger Forschung fand ich verschiedene Varianten, um auf die Assets in der Bibliothek zuzugreifen.

Einerseits kann man mit

{{{
[Embed(source="../deploy/library.swf",symbol="TestButton_up")]
private var TestButton_up:Class;
}}}

Bibliotheksymbole aus Flash-8-Movies in das neue SWF reinkompilieren – Compiled Assets.

Andererseits lassen sich externe SWFs mit der Loader-Klasse reinladen und als Library benützen, indem man in den ApplicationDomains dieser SWFs nach Klassen sucht:

{{{
public function getAsset( id:String ):DisplayObject {
for( var i:int = 0; i < domains.length; i++ ) {
var ad:ApplicationDomain = ApplicationDomain( domains[ i ] );
if( ad.hasDefinition( id ) ) {
var c:Class = Class( ad.getDefinition( id ) );
return new c();
}
}
throw new ArgumentError( "there is no Class with this id" );
return null;
}
}}}

Diese reingeladenen Assets werden oft als Runtime Assets bezeichnet.

Aus dem Wunsch, die Compiled und Runtime Assets unter einen Hut zu bringen, entstand die Idee für einen AssetManager, der mit einem Befehl “getAsset( classname )” das Asset zurückliefert, egal ob es ein reinkompiliertes oder ein runtime-geladenes Asset ist.

So kann man im Hintergrund die Quelle ändern, ohne den Source zu überarbeiten. Konkret sieht das Ganze gegenwärtig so aus:

{{{
AssetManager.addSource( new Library() );
AssetManager.addSource( new RuntimeAssets( "pathtoswf" ) );

// später im code, wenn alles geladen ist.
AssetManager.getAsset( “classname” ); // gibt das Asset mit dem Klassennamen classname in einer der beiden Quellen zurück.
}}}

Die Library-Klasse sieht folgendermassen aus:

{{{
package {
import ch.sfug.util.assets.CompiledAssets;
public class Library extends CompiledAssets {
[Embed(source="../deploy/test_f8.swf",symbol="TestButton_up")]
private var TestButton_up:Class;
[Embed(source="../deploy/test_f8.swf",symbol="TestButton_down")]
private var TestButton_down:Class;
[Embed(source="../deploy/test_f8.swf",symbol="TestButton_over")]
private var TestButton_over:Class;
[Embed(source="../deploy/test_f8.swf",symbol="TestButton_disable")]
private var TestButton_disable:Class;
[Embed(source="../deploy/test_f8.swf",symbol="VertexButton_up")]
private var VertexButton_up:Class;
[Embed(source="../deploy/test_f8.swf",symbol="VertexButton_disable")]
private var VertexButton_disable:Class;
}
}
}}}

Diese Klasse dient lediglich zum Wrappen der Assets. Wie man sieht, erbt diese Klasse von Compiled Assets, wo der “getAsset” – Zauber wie folgt passiert:

{{{
public function getAsset( classname:String ):DisplayObject {
var xml:XML = describeType( this );
var dynamicClass:String = xml.@name + "_" + classname;
if( hasDefinition( dynamicClass ) ) {
var classRef:Class = getDefinitionByName( dynamicClass ) as Class;
return new classRef();
} else {
throw new ArgumentError( "there is no Class with name: " + classname );
return null;
}
}
}}}

Vorteil dieser Library-Klasse ist, dass die ganzen Assets der Bibliothek nicht in der ApplicationDomain des Haupt-SWFs aufgelistet werden, sondern nur über die Library-Klasse zugänglich sind. So wird ein grösseres Klassennamen-Chaos verhindert.

Die ganze AssetManager-Idee muss ich nochmals überarbeiten und Testcases dazu schreiben. Es gibt noch einiges, das ich optimieren kann, aber die Grundidee wird gleich bleiben.

Das ganze Package werde ich morgen Mittwoch am sfug-Meeting präsentieren. Es wird auch in der neuen sfug-Library zugänglich sein, wo alle Interessierten mitentwickeln und mittesten können.

Ressourcen zum Thema
Embedding Resources with AS3

Von Loop : Michael Heimann | Veröffentlicht: Dienstag, 27.02.2007 11:12 | Keine Kommentare

Permalink | Category: Allgemein



Kommentar hinterlassen:


 

 

 

 


* E-Mail und Name müssen ausgefüllt werden.


Nothing, Kirchstrasse 175, 3084 Wabern-Bern, Schweiz / Switzerland, info@nothing.ch, +41 (0) 31 384 1010

Terms of Use  |  Privacy Policy

 
Follow us!