// forked from checkmate's Saqoosha challenge for amateurs package { import flash.display.*; import flash.events.*; import flash.filters.*; import flash.geom.*; import flash.media.Sound; import flash.net.URLRequest; import flash.utils.getTimer; import com.bit101.components.Label; /** * * @author k3lab */ [SWF(width="465", height="465", frameRate="60")] public class Main extends Sprite { private static const PARTICLE_NUM:int = 500; private static const SPRING:Number = 0.18; private static const FRICTION:Number = 0.75; private var canvas:BitmapData; private var clones:BitmapData; private var pArr:Array = []; private var volArr:Array = [] private var colorArr:Array = [] private var clt:ColorTransform = new ColorTransform(1, 1, 1, 1, 0, -10, -10, -10); private var sp:Sprite; private var trail:Sprite; private var vx:Number = 0; private var vy:Number = 0; private var ratio:Number = 0; private var grad:Gradation; public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); //BGM var sound:Sound = new Sound (new URLRequest ("http://www.k3lab.com/wonderfl/Euphoria/bgm.mp3")); sound.play (0, int.MAX_VALUE); canvas = new BitmapData(465, 465, false, 0x00000000); clones = canvas.clone(); addChild(new Bitmap(clones)) as Bitmap; grad = new Gradation(0xff0000, 0x00ff00, 0x0000ff); var a:Number = 0; sp = addChild(new Sprite()) as Sprite; sp.blendMode = "screen"; for (var i:int = 0; i < PARTICLE_NUM; i++) { a += 0.2 var p:Particle =sp.addChild(new Particle()) as Particle; p._x = 240 * Math.sin(a); p._y = 240 * Math.cos(a); p._z = 0; pArr[i] = p p.draw(grad.getColor(i / PARTICLE_NUM), 0.6, Math.random() * 0.6); } //****************************************** //付属品 mouseTrail(); createBg(); createHeader(); createBar(); createVolume(); //****************************************** addEventListener(Event.ENTER_FRAME, loop); } //************************************************************ //マウストレイル private function mouseTrail():void { trail = addChild(new Sprite()) as Sprite; trail.graphics.beginFill(0xFFFFFF); trail.graphics.drawRect( -10, 0, 20, 1); trail.graphics.drawRect(0 , -10, 1, 20); trail.graphics.endFill(); var circles:Sprite=trail.addChild(new Sprite()) as Sprite; circles.graphics.beginFill(0xFFFFFF); circles.graphics.drawRect( -465, 0, 1030, 1); circles.graphics.drawRect( 0, -465, 1, 1030); circles.graphics.endFill(); circles.alpha = 0.2; } //全体のBG private function createBg():void { var pattern:BitmapData = background() var bg:Sprite = addChild(new Sprite()) as Sprite; bg.graphics.beginBitmapFill(pattern); bg.graphics.drawRect(0, 0, 465, 465) bg.graphics.endFill(); bg.alpha = 0.3; } //上のTitle&BG private function createHeader():void { var tbg:Sprite = addChild(new Sprite()) as Sprite; tbg.graphics.beginFill(0); tbg.graphics.drawRect( 0, 0, 465, 18); tbg.graphics.endFill(); var title:Label = new Label(this, 147, 0, "Barrage of Rainbow Exploration ver.0.1"); title.blendMode = "invert" } //左上のColor Bar private function createBar():void { var cl:Array = [0xff0000, 0x00ff00, 0x0000ff] var clsp:Sprite = addChild(new Sprite()) as Sprite; for (var i:int = 0; i < 3; i++) { var colors:Sprite = clsp.addChild(new Sprite()) as Sprite; colors.graphics.beginFill(cl[i]); colors.graphics.drawRect( 0, 0, 10,10); colors.graphics.endFill(); colors.x = 11 * i; } clsp.x = 4; clsp.y = 4; } //右上のvoloume private function createVolume():void { var volsp:Sprite = addChild(new Sprite()) as Sprite; for (var i:int = 0; i < 7; i++) { var vol:Sprite = volsp.addChild(new Sprite()) as Sprite; vol.graphics.beginFill(0xFFFFFF); vol.graphics.drawRect( 0, 0, 1, -10); vol.graphics.endFill(); vol.x=2*i volArr[i] = vol; } volsp.x = stage.stageWidth - volsp.width - 5; volsp.y = 15; } private function voloop():void { for each(var v:Sprite in volArr) { v.height = Math.sin(getTimer() / 500 * Math.random() * 5) * 10; } } private function trailoop():void { vx += (mouseX - trail.x) * SPRING; vy += (mouseY - trail.y) * SPRING; vx *= FRICTION; vy *= FRICTION; trail.x += int(vx); trail.y += int(vy); } //************************************************************ private function loop(e:Event):void { voloop(); trailoop(); var zp:Number = 0; var i:int; for each(var p:Particle in pArr) { var xa:Number = Math.sin(Math.PI * (getTimer()+i*100) % 30000 / 30000 * 360 / 180) / 20; var ya:Number = Math.sin(Math.PI * (getTimer()+i*100) % 1500 / 1500 * 360 / 180) / 20; var yp:Number = p._y * Math.cos(ya) -p._z * Math.sin(ya); zp =p._y * Math.sin(ya) + p._z * Math.cos(ya); var xp:Number = p._x * Math.cos(xa) + zp * Math.sin(xa); zp = ( -p._x) * Math.sin(xa) + zp * Math.cos(xa); p._x = xp; p._y = yp; p._z = zp; p.alpha = Math.random() * 1; (p._z < -95)?p.visible = false:p.visible = true; ratio = 1 / (p._z /100 + 1) var num:Number = 0; p.scaleY = num = ratio * 7; p.scaleX = num; p.x += (p._x * ratio + (mouseX) - p.x) / 10; p.y += (p._y * ratio +( mouseY) - p.y) / 10; canvas.setPixel(p.x, p.y, grad.getColor(i /PARTICLE_NUM)); i++; } clones.lock(); canvas.lock(); canvas.draw(sp) clones.merge(canvas, canvas.rect, new Point(),zp/10,zp/100, zp*10,0.5); clones.draw(canvas, null, new ColorTransform(100 * zp, 10, 10), "add"); canvas.applyFilter(canvas, canvas.rect, new Point(0, 0), new BlurFilter(20, 20, 1)); clones.scroll(0, 1); clones.colorTransform(clones.rect, clt); canvas.colorTransform(canvas.rect, clt); clones.unlock(); canvas.unlock(); } public function background():BitmapData{ return BitmapPatternBuilder.build( [[1, 0, 0], [0, 1, 0], [0, 0, 1]], [0xFF000000, 0xffffffff] ); } } } import flash.display.Graphics; import flash.display.Sprite; class Particle extends Sprite { public var _x:Number=0; public var _y:Number=0; public var _z:Number=0; public function draw(color:int, alpha:Number, size:Number):void { graphics.beginFill(color, alpha); graphics.drawCircle(0, 0, size); graphics.endFill(); } } import frocessing.color.ColorLerp; import org.libspark.betweenas3.core.easing.IEasing; import org.libspark.betweenas3.easing.Linear; class Gradation { private var _colors:Array; private var _easing:IEasing; public function Gradation(...args) { _colors = args.concat(); _easing = Linear.linear } public function setEasing(easing:IEasing):void { _easing = easing; } public function getColor(position:Number):uint { position = (position < 0 ? 0 : position > 1 ? 1 : position) * (_colors.length - 1); var idx:int = position; var alpha:Number = _easing.calculate(position - idx, 0, 1, 1); if (alpha == 0) { return _colors[idx]; } else { return ColorLerp.lerp(_colors[idx], _colors[idx + 1], alpha); } } } /**----------------------------------------------------- * @see http://wonderfl.net/code/5f88476bd21cac4d45ad2086af2333782a5d3cb8 * ----------------------------------------------------- */ import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Graphics; class BitmapPatternBuilder{ /** * creates BitmapData filled with dot pattern. * First parameter is 2d array that contains color index for each pixels; * Second parameter contains color reference table. * * @parameter pattern:Array 2d array that contains color index for each pixel. * @parameter colors:Array 1d array that contains color table. * @returns BitmapData */ public static function build(pattern:Array, colors:Array):BitmapData{ var bitmapW:int = pattern[0].length; var bitmapH:int = pattern.length; var bmd:BitmapData = new BitmapData(bitmapW,bitmapH,true,0x000000); for(var yy:int=0; yy<bitmapH; yy++){ for(var xx:int=0; xx<bitmapW; xx++){ var color:int = colors[pattern[yy][xx]]; bmd.setPixel32(xx, yy, color); } } return bmd; } /** * short cut function for Graphics.beginBitmapFill with pattern. */ public static function beginBitmapFill(pattern:Array, colors:Array, graphics:Graphics):void{ var bmd:BitmapData = build(pattern, colors); graphics.beginBitmapFill(bmd); bmd.dispose(); } } BRE ver0.1