2011-06-03 52 views
0

我正在構建一個自定義圖像選擇器,顯示6個備選版本。但照片只顯示在第6項。添加Sprite的多個實例?

_model.selectedPhoto返回一個Sprite,並且不會讓該應用正常工作。

但是,當我使用_model.photos[ii],照片被添加到每個項目 - 這是爲什麼?我需要添加_model.selectedPhoto每個s:Sprite

 for (var ii:int; ii < 6; ii++) 
     { 
      //Create BG 
      var s:Sprite = new Sprite(); 
      s.graphics.beginFill(Math.random() * 0xffffff, 0.4); 
      s.graphics.drawRect(0, 0, 291, 184); 
      //add Photo 
      var p:Sprite = new Sprite(); 
      p.addChild(_model.selectedPhoto); 
      p.scaleX = p.scaleY = 0.2; 
      p.x = 0; 
      p.y = 0; 
      s.addChild(p); 
      cards.push(s); 
     } 

回答

3

嗯它只是顯示,因爲你正在運行一個for循環的6倍並將選擇的照片陸續每個新的精靈六號項目的一張照片。您將看到何時將顯示對象添加到其他顯示對象,然後將該顯示對象添加到其他顯示對象,原始項目將從第一個顯示對象中拉出並添加到下一個顯示對象中。我知道什麼時候寫了這樣的方式讓突破,可能是很難理解下來是這樣的:

var photo:Sprite = new Sprite(); 

var container1:Sprite = new Sprite(); 

var container2:Sprite = new Sprite(); 

//Add to the first container 
container1.addChild(photo); 

//At this point when you add to the next container, the object is removed from container1 and placed inside container 2 
container2.addChild(photo); 

這就是爲什麼當你使用_model.photos [II]你添加一個獨特的畫面到每個6個新的您在for循環中製作的容器精靈,因爲有添加到每個容器的獨特項目。您正在通過使用數組索引(ii var)訪問這些獨特的項目,該索引隨着每個循環而遞增。

如果你想添加相同的圖片到每六個項目,那麼你將需要複製原始圖片的數據6次。一種方法是使用URLLoader對象並重新加載組成原始圖片的二進制數據。你可以這樣做:

var originalPictureLoader:URLLoader = new URLLoader(); 

originalPictureLoader.addEventListener(Event.COMPLETE, originalPictureLoaded); 

originalPictureLoader.dataFormat = URLLoaderDataFormat.BINARY; 

originalPicture.load(new URLRequest("http://www.mysite.com/picture.jpg")); 

private function originalPictureLoaded(e:Event):void 
{ 
    var pictureBytes:ByteArray = URLLoader(e.currentTarget).data as ByteArray; 

    var imageDiplicateLoader:Loader; 

    for (var ii:int; ii < 6; ii++) 
    { 
     //Create BG 
     var s:Sprite = new Sprite(); 
     s.graphics.beginFill(Math.random() * 0xffffff, 0.4); 
     s.graphics.drawRect(0, 0, 291, 184); 
     //add Photo 
     var p:Sprite = new Sprite(); 

     imageDiplicateLoader = new Loader(); 
     imageDiplicateLoader.loadBytes(pictureBytes); 

     p.addChild(imageDiplicateLoader); 
     p.scaleX = p.scaleY = 0.2; 
     p.x = 0; 
     p.y = 0; 
     s.addChild(p); 
     cards.push(s); 
    } 
} 

現在請記住,這只是一種方法,而且我已經寫下了我的頭頂。所以,我不確定,但你可能需要在for循環中複製pictureBytes數據,但我不這麼認爲。如果你確實需要,你可以這樣做:

var bytesCopy:ByteArray = new ByteArray(); 
pictureBytes.position = 0; 
bytesCopy.writeBytes(pictureBytes); 
+0

非常感謝。自從我與AS3合作以來,我感覺有點傻了,我只是通過返回並訪問位圖數據並創建一個克隆來識別出一種方式...... var newPhoto:Bitmap = new Bitmap(photoBM.BitmapData );' – davivid 2011-06-03 10:34:10

+0

很高興它爲你工作。 – 2011-06-03 10:36:35

2

我不確定我完全理解你的代碼,但有一點是肯定的;一個DisplayObject(在你的情況下是一個Sprite)不能有多於一個父元素,因此,如果你嘗試addChild它在第二個地方它將失敗。這可能是你的問題。