package { import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.geom.Point; import com.bit101.components.PushButton; import com.bit101.components.RadioButton; import jp.progression.commands.lists.SerialList; import jp.progression.commands.Wait; import jp.progression.commands.Func; [SWF(backgroundColor = 0xF0F0F0)] public class Main extends Sprite { private var prev:Point = new Point(); private var canvasA:Sprite; private var canvasB:Sprite; private var lines:Vector.<Line> = new Vector.<Line>(); private var frame:int = 0; private var mode:int = 0; private var list:SerialList = new SerialList(); public function Main() { Wonderfl.capture_delay(30); canvasA = new Sprite(); canvasA.graphics.beginFill(0xEE9C00); canvasA.graphics.drawRect(0, 0, 465, 400); canvasA.graphics.endFill(); addChild(canvasA); canvasB = new Sprite(); addChild(canvasB); new PushButton(this, 365, 445, "clear", clearHandler); new PushButton(this, 365, 425, "undo", undoHandler); new PushButton(this, 365, 405, "replay", replayHandler); var button1:RadioButton = new RadioButton(this, 5, 405, "line", true, function():void { mode = Mode.LINE; } ); var button2:RadioButton = new RadioButton(this, 5, 420, "curve", false, function():void { mode = Mode.CURVE; } ); var button3:RadioButton = new RadioButton(this, 5, 435, "rect", false, function():void { mode = Mode.RECT; } ); canvasA.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp); addEventListener(Event.ENTER_FRAME, onEnterFrame); } private function clearHandler(event:MouseEvent):void { if (list.state == 2) return; for (var i:int = lines.length - 1; i >= 0; i--) { canvasA.removeChild(lines[i]); lines.splice(i, 1); } } private function undoHandler(event:MouseEvent):void { if (list.state == 2) return; if (lines.length == 0) return; canvasA.removeChild(lines[lines.length - 1]); lines.splice(lines.length - 1, 1); } private function replayHandler(event:MouseEvent):void { if (list.state == 2) return; list = new SerialList(); for (var i:int = 0; i < lines.length; i++) { canvasA.removeChild(lines[i]); list.addCommand(new Func(function(i:int):void { canvasA.addChild(lines[i]); }, [i])); list.addCommand(new Wait(0.08)); } list.execute(); } private function onEnterFrame(event:Event):void { for (var i:int = 0; i < lines.length; i++) { lines[i].move(); } } private function onMouseDown(event:MouseEvent = null):void { if (list.state == 2) return; if (mouseY >= 400) return; prev.x = mouseX; prev.y = mouseY; canvasA.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove); } private function onMouseMove(event:MouseEvent):void { if (mode == Mode.LINE || mode == Mode.CURVE) { canvasB.graphics.clear(); canvasB.graphics.lineStyle(4.0, 0xED1A3D); canvasB.graphics.moveTo(prev.x, prev.y); canvasB.graphics.lineTo(mouseX, mouseY); } if (mode == Mode.RECT) { canvasB.graphics.clear(); canvasB.graphics.lineStyle(4.0, 0xED1A3D); canvasB.graphics.drawRect(prev.x, prev.y, mouseX - prev.x, mouseY - prev.y); canvasB.graphics.endFill(); } if (mode == Mode.CURVE && frame++ % 12 == 0) { onMouseUp(null, new Point(mouseX, mouseY)); onMouseDown(); } } private function onMouseUp(event:MouseEvent = null, next:Point = null):void { canvasA.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove); canvasB.graphics.clear(); if (mouseY >= 400) return; var line:Line; if (mode == Mode.RECT) { line = new Line(); line.graphics.lineStyle(2.0, 0x0); line.graphics.moveTo(prev.x, prev.y); line.graphics.lineTo(mouseX, prev.y); canvasA.addChild(line); lines.push(line); line = new Line(); line.graphics.lineStyle(2.0, 0x0); line.graphics.moveTo(prev.x, prev.y); line.graphics.lineTo(prev.x, mouseY); canvasA.addChild(line); lines.push(line); line = new Line(); line.graphics.lineStyle(2.0, 0x0); line.graphics.moveTo(prev.x, mouseY); line.graphics.lineTo(mouseX, mouseY); canvasA.addChild(line); lines.push(line); line = new Line(); line.graphics.lineStyle(2.0, 0x0); line.graphics.moveTo(mouseX, prev.y); line.graphics.lineTo(mouseX, mouseY); canvasA.addChild(line); lines.push(line); return; } line = new Line(); line.graphics.lineStyle(2.0, 0x0); line.graphics.moveTo(prev.x, prev.y); if (next == null) line.graphics.lineTo(mouseX, mouseY); else line.graphics.lineTo(next.x, next.y); canvasA.addChild(line); lines.push(line); } } } import flash.display.Sprite; import flash.filters.DropShadowFilter; class Line extends Sprite { public function Line() { this.filters = [new DropShadowFilter(2)]; } public function move():void { this.x = -2 + Math.random() * 3; this.y = -2 + Math.random() * 3; } } class Mode { public static const LINE:int = 0; public static const CURVE:int = 1; public static const RECT:int = 2; } ウゴツールの劣化版