Возможен ли один загрузчик для нескольких спрайтов?

StackOverflow https://stackoverflow.com/questions/828361

  •  06-07-2019
  •  | 
  •  

Вопрос

Я просматривал различные ресурсы по этой теме, и мне кажется, что мне нужен загрузчик для каждого Sprite, который содержит файл изображения (png).

Я пытаюсь создать систему рендеринга листов и создал сетку из спрайтов X по Y, но все они на самом деле ссылаются на один и тот же файл изображения. Есть ли другой способ сделать это? (Сделать спрайт общим файлом данных 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 );
    }
}
Это было полезно?

Решение

Я думаю, что ответом в вашем случае является использование растровых данных, содержащихся в загружаемом изображении, следующим образом:

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

Другие советы

Вы также можете использовать 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);
    }
}

Преимущество здесь в том, что вы можете сразу использовать спрайты, и они будут автоматически заполнены растровым изображением после его загрузки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top