Mouse stalker 003
Super Simple Mouse stalker
超単純マウスストーカー
あんまり単純過ぎてもアレなので、マウス追随シェイプにブレンドモード操作とブラーフィルター適用をしてみました。
背景の色は白 or 黒をランダム
マウス追随オブジェクトの色は 0x000000 ~ 0xffffff をランダム
// Super Simple Mouse stalker
// 超単純マウスストーカー
// あんまり単純過ぎてもアレなので、マウス追随シェイプにブレンドモード操作とブラーフィルター適用をしてみました。
// 背景の色は白 or 黒をランダム
// マウス追随オブジェクトの色は 0x000000 ~ 0xffffff をランダム
package {
/**
* @author YOSHIDA, Akio
*/
import flash.display.Shape;
import flash.display.Sprite;
import flash.events.Event;
[SWF(width = "465", height = "465", frameRate = "60", backgroundColor = "#ffffff")]
public class Main extends Sprite {
private var numOfFollowShape:uint = 8; // マウス追随シェイプの数
private var vctr:Vector.<FollowShape>; // マウス追随シェイプ格納ベクター
public function Main():void {
// 下地
var back:Shape = new Shape();
var flg:uint = Math.floor(Math.random() * 2); // flg : 0 or 1
back.graphics.beginFill(0xffffff*flg); // 背景色はランダムで黒/白
back.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
back.graphics.endFill();
addChild(back);
// マウス追随シェイプ
vctr = new Vector.<FollowShape>(numOfFollowShape, true);
var target:FollowShape = null;
for (var i:uint = 0; i < numOfFollowShape; i++) {
var followShape:FollowShape = new FollowShape(flg, target);
followShape.x = -50;
followShape.y = -50;
vctr[i] = followShape;
addChild(followShape);
target = followShape;
}
addEventListener(Event.ENTER_FRAME, enterFrameHandler);
}
private function enterFrameHandler(e:Event):void {
var i:uint = numOfFollowShape;
while (i--) { vctr[i].motion(); }
}
}
}
// マウス追随シェイプクラス
import flash.display.Shape;
import flash.display.BlendMode;
import flash.filters.BlurFilter;
import flash.filters.BitmapFilterQuality;
class FollowShape extends Shape {
private var vx:Number = 0;
private var vy:Number = 0;
private var spring:Number = 0.01;
private var friction:Number = 0.9;
private var target:FollowShape;
public function FollowShape(flg:uint, target:FollowShape = null):void {
// 追随相手(一つ前の FollowShape)
// 最初に生成された FollowShape は target が null になる
this.target = target;
// 形状生成
var size:uint = 30;
graphics.beginFill(Math.random() * 0xffffff);
graphics.drawCircle(0, 0, size);
graphics.endFill();
// 背景色の白(flg==1)/黒(flg==0)で BlendMode を変える
if (flg == 1) {
blendMode = BlendMode.SUBTRACT;
} else {
blendMode = BlendMode.ADD;
}
// BlurFilter 適用
filters = [new BlurFilter(16, 16, BitmapFilterQuality.HIGH)];
}
public function motion():void {
var tx:Number;
var ty:Number;
if (target == null) {
tx = root.mouseX;
ty = root.mouseY;
} else {
tx = target.x;
ty = target.y;
}
vx += (tx - x) * spring;
vy += (ty - y) * spring;
vx *= friction;
vy *= friction;
x += vx;
y += vy;
}
}