Interactive Movie: Synapse
10000回の分裂を行った後、背景に滲んで染み込むという動作をするインタラクティブムービーです。構造体をもう1つ括ればこれを繰り返すことが可能です。*1
シナプス*2、細胞分裂/細胞死、バクテリア等、タイトルを付けるまでこれらの特徴と関連性について様々なことを考えましたが、後からなら何とでも言えると思いやめにしました。
でもこういった正邪の区別や正負の概念に縛られないもの、個人の意図を感じさせないものを、もっとより汎用性のある形で書き出していくことは目標の一つです。
自己表現なら日常で既に間に合っているし、それを持て余した人が嬉しい時や寂しい時、何かに向かって一心にそれを行うのもまた理に適っていると思います。
【ソースファイル説明書】
1. variables.as: 変数の定義
#include "variables.as"
var sw:Number = Stage.width;//ステージサイズ:横幅指定
var sh:Number = Stage.height;//ステージサイズ:縦幅指定
/*-----------------------------------------------------------------*/
var leftBounds:Number = 20;//左端からの距離
var topBounds:Number = 20;//上端からの距離
var rightBounds:Number = sw-leftBounds;//右端からの距離
var bottomBounds:Number = sh-topBounds;//下端からの距離
var basemax:Number = 6;//円同士の距離:倍率指定
var randommin:Number = 2;//乱数の最小値
var randommax:Number = 6;//乱数の最大値
var linemax:Number = 10000;//円・ラインを複製する総回数
var linebackup:Number = 18;//何個前のラインを削除するか
var scalemag:Number = .4;//円の大きさ:倍率指定
/*-----------------------------------------------------------------*/
var fadeoutsec:Number = 3;//フェードアウト:秒数
var fadeoutdelay:Number = 0;//フェードアウト:待機秒数
var fadeoutease:String = Strong.easeInOutExpo;//フェードアウト:イージング
var fadeoutBlur:Number = 48;//フェードアウト:ぼかしフィルタ
2. synapse.as: 円とラインの生成
#include "as/synapse.as"
function init():Void {
var x:Number = leftBounds;
var y:Number = topBounds;
var c:Number = 0;
function makeLineFunction():Void {
var line:MovieClip = synapse.attachMovie("line", c+linemax, c+linemax);
var pastline:MovieClip = eval("synapse."+int(c+linemax-linebackup));
var circle:MovieClip = synapse.attachMovie("circle", c, c);
line._x = circle._x=x;
line._y = circle._y=y;
distancemax = basemax*randRange(0, randommax);
distancemin = randommin;
direction = randRange(0, 1) ? -1 : 1;
endx = x+(direction*(distancemin+distancemax));
direction = randRange(0, 1) ? -1 : 1;
endy = y+(direction*(distancemin+distancemax));
circle._xscale = distancemax*scalemag;
circle._yscale = distancemax*scalemag;
if (endx<leftBounds) endx = leftBounds;
if (endx>rightBounds) endx = rightBounds;
if (endy<topBounds) endy = topBounds;
if (endy>bottomBounds) endy = bottomBounds;
line._xscale = endx-x;
line._yscale = endy-y;
x = endx;
y = endy;
pastline.removeMovieClip();
if (c>linemax) {
fadeout(synapse, fadeoutsec, fadeoutdelay, fadeoutease, fadeoutBlur, null, null, 100);
delete synapse.onEnterFrame;
}
c++;
}
makeLine = makeLineFunction;
synapse.onEnterFrame = makeLine;
}
init();
3. gradFill.as: 背景グラデーションの描画
#include "as/gradFill.as"
var gradationColor:Array = new Array(0x996600, 0x999900);//背景グラデーションの色(上, 下)
var gradationAngle:Array = new Array(randRange(0, 90), randRange(90, 180));//グラデーションの回転角度
if (sw==undefined) sw = Stage.width;
if (sh==undefined) sh = Stage.height;
function gradFill():Void {
gradation.createEmptyMovieClip("fill",this.getNextHighestDepth());
colors = [gradationColor[0], gradationColor[1]];
alphas = [100, 100];
ratios = [0, 255];
matrix = {matrixType:"box", x:0, y:0, w:sw, h:sh/1.618, r:(gradationAngle[0]/gradationAngle[1])*Math.PI};
gradation.fill.beginGradientFill("linear",colors,alphas,ratios,matrix);
gradation.fill.moveTo(0,0);
gradation.fill.lineTo(sw,0);
gradation.fill.lineTo(sw,sh);
gradation.fill.lineTo(0,sh);
gradation.fill.lineTo(0,0);
gradation.fill.endFill();
}
gradFill();
a. initResize.as: ウィンドウリサイズ時の修正
#include "as/initResize.as"
Stage.align = "TL";
Stage.scaleMode = "noScale";
function initResize():Void {
sw = Stage.width;
sh = Stage.height;
rightBounds = sw-leftBounds;
bottomBounds = sh-topBounds;
gradFill();
}
resizeListener = new Object();
resizeListener.onResize = initResize;
Stage.addListener(resizeListener);
b. commonFuse.as: フェードアウト時に使用 [Fuse Kit 共通関数]
#include "as/commonFuse.as"
import com.mosesSupposes.fuse.*;
ZigoEngine.simpleSetup(Shortcuts,PennerEasing);
ZigoEngine.simpleSetup(Shortcuts,FuseFMP);
Fuse.AUTOCLEAR = true;
function fadeout(fadeout_mc:MovieClip, s:Number, d:Number, e:String, blur:Number, aimx:Number, aimy:Number, aimalpha:Number, xsc:Number, ysc:Number) {
s = correctParam(s, 1);
d = correctParam(d, 0);
if (e==undefined) e = Strong.easeInOutExpo;
blur = correctParam(blur, 0);
aimx = correctParam(aimx, null);
aimy = correctParam(aimy, null);
aimalpha = correctParam(aimalpha, 0);
xsc = correctParam(xsc, 100);
ysc = correctParam(ysc, 100);
//trace("s: "+s+" | "+"d: "+d+" | "+"e: "+e+" | "+"blur: "+blur+" | "+"aimx: "+aimx+" | "+"aimy: "+aimy+" | "+"aimalpha: "+aimalpha+" | "+"xsc: "+xsc+" | "+"ysc: "+ysc)
var fout:Fuse = new Fuse();
fout.target = fadeout_mc;
fout.push({Blur_blur:blur, alpha:aimalpha, x:aimx, y:aimy, xscale:xsc, yscale:ysc, ease:e, seconds:s, delay:d});
fout.start();
}
function correctParam(p:Number, n:Number):Number {
if (p==undefined || isNaN(p)) {
return (n);
} else {
return (p);
}
}
c. randRange.as: 乱数の生成 [©Adobe Systems Incorporated]
#include "as/randRange.as"
//Copyright © 2009 Adobe Systems Incorporated. All Rights Reserved.
function randRange(min, max):Number {
var i = Math.floor(Math.random()*(max-min+1))+min;
return (i);
}