2010-02-19 6 views
0

나는 생성자가 문자열 (내 디렉토리의 이미지 즉, jpg)을 인수로 취하고 메모리의 로더 객체를 통해 해당 이미지를로드하는 클래스를 작성하려고한다. 또한 다른 클래스에서 사용하기 위해 getBitmapFromLoader() 함수를 사용하여 로더의 비트 맵을 가져 왔습니다.이벤트 처리기에서 값을 반환 할 수 있습니까?

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; 
    } 
} 
} 

하지만 작동하지 않습니다. 이것은 내가 메인 클래스에서 사용하는 방법입니다 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]

: 이 무엇 플래시 출력입니다 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

가 "작동하지 않습니다", 또한 되돌아 가서 이전 질문에 대한 답을 수락대로 표시하십시오! – grapefrukt

+0

+1로 과거 답변을 표시합니다. 시스템을 의도 한대로 사용하면 훨씬 좋은 반응을 얻을 수 있습니다. –

+0

을 보조 노트로 사용하면 LoadImage 클래스가 Loader를 확장 할 필요가 없거나 적어도 코드에서 상위 클래스의 이점을 취하지 않고있는 것 같습니다. – goliatone

답변

1

음, 로더 자체가 DisplayObject 인이다 - 그래서 당신 수 만하는 AddChild (event.currentTarget) 및 그것은 잘 나타납니다. Sprite와 마찬가지로 DisplayObjectContainer를 확장합니다. 말 그대로 비트 맵을해야하는 경우

, 당신은 같은 것을 수행 할 수 있습니다

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

을 그리고 그런 식으로 않습니다. 메모리에서 약간 벗어난 부분을 조정해야 할 수도 있습니다.

혹시 디스플레이 API에 문제가있는 경우,이 곳과 다양한 표시 객체 아이들이 어떻게 연결되어 있는지 사는 것을 요약 할 수있는 아주 좋은 차트 : 당신이 좀 더 구체적인보다 필요 http://accad.osu.edu/~pgerstma/class/pca/resources/as3API/AS3API-flash.display.png

+0

덕분에 실제로 addChild mathod에서 인수를 변경했을 때 효과가있었습니다. 하지만 기본적으로이 로더 객체의 비트 맵 데이터를 다른 클래스에서 가져와야합니다. 그래서 나는 당신이 bitmapData에 대해 제안한 코드를 사용할 수 없다고 생각합니다. 물론 지금 내가 만든 스프라이트 참조를 통해 얻을 수 있지만 다른 방법으로 얻을 수 있습니까? – Ponty

+0

정확히 무엇이 필요한지 잘 모르겠지만 도움이된다면 DisplayObject를 확장하는 모든 것이 BitmapData에서 드로잉 할 수 있습니다. 즉, bitmapData 인스턴스를 만들고 "bmd.draw (targetDisplayObject)"라고 말하면 BitmapData 객체로 직접 변환 할 수 있습니다. 그러면 드로잉 할 때의 픽셀 데이터가 포함 된 BitmapData 객체를 가질 수 있습니다. 이것이 도움이된다면 위의 의견에서 만 세이 지적한대로 내 답변을 수락하십시오. 답변을 수락하면 커뮤니티에서 더 나은 도움을받을 수 있습니다. 건배! – Myk

+0

기본적으로 로더를 통해 이미지를로드하는 클래스가 있습니다. 그리고 bitmapData의 데이터를 조작 할 또 다른 클래스입니다. 그래서, 나는 첫 번째 클래스를 사용하여 다양한 이미지를로드하고 두 번째 클래스는 비트 맵 데이터를 조작합니다. 그래서 어떻게 든 그들의 이미지를로드하는 데 사용하지 않는 외부 클래스에서 비트 맵 데이터를 참조해야합니다. 그리고 기본적으로 LoadImage 클래스에서이 정보를 전달하여 Main 클래스를 말할 수있는 가장 적절한 방법을 묻습니다. – Ponty

관련 문제