2010-02-19 3 views
0

J'essaye d'écrire une classe que son constructeur prend comme argument un String (qui est une image dans mon répertoire ie: jpg) et charge l'image correspondante via un objet loader en mémoire. Je fournis aussi la fonction getBitmapFromLoader() pour obtenir le bitmap du chargeur afin de l'utiliser depuis une autre classe.Un gestionnaire d'événements peut-il renvoyer une valeur?

public class LoadImage extends Loader 
{ 
    private var bitmap:Bitmap; 
    private var ldr:Loader; 

    public function LoadImage(nameURL:String):void 
    { 
     trace("LoadImage constructor"); 
     ldr = new Loader(); 
     ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler); 
     ldr.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorEventHandler); 
     var request:URLRequest = new URLRequest(nameURL); 
     ldr.load(request); 
    } 

    /* methods */ 
    public function getBitmapFromLoader():Bitmap 
    { 
     return bitmap; 
    } 

    public function toSprite():Sprite 
    { 
     trace("toSprite method"); 
     var sprite:Sprite = new Sprite(); 
     sprite.addChild(bitmap); 
     return sprite; 
    } 

    public function toMovieClip():MovieClip 
    { 
     trace("toMovieClip method"); 
     var mvc:MovieClip = new MovieClip(); 
     mvc.addChild(bitmap); 
     return mvc; 
    } 

    private function completeHandler(event:Event):void 
    { 
     trace("completeHandler " + event.currentTarget); 
     bitmap = new Bitmap(); 
     bitmap = Bitmap(event.currentTarget.content); 
    } 

    private function ioErrorEventHandler(event:IOErrorEvent):void 
    { 
     trace("ioErrorEventHandler " + event.currentTarget); 
     trace("error on loading image: " + event.currentTarget.url); 
     bitmap = null; 
    } 
} 
} 

mais cela ne fonctionne pas. Ce est ce que les sorties Flash: Main constructor LoadImage constructor toSprite method TypeError: Error #2007: Parameter child must be non-null. at flash.display::DisplayObjectContainer/addChild() at loader::LoadImage/toSprite() at Main() completeHandler [object LoaderInfo]

Voici comment je l'utilise d'une classe principale: package { import loader.*;

import flash.display.MovieClip; 
import flash.display.Sprite; 

public class Main extends MovieClip 
{ 
    /* properties */ 

    /* constructor */ 
    public function Main():void 
    { 
     trace("Main constructor"); 
     var imgLdr:LoadImage = new LoadImage("smile_bg.jpg"); 
     var spr1:Sprite = imgLdr.toSprite(); 
     //this.width = spr1.width; 
     //this.height = spr1.height; 
     this.addChild(spr1); 
    } 

    /* methods */ 

} 

}

+4

vous devez être un peu plus précis que "ne fonctionne pas", aussi, revenez en arrière et marquez les réponses à vos questions passées comme acceptées! – grapefrukt

+0

+1 en marquant les réponses passées comme acceptées. Vous obtiendrez de bien meilleures réponses si vous utilisez le système comme prévu. –

+0

comme une note de côté, il me semble que votre classe LoadImage n'a pas besoin d'étendre Loader ou au moins vous ne prenez pas les avantages de la classe parente dans votre code ... – goliatone

Répondre

1

Eh bien, un chargeur lui-même est un DisplayObject - vous pouvez donc addChild (event.currentTarget) et ça va se montrer très bien. Il étend DisplayObjectContainer tout comme le fait Sprite.

Si vous avez besoin littéralement Bitmap, vous pouvez faire quelque chose comme:

var bmd:BitmapData = new BitmapData(event.currentTarget.width, event.currentTarget.height); 
bmd.draw(event.currentTarget); 
bitmap = new Bitmap(bmd); 

Et le faire de cette façon. Vous devrez peut-être modifier un peu ce que je vais de la mémoire.

Si vous jamais avoir des problèmes avec l'API d'affichage, c'est un très bon tableau pour résumer ce que vit où et comment les différents enfants d'objets d'affichage sont connectés: http://accad.osu.edu/~pgerstma/class/pca/resources/as3API/AS3API-flash.display.png

+0

merci, en fait quand j'ai changé l'argument dans addChild mathod cela a fonctionné. Mais mon besoin fondamental est d'obtenir le BitmapData de cet objet loader mais d'une autre classe. Donc je pense que je ne peux pas utiliser le code que vous proposez à propos de bitmapData. Bien sûr maintenant je peux l'obtenir à travers la référence de sprite que j'ai créée, mais puis-je l'obtenir d'une autre manière? – Ponty

+0

Je ne suis pas sûr de comprendre exactement ce dont vous avez besoin, mais si cela vous aide: tout ce qui étend DisplayObject peut être dessiné par BitmapData. Cela signifie que vous pouvez le convertir directement en un objet BitmapData en créant votre instance bitmapData et en disant "bmd.draw (targetDisplayObject)" - alors vous avez un objet BitmapData qui contient les données de pixel pour tout ce que vous dessinez. Si cela aide, veuillez accepter ma réponse comme l'a souligné Hooray dans les commentaires ci-dessus. Vous obtiendrez une meilleure aide de la communauté si vous acceptez les réponses. À votre santé! – Myk

+0

Fondamentalement, j'ai une classe qui charge l'image via un chargeur. Et une autre classe qui va manipuler les données de son bitmapData. Donc, je vais utiliser la première classe pour charger diverses images, et la deuxième classe pour manipuler leurs données bitmapdata. Donc, je dois faire référence à leur bitmapdata en quelque sorte d'une classe externe pas celle que j'utilise pour charger les images. Et fondamentalement je demande quelle est la manière la plus appropriée de transférer cette information de la classe LoadImage pour dire une classe principale. – Ponty

Questions connexes