昨日に引き続き、AS3でボタンの習作を作ってみました。
これまで、あまりFilterは使ったことがなく、各Filterの効果の違いとか、あまりわかっていなかったのですが、だいぶ理解が進んだ気がします。
package practice { import flash.display.Sprite; import frocessing.color.ColorHSV; [SWF(width = "475", height = "475", backgroundColor = "0x000000", fps = "30")] public class Button02 extends Sprite{ public function Button02() { var xx:Number = 0; var yy:Number = 80; var c:uint = 0x000000; var r:Number = 0; var hsv:ColorHSV = new ColorHSV(); hsv.s = hsv.v = 1.0; hsv.h = 0; for (var i:int = 0; i < 25; i++) { if (i > 0) { hsv.h = (hsv.h +15) % 360; c = hsv.value; } var b:Button = new Button(32, c, 1.0, 0.4); xx = xx + 80; if (xx > 400) { xx = 80; yy += 80; } b.x = xx; b.y = yy; addChild(b); } } } } import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.filters.BevelFilter; import flash.filters.BitmapFilterType; import flash.filters.BlurFilter; import flash.filters.DropShadowFilter; import flash.filters.GlowFilter; import flash.filters.GradientGlowFilter; class Button extends Sprite { private var o:OuterButton; public function Button(r:Number,color:uint,alpha0:Number,alpha1:Number):void { o = new OuterButton(r); addChild(o); var b:BaseButton = new BaseButton(r, color, alpha0, alpha1); addChild(b); addEventListener(MouseEvent.ROLL_OVER, over); addEventListener(MouseEvent.ROLL_OUT, out); addEventListener(MouseEvent.MOUSE_DOWN, down); addEventListener(MouseEvent.MOUSE_UP, up); } private function over(e:MouseEvent):void { o.onMouse = true; } private function out(e:MouseEvent):void { o.onMouse = false; } private function down(e:MouseEvent):void { o.isPress = true; } private function up(e:MouseEvent):void { o.isPress = false; } } class OuterButton extends Sprite { private var rad:Number; private var ct:Number=0; private var glow:GlowFilter; public var onMouse:Boolean = false; public var isPress:Boolean = false; public function OuterButton(r:Number):void { rad = r; addEventListener(Event.ENTER_FRAME, draw); glow = new GlowFilter(0xffffff, 0.7, 16, 16, 2, 1, false, false); filters = [glow]; } private function draw(e:Event):void { graphics.clear(); graphics.lineStyle(1, 0xeeeeee); graphics.beginFill(0xeeeeee, 0.9); graphics.drawCircle(0, 0, rad); graphics.endFill(); var b:Number; if (isPress || !onMouse) { if (ct < 180) { ct += (0 - ct) * 0.1; }else { ct += (360 - ct) * 0.1; } b = 30 * Math.abs(Math.sin(ct / 180.0 * Math.PI))+16; glow.blurX = glow.blurY = b; filters = [glow]; }else if (onMouse) { ct = (ct + 4) % 360; b = 30 * Math.abs(Math.sin(ct / 180.0 * Math.PI))+16; glow.blurX = glow.blurY = b; filters = [glow]; } } } class BaseButton extends Sprite { private var rad:Number; private var bevel:BevelFilter; private var color:uint; private var alpha0:Number; private var alpha1:Number; private var glow:GradientGlowFilter; public function BaseButton(r:Number, c:uint, a0:Number, a1:Number):void { rad = r; color = c; alpha0 = a0; alpha1 = a1; bevel = new BevelFilter(4, 45, 0x888888, 1, 0x111111, 1, 4, 4, 1, 1, BitmapFilterType.INNER, false); glow = new GradientGlowFilter(4, 90, [color, 0xffffff, color], [0.9, 0.8, 0.6], [0, 10, 255], 32, 32, 1, 1, BitmapFilterType.INNER, false); filters = [bevel, glow]; addEventListener(Event.ENTER_FRAME, draw); } private function draw(e:Event):void { graphics.clear(); graphics.lineStyle(1, 0x222222); graphics.beginFill(0x000000, alpha0); graphics.drawCircle(0, 0, rad); graphics.beginFill(color, alpha1); graphics.drawCircle(0, 0, rad); graphics.endFill(); } }