/** * ActionScript3 Thread library のサンプルになれば幸いです :-) * * @see http://www.flickr.com/photos/auroracrowley/ * @see http://www.libspark.org/htdocs/as3/thread-files/document/ */ package { import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageQuality; import flash.display.StageScaleMode; import flash.events.Event; import org.libspark.thread.EnterFrameThreadExecutor; import org.libspark.thread.Thread; [SWF(frameRate=60, width=465, height=465, backgroundColor=0x000000)] public class Tmp extends Sprite { public function Tmp() { addEventListener(Event.ADDED_TO_STAGE, initialize); } private function initialize(evt:Event):void { removeEventListener(Event.ADDED_TO_STAGE, initialize); stage.align = StageAlign.TOP_LEFT; stage.quality = StageQuality.HIGH; stage.scaleMode = StageScaleMode.NO_SCALE; if (!Thread.isReady) { Thread.initialize(new EnterFrameThreadExecutor()); } new MainThread(this).start(); } } } import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.BlendMode; import flash.display.DisplayObject; import flash.display.DisplayObjectContainer; import flash.display.Stage; import flash.events.MouseEvent; import flash.filters.BitmapFilter; import flash.filters.BitmapFilterQuality; import flash.filters.BlurFilter; import flash.geom.ColorTransform; import flash.geom.Point; import flash.net.URLRequest; import flash.net.URLVariables; import flash.system.LoaderContext; import flash.text.TextField; import flash.text.TextFieldAutoSize; import flash.text.TextFormat; import flash.ui.Mouse; import com.adobe.serialization.json.JSON; import org.libspark.thread.Thread; import org.libspark.thread.threads.display.LoaderThread; import org.libspark.thread.threads.net.URLLoaderThread; import org.libspark.thread.utils.IProgress; import org.libspark.thread.utils.IProgressNotifier; import org.libspark.thread.utils.MultiProgress; import org.libspark.thread.utils.ParallelExecutor; import org.libspark.thread.utils.SerialExecutor; internal var FILTER_BLUR:BlurFilter = new BlurFilter(4, 4, BitmapFilterQuality.LOW); internal var POINT_ZERO:Point = new Point(); import flash.display.Shape; internal class Indicator extends Shape { public function Indicator() { var i:uint, cx:Number, cy:Number, numNeedles:uint = 12, innerR:Number = 7, outerR:Number = 5, cAngle:Number = -Math.PI / 2, nAngle:Number; nAngle = Math.PI * 2 / numNeedles; for (i=0; i= contents.length) { currentIndex = 0; } var image:Bitmap, th:Thread; image = contents[currentIndex++] as Bitmap; th = new HandleImageThread(image, canvas); th.start(); th.join(); next(changeImage); } override protected function finalize():void { layer = null; imageLoader = null; } } internal class WaitAnimationThread extends Thread { private var layer:DisplayObjectContainer; private var message:Bitmap; public function WaitAnimationThread(layer:DisplayObjectContainer) { this.layer = layer; } override protected function run():void { var s:Stage, txt:TextField, fmt:TextFormat, bmd:BitmapData; s = layer.stage; fmt = new TextFormat(); fmt.color = 0x000000; fmt.size = 24; fmt.font = 'Trebuchet MS'; txt = new TextField(); txt.autoSize = TextFieldAutoSize.LEFT; txt.defaultTextFormat = fmt; txt.text = 'click to start.'; bmd = new BitmapData(txt.textWidth, txt.textHeight, true, 0); bmd.draw(txt); message = new Bitmap(bmd); message.blendMode = BlendMode.INVERT; message.x = (s.stageWidth - message.width) / 2; message.y = (s.stageHeight - message.height) / 2; layer.addChild(message); event(s, MouseEvent.CLICK, hideMessage); } private function hideMessage(evt:MouseEvent):void { new HideMessageThread(message).start(); } override protected function finalize():void { layer = null; message = null; } } internal class HideMessageThread extends Thread { private var message:DisplayObject; private var wrapper:Bitmap; private var parent:DisplayObjectContainer; private var film:BitmapData; private var particles:Vector.; public function HideMessageThread(message:DisplayObject) { this.message = message; this.parent = message.parent; this.particles = new Vector.(); } override protected function run():void { var s:Stage, c:uint, w:Number, h:Number, offsetX:Number, offsetY:Number, i:uint, j:uint, bmd:BitmapData; s = message.stage; bmd = Bitmap(message).bitmapData; w = bmd.width; h = bmd.height; offsetX = message.x; offsetY = message.y; for (i=0; i= 1) { next(shutDown); } else { next(step); } } private function shutDown():void { indicator.interrupt(); } override protected function finalize():void { progress = null; layer = null; indicator = null; } } internal class HandleImageThread extends Thread { public static const PARTICLE_MARGIN:Number = 6; private var original:Bitmap; private var destination:Bitmap; private var showParticles:Vector.; private var hideParticles:Vector.; public function HandleImageThread(original:Bitmap, destination:Bitmap) { this.original = original; this.destination = destination; this.showParticles = new Vector.(); this.hideParticles = new Vector.(); } override protected function run():void { var w:Number, h:Number, c:uint, tx:Number, ty:Number, sx:Number, sy:Number, cx:Number, cy:Number, angle:Number, i:uint, j:uint, s:Stage, data:BitmapData; s = destination.stage; data = original.bitmapData; w = data.width; h = data.height; cx = s.stageWidth / 2; cy = s.stageHeight / 2; for (i=0; i