夜の光
都会の夜っぽい光のつもり。
* フルスクリーンにすると光が右下に偏る不具合が取れない…!
♥2 |
Line 104 |
Modified 2009-11-29 11:19:26 |
MIT License
archived:2017-03-09 19:47:01
ActionScript3 source code
/**
* Copyright beryu ( http://wonderfl.net/user/beryu )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/b9EO
*/
/**
* 都会の夜っぽい光のつもり。
* フルスクリーンにすると光が右下に偏る不具合が取れない…!
*/
package {
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.GradientType;
import flash.display.Sprite;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.filters.BlurFilter;
import flash.filters.BitmapFilterQuality;
import flash.geom.Matrix;
[SWF(backgroundColor="0x051100", frameRate="15")]
public class FlowLights extends Sprite {
private const LIGHT_LENGTH:int = 50; // 光の数
private const LIGHT_WIDTH:int = 200; // 光の最大幅
private var _stageSize:Array;
private var _lights:Array;
public function FlowLights() {
stage.scaleMode=StageScaleMode.NO_SCALE
// ステージサイズを取得
_stageSize = [stage.stageWidth, stage.stageHeight];
// 円をLIGHT_LENGTH個用意
var i:int;
var light:Light;
var bmd:BitmapData;
var sprite:Sprite;
var random:Number;
var blurFilter:BlurFilter;
var blurWidth:int;
var matrix:Matrix = new Matrix();
var width:int;
_lights = [];
for(i = 1; i < LIGHT_LENGTH; i++)
{
random = 1 / (LIGHT_LENGTH) * i;
light = new Light();
sprite = new Sprite();
// 円を描く
width = random * LIGHT_WIDTH;
matrix.createGradientBox(width, width/2, Math.PI / 2, 0, 0);
sprite.graphics.beginGradientFill(
GradientType.LINEAR,
[
int(random * 0x7) * 0x222222 + 0x191500, // 色のバランスはそのままに、明暗だけ変える
int(random * 0x7) * 0x222222 + 0x191500
],
[1, 1-random],
[0, 255],
matrix);
sprite.graphics.drawCircle(0, 0, width / 2);
sprite.graphics.endFill();
// ぼかし効果を入れる
blurWidth = int(2 / random) * 8;
blurFilter = new BlurFilter(blurWidth, blurWidth, BitmapFilterQuality.HIGH);
sprite.filters = [blurFilter];
// 速度差を付ける
light.increment = random * 3 + 1;
// BitmapDataに描画
bmd = new BitmapData(width + blurWidth*2, width + blurWidth*2, true, 0);
bmd.draw(sprite, new Matrix(1, 0, 0, 1, (width + blurWidth*2) / 2, (width + blurWidth*2) / 2));
// 表示
light.bitmapData = bmd;
light.visible = true;
light.x = Math.random() * _stageSize[0] - light.width / 2;
light.y = Math.random() * _stageSize[1] - light.height / 2;
light.alpha = 0.01;
addChild(light);
_lights.push(light);
}
// events
addEventListener(Event.ENTER_FRAME, loop);
addEventListener(Event.RESIZE, onResize);
}
private function loop(e:Event):void
{
var i:int;
var blurFilter:BlurFilter;
var blurWidth:int;
for(i = 0; i < LIGHT_LENGTH - 1; i++)
{
if(!_lights[i].visible)
{
_lights[i].x = Math.random() * _stageSize[0] - _lights[i].width / 2;
_lights[i].y = (Math.random() * _stageSize[1]) - _lights[i].height / 2;
_lights[i].visible = true;
}
else if(_lights[i].y < 0 - _lights[i].height)
{
_lights[i].visible = false;
_lights[i].alpha = 0;
}
else
{
if(_lights[i].alpha < 1)
{
_lights[i].alpha += 0.01;
}
_lights[i].y -= _lights[i].increment;
}
}
}
private function onResize(e:Event):void
{
// ステージサイズを取得しなおす
_stageSize = [stage.stageWidth, stage.stageHeight];
}
}
}
import flash.display.Sprite;
import flash.display.Bitmap;
class Light extends Bitmap
{
public var increment:Number = 1;
}