2011-01-21 3 views
0

J'ai un BuildingSprite qui étend Sprite. J'essaye de charger la bibliothèque externe de swf dans mon application principale.Chargement de swf externe et affectation à la classe personnalisée

J'ai ce code et il fonctionne très bien:

private function loadBuilding():void{ 
// this context is necessary to find the shared assets 
var context:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain); 

// load in the asset swf 
var loader:Loader = new Loader(); 
var req:URLRequest = new URLRequest("assets/Tree.swf"); 
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onAssetsLoaded); 
    loader.load(req, context); 
} 


private function onAssetsLoaded(_event:Event):void{ 
// get a reference to the loaded library 
var loader:Loader = LoaderInfo(_event.target).loader; 
var library:* = loader.content; 
var assetClass:Class = loader.contentLoaderInfo.applicationDomain.getDefinition("Tree") as Class; 
// create an instance of the shared asset 
var mySprite:Sprite = new assetClass();  
..... 
} 

J'ai créé une nouvelle classe - BuildingSprite qui s'étend Sprite:

package 
{ 
import flash.display.Sprite; 

public class BuildingSprite extends Sprite 
{ 
    public function BuildingSprite() 
    { 
     super(); 
    } 
} 
} 

Et de la onAssetsLoaded ci-dessus, je change le code:

var mySprite:Sprite = new assetClass(); 

à

var mySprite:BuildingSprite = new assetClass(); 

debugger et obtenir cette erreur: thread principal (Suspendu: TypeError: Erreur # 1034: Type Coercion a échoué: ne peut pas convertir arbre @ c8f0301 à BuildingSprite.)

Je pense qu'il ya une erreur de coulée de type . Est-il possible de charger la bibliothèque SWF externe et de l'assigner à une classe personnalisée?

Répondre

1

le problème ici est que Tree est une classe étendant la classe Sprite déjà « ne peut pas convertir l'arbre @ c8f0301 »

BuildingSprite est une autre sprite extension de classe. Pensez-y comme un arbre où Sprite est le tronc, et les classes sont les branches, tandis que les deux se rapportent à leur classe Sprite d'origine, ils ne se reconnaissent pas. Ce que vous devez faire est de montrer comment ils sont liés. en convertissant l'arborescence en image-objet et l'image-objet en BuildingSprite en deux étapes.

var mySprite:BuildingSprite = (new assetClass() as Sprite) as BuildingSprite ;

Si vous avez étendu la classe Sprite avec des fonctions supplémentaires dans votre classe d'arbres, vous perdez ces fonctions ou entrer dans certaines questions, mais si elle est juste un graphique que vous souhaitez utiliser, cela ne devrait fais le. Sur une note de côté, l'utilisation des bibliothèques disponibles peut accélérer les choses. Donc, si vous avez une chance, ont un coup d'oeil le casalib, en particulier (se rapportant au sujet) les contentAsMovieClip et createClassByName fonctions sous swfLoad


modifier

On dirait que je devrais testé plus. Il se avère que si vous faites cela var s:Sprite = (new assetClass() as Sprite), il convertit s à tout assetClass de classe() est plutôt que l'inverse, donc si vous faites une trace de s il ne sera pas un Sprite plus

la façon dont je traite cela est de créer un sprite générique (en fait CasaSprite) et d'ajouter un var view:Sprite (ou displayObject ou MovieClip) en tant qu'enfant. Ce n'est probablement pas la réponse que vous cherchiez, mais cela fonctionne.

0

J'ai essayé de tracer le code:

trace(new assetClass() as Sprite) 

Et il est revenu:

[object Tree] 

Et

trace((new assetClass() as Sprite) as BuildingSprite) 

Mais il est revenu:

null 

J'ai créé le Tree.swf avec le symbole d'un arbre dans la bibliothèque que

  • permettent "Exporter pour ActionScript"

  • et "classe de base: flash.display.MovieClip"

Une erreur est survenue ici?

Merci pour le guide. Je crée un jeu en utilisant une bibliothèque isométrique. Au lieu de charger chaque bâtiment avec png en utilisant BitmapData, j'essaye de charger un swf de bibliothèque externe qui contient tous les bâtiments dans la bibliothèque.

Je crois que la taille de fichier pour le swf sera plus petit que tous les fichiers png. J'ai besoin d'une classe personnalisée pour Construire qui étend Sprite/MovieClip afin que je puisse avoir des propriétés personnalisées comme Direction, Coût, etc. Avez-vous un exemple de code de ressource que je peux télécharger pour référence? Merci.

Questions connexes