如何在没有地图册的情况下为spritesheet制作动画?

时间:2014-03-06 11:35:44

标签: actionscript-3 starling-framework

我有一张大约30帧不同动画的精灵表,不合规。

我想使用Starling制作动画,但我没有/没有时间制作地图集xml。即使我这样做,我宁愿不使用地图集。

此外,精灵表具有黑色背景,我研究的大多数示例都具有透明背景。

任何帮助将不胜感激。感谢。

1 个答案:

答案 0 :(得分:1)

这是一个如何从图集中检索纹理的示例,给出您想要的帧以及帧的宽度和高度:

package
{
    import starling.textures.Texture;
    import flash.geom.Rectangle;

    public class AnimFromAtlas
    {
        public function AnimFromAtlas( )
        {

        }

        public static function TexturesFromAtlas( atlas:Texture, frames:Array, frameWidth:int, frameHeight:int ):Vector.<Texture>
        {
            // declare x and y properties 
            var x:int, y:int = 0;
            // create the base rectangle with the flrame width and frame height, we just have to update the x and y values.
            var region:Rectangle = new Rectangle( 0, 0, frameWidth, frameHeight );
            // create the texture vector that we have to return
            var textures:Vector.<Texture> = new <Texture>[];
            // calculate the max frame on one line on the atlas
            var framesOnLine:int = atlas.width / frameWidth;

            // loop the frames to get the textures on the atlas
            for( var i:int = 0; i<frames.length; ++i )
            {
                x = (int( (frames[i] % framesOnLine) ) * frameWidth);   
                y = (int( (frames[i] / framesOnLine) ) * frameHeight);
                region.x = x;
                region.y = y;
                textures[i] = Texture.fromTexture(atlas, region);

                trace( region );
            }

            // fix the vector for better performances
            textures.fixed = true;

            // return the textures
            return textures;
        }
    }
}

所以你只需要调用静态方法AnimFromAtlas.TexturesFromAtlas(yourSpriteSheet, [1,2,5,8,3], 150, 100);

如果您将地图集作为位图而不是纹理,则可以使用Texture.fromBitmap(yourBitmap)来获取纹理。

我没有尝试过,所以也许它不能按照您的意愿工作,但我认为它应该可以解决问题,我添加了一些纹理找到的矩形,这样你就可以看出它是否可信。

对于黑色背景,你可以直接用as3这样做:

var bitmapData:BitmapData = yourAtlasBitmap.bitmapData;
var black     :uint = 0xff000000;  // the black color to replace
var trans     :uint = 0x00000000;  // the transparent color that will replace the black
var mask      :uint = 0xffffffff;  // the mask to use (i always use white here)
// the target rectangle
var rect      :Rectangle = new Rectangle( 0, 0, bitmapData.width, bitmapData.height );

// do the replacement of the color
bitmapData.threshold( bitmapData, rect, new Point(0,0), "==", black, trans, mask, true );

// create a new Bitmap with the new BitmapData
var yourNewBitmap:Bitmap = new Bitmap(bitmapData);

我希望这可以帮到你。