我有一张大约30帧不同动画的精灵表,不合规。
我想使用Starling制作动画,但我没有/没有时间制作地图集xml。即使我这样做,我宁愿不使用地图集。
此外,精灵表具有黑色背景,我研究的大多数示例都具有透明背景。
任何帮助将不胜感激。感谢。
答案 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);
我希望这可以帮到你。