2014-05-21 3 views
2

나는 비트 맵 (Bitmap) 콘텐츠를 푸는 배열을 가지고 있는지 궁금하다. 클릭 할 때 특정 이미지의 인덱스를 얻는 방법. 나는 indexOf를 사용하려고 시도했지만 운이 없다. 나의 코드는 아래에있다. 시간 내 주셔서 감사합니다.(배열에서) bitmapdata에서 비트 맵 이미지의 인덱스를 얻는 방법은 무엇입니까?

코드 :

//First Part is where i add the URLRequest and add the image into contentHolder then onto Stage 
function loadImage():void { 
    for(var i:int = 5; i < somedata.length; i++){ 
     if(somedata[i]){ 
      var loader:Loader = new Loader(); 
      loader.load(new URLRequest("http://www.rentaid.info/rent/"+somedata[i])); 
      loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onImageLoaded); 

     } 
    } 
} 


function onImageLoaded(e:Event):void { 
    loadedArray.push(e.target.content as Bitmap); 

    for(var i:int = 0; i < loadedArray.length; i++){ 
     var currentY1:int = 200; 

     e.currentTarget.loader.content.height =200; 
     e.currentTarget.loader.content.y += currentY1; 
     currentY1 += e.currentTarget.loader.content.height +300; 
     _contentHolder.mouseChildren = false; // ignore children mouseEvents 
     _contentHolder.mouseEnabled = true;  // enable mouse on the object - normally set to true by default 
     _contentHolder.useHandCursor = true;  // add hand cursor on mouse over 
     _contentHolder.buttonMode = true; 

     _contentHolder.addChild(loadedArray[i]); 
     addChild(_contentHolder); 
     _contentHolder.addEventListener(MouseEvent.CLICK, gotoscene); 
    } 
} 

// then the part where i try to get the index 
function gotoscene(e:MouseEvent):void { 
    var index:Number; 
    index = loadedArray.indexOf(e.target); 
    trace(index); 
} 

편집 :

var viewport:Viewport = new Viewport(); 

    viewport.y = 0; 

    viewport.addChild(_contentHolder); 
+0

에 의존하지 코드를 추가 해요? gotoscene은 어떻게 불려지나요? 어둠 속에서 찔러, e.target을 e.currentTarget으로 변경하십시오. –

+0

죄송합니다. 코드를 편집했습니다. 코드에서 gotoscene이 호출되는 방식, 즉 mouse_Event가 content_Holder가 클릭 될 때 포함되어 있습니다. 나는 행운을 빕니다 e.currentTarget을 시도했습니다. -1로 인덱스를 표시합니다. – Benyaman

+0

비트 맵은 마우스 클릭을 허용하지 않으므로 대신 Sprite를받습니다 (또는 로더 일 수도 있음). 따라서 콘텐츠를 가져와 배열과 비교하여 쿼리해야합니다. – Vesper

답변

2

첫 번째 질문은 아주 간단한 대답이 있습니다

var image:Bitmap = new Bitmap(); 
var images:Array = new Array(image); 

for (var i:uint = 0; i < images.length; i++) { 
    // images[i].bitmapData is the original image in your array 
    // image.bitmapData is searched one 
    if (images[i].bitmapData == image.bitmapData) { 
     // found 
    } 
} 

을하지만 문제는 이것보다 크다. 계속 걸어 다니는 것을 볼 수 있습니다.

콘텐츠 소유자가 아닌 각 어린이에게 수신기를 추가해야합니다. 저는 보통 로더를 사용하지 않지만, 비트 맵을 가져 와서 스프라이트 또는 장면에 추가하는 것으로 포장합니다. 비트 맵이 아닌 배열에이 스프라이트 또는 로더를 저장해야합니다. 그런 다음 각각에 리스너를 추가하고 (비트 맵이 아닌 스프라이트 또는 로더) 대상을 가져옵니다.

function gotoscene(e:MouseEvent):void { 
    var index:uint = loadedArray(indexOf(e.target)); 
} 

을하지만 실제로 클릭 할 수 있습니다 하나 개의 특정 유형을 저장하는 것이 중요합니다 : 당신이 배열에 저장 한 내용에 따라, 당신은 쉽게로 그것을 얻을 수 있습니다. 비트 맵에 대해 생각하지 마십시오. 이것은 그래픽 표현 일 뿐이며 코드에서 그다지하지 않습니다.

** 편집 : 가 좋아 난 당신이 필요하지만, 당신이 무엇을하고 있는지 이해하는 것이 중요하고 단지 다른 사람의 대답 : 당신은 당신의 코드를 포맷 할 수

function onImageLoaded(e:Event):void { 
    var bitmap:Bitmap = e.target.content as Bitmap; // get the Bitmap 

    var image:Sprite = new Sprite(); 
    image.addChild(bitmap); // wrap it inside new Sprite 

    // add listener to Sprite! 
    image.addEventListener(MouseEvent.CLICK, gotoscene); 

    // gets url of current image (http://website.com/images/image1.jpg) 
    var url:String = e.target.loaderURL; 

    // get only the number from that url by replacing or by some other way 
    // this removes the first part and results in "1.jpg" 
    var name:String = url.replace("http://website.com/images/image", ""); 
    // this removes the extension and results in number only - 1, 2, 3 
    // it's important to change this depending on your naming convention 
    name = name.replace(".jpg", ""); 
    image.name = "button" + name; // results in "button1", "button2", "button3" 

    // store object, name, or whatever (not really needed in your case, but commonly used) 
    loadedArray.push(image.name); 

    image.x = counter * 100; // position so you can see them, at 100, 200, 300, etc. 
    _contentHolder.addChild(image); // add newly created Sprite to content 
} 

function gotoscene(e:MouseEvent):void { 
    var name:String = e.target.name; 

    // strips down "button" from "button1", and only the number remains, 
    // which is 1, 2, 3, etc. the number of the scene :) 
    var scene:uint = name.replace("button", ""); 

    // you're the man now :) 
} 
+0

좋은 코드! 필자의 유일한 관심사는 bitmapData 비교에서 성능 문제가있을 수 있다는 것입니다. 그럴듯한 경우, 병렬/2D 배열은 사진을 문자열로 "색인"하기 위해있을 수 있습니다. 그런 다음 여기에도 완전히 적용되지 않을 수 있습니다. 그냥 생각. 모두 똑같이 upvote. – CodeMouse92

+1

@ JasonMc92 물론 맞습니다 :) LoaderInfo에는 loaderURL 속성이 있습니다.이 속성은 (event.target을 통해) 로더가 완료 될 때 수행 할 수 있습니다. 즉, Array는 이미지의 URL 만 저장할 수 있으며 나중에 검색 할 수 있습니다. 문제는 사용자가 클릭 한 이미지를 확인하고자 할 때입니다.물론 Sprite에 Bitmap을 래핑하고 Array에 저장하거나 인스턴스 이름을 저장하는 등 더 나은 옵션이 있습니다. 어쨌든 최적화 할 옵션이 많습니다. 내 코드는 샘플 일뿐입니다. –

+0

Hm , 좋은 해결 방법. 사실, 또 다른 하나는 "적어도 10 가지 좋은 방법이있다"라는 것입니다. – CodeMouse92

관련 문제