2009-05-06 33 views
0

我查看过有关此主题的各种资源,在我看来,我需要一个包含图像文件(png)的每个Sprite的加载程序。单个加载程序到多个Sprite可能吗?

我想做一个平铺渲染系统,并创建了一个由Y精灵X的网格,但所有这些实际上引用相同的图像文件。 有没有其他方法可以做到这一点? (使精灵共享相同的PNG数据文件)

我已经做了一些示例代码。

// Create an array of X * Y Loaders 
var cTileLoaders:Array = new Array(100); // for example 10 by 10 grid 
var cTiles:Array = new Array(100); 
var nIndex:int = 0; 
var nImgLoadCount:int = 0; 
for (; 100 > nIndex; ++nIndex) { 
    cTileLoaders[ nIndex ] = new Loader(); 
    cTiles[ nIndex ] = new Sprite(); 
    // perform more sprite initialization 
    .... 
    cTileLoaders[ nIndex ].contentLoaderInfo.addEventListener(Event.COMPLETE, ImageLoaded 
    cTileLoaders[ nIndex ].Load(new URLRequest("some image path")); 
} 
// handler for image loaded 
function ImageLoaded(eEvent:Event):void { 
    ++nImgLoadCount; 
    // when all 100 sprite data are loaded 
    // assuming there is no i/o error 
    if (100 == nImgLoadCount) { 
     cTiles[ nIndex ].addChild(cTileLoaders[ nIndex ].content); 
    } 
} 

回答

2

我觉得你的情况,答案是利用包含你正在加载这样的图像中的位图数据:

var tilesWide:uint = 10; 
var tilesHigh:uint = 10; 

var tileHolder:Sprite = new Sprite(); 
this.addChild(tileHolder); 

var loader:Loader = new Loader(); 
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onImgLoaded); 
loader.load(new URLRequest("tile.png")); 

function onImgLoaded(e:Event):void 
{ 
    /* Create a template bitmap to hold the image info */ 
    var templateBitmap:Bitmap = e.target.content; 
    var templateBitmapData:BitmapData = templateBitmap.bitmapData; 

    /* Loop through your tiles */ 
    for (var a:uint = 0; a < tilesWide; a++) 
    { 
     for (var b:uint = 0; b < tilesHigh; b++) 
     { 
      var tile:Sprite = new Sprite(); 
      /* Attach the template BitmapData to each tile */ 
      var tileBitmap:Bitmap = new Bitmap(templateBitmapData); 
      tile.addChild(tileBitmap); 

      tile.x = a * tile.width; 
      tile.y = b * tile.height; 

      tileHolder.addChild(tile); 
     } 
    } 
} 
+0

谢谢!直到最近我还不了解更多关于actionscript的知识:) – 2009-05-06 08:09:13

0

你也可以使用SpriteFactory,一个小图书馆我专门写为此:

var tilesWide:uint = 10; 
var tilesHigh:uint = 10; 
var tileHolder:Sprite = new Sprite(); 
var tilePath:String = "some/image/path.png"; 

var factory:SpriteFactory = new SpriteFactory(); 
factory.loadBitmap("tile", tilePath); 

for (var a:uint = 0; a < tilesWide; a++) 
{ 
    for (var b:uint = 0; b < tilesHigh; b++) 
    { 
     var tile:Sprite = factory.newSprite("tile");       
     tile.x = a * tile.width; 
     tile.y = b * tile.height; 

     tileHolder.addChild(tile); 
    } 
} 

这里的好处是,你可以使用精灵马上,一旦它的加载,系统就会自动填充该位图。

相关问题