package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Graphics; import flash.display.Shape; import flash.display.Sprite; import flash.events.Event; import flash.geom.Rectangle; import flash.events.MouseEvent; import flash.geom.Matrix; /** * [朝ワン] Matrix の勉強2 回転 * 赤い丸 : どこを中心に回転させるか。 * 青い丸 : 赤い点(回転の中心)をどこに表示させるか。 * それぞれドラッグできる。 * */ [SWF(width = "465", height = "465", backgroundColor = "0xFFFFFF", frameRate = "30")] public class Asawon3 extends Sprite { private var bmd:BitmapData; private var sh: Shape; private var bg:Sprite; private var hand:Sprite; private var hand2:Sprite; private var bounds:Rectangle; private var frame: int; public function Asawon3() { // write as3 code here.. if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e: Event = null): void { removeEventListener(Event.ADDED_TO_STAGE, init); // さぁはじめよ。 // 矢印書いた。方向が分かれば何でもよかったけどとりあえずこれで。 sh = new Shape(); var g: Graphics = sh.graphics; g.beginFill(0xFFFFFF); g.lineStyle(1); g.moveTo(20, 30); g.lineTo(90, 30); g.lineTo(90, 0); g.lineTo(150, 50); g.lineTo(90, 100); g.lineTo(90, 70); g.lineTo(20, 70); g.lineTo(20, 30); bg = new Sprite(); // 入れ物 hand = new Sprite(); // ハンドル 1 hand2 = new Sprite(); // ハンドル 2 addChild(bg); g = bg.graphics; g.beginFill(0xCCCCCC); g.drawRect(0, 0, 190, 455); bg.x = bg.y = 10; bounds = new Rectangle(0, 0, 190, 455); g = hand.graphics; g.beginFill(0xCC3333); g.drawCircle(0, 0, 5); g = hand2.graphics; g.beginFill(0x3333CC); g.drawCircle(0, 0, 5); hand.buttonMode = true; hand2.buttonMode = true; hand.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); hand2.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); hand.x = (sh.width + sh.getRect(this).left) / 2; hand.y = (sh.height + sh.getRect(this).top) / 2; bg.addChild(sh); bg.addChild(hand); bg.addChild(hand2); // 表示 bmd = new BitmapData(265, 455, true, 0x0); var bmp: Bitmap = Bitmap(addChild(new Bitmap(bmd))); bmp.x = 200; bmp.y = 10; addEventListener(Event.ENTER_FRAME, loop); } private function onMouseDown(e:MouseEvent):void { var h: Sprite = Sprite(e.target); bg.addChild(h); h.startDrag(false, bounds); h.removeEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); h.addEventListener(MouseEvent.MOUSE_UP, onMouseUp); } private function onMouseUp(e:MouseEvent):void { var h: Sprite = Sprite(e.target); h.stopDrag(); h.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); } private function loop(e:Event):void { bmd.lock(); bmd.fillRect(bmd.rect, 0x0); var matrix: Matrix = new Matrix(); matrix.translate(- hand.x, - hand.y); matrix.rotate(frame * Math.PI / 180); matrix.translate(hand2.x, hand2.y); bmd.draw(sh, matrix, null, null, null, true); bmd.unlock(); frame++; } } } [朝ワン] Matrix の勉強2