package ru.m.animate; import flash.display.PixelSnapping; import haxe.Timer; import flash.display.Bitmap; import flash.display.BitmapData; class Animate extends Bitmap { private static var timer:Timer; private static var instances:Array = []; private static function init():Void { if (timer == null) { timer = new Timer(30); timer.run = updateAll; } } private static function updateAll():Void { for (instance in instances) { if (instance.playing) { instance.update(); } } } public var playing(default, set):Bool; public var frames(default, set):Array; private var index:Int; public function new(?frames:Array) { super(null, PixelSnapping.AUTO, true); this.frames = frames == null ? [] : frames; init(); instances.push(this); } public function set_frames(value:Array):Array { if (value != null) { frames = value; bitmapData = frames[0]; index = 0; } return frames; } public function set_playing(value:Bool):Bool { if (playing != value) { playing = value; } return playing; } private function update():Void { if (++index >= frames.length) { index = 0; } var nextBitmapData = frames[index]; x -= (nextBitmapData.width - bitmapData.width) / 2; y -= (nextBitmapData.height - bitmapData.height) / 2; bitmapData = nextBitmapData; } public function dispose():Void { if (instances.indexOf(this) > -1) { instances.remove(this); } } }