#2 Mouse Record forked from: #1 Like A TimeLine
forked from #1 Like A TimeLine (diff: 64)
ActionScript3 source code
/**
* Copyright yun ( http://wonderfl.net/user/yun )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/cFlf
*/
// forked from yun's Like A TimeLine
package {
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.filters.GlowFilter;
import flash.geom.Point;
[SWF(width="465", height="465", backgroundColor="0x000000", frameRate="30")]
public class FlashTest extends Sprite {
private var _ball:Sprite;
private var _timeGage:Sprite;
private var _locus:Sprite;
private var _startX:Number = 0; // xのスタート位置
private var _endX:Number = stage.stageWidth; // xのエンド位置
private var _startY:Number = stage.stageHeight/2; // yのスタート位置
private var _frameCount:uint = 0; // 再生ヘッド(フレーム数カウント用の変数)
private var _frameCountLimit:uint = 150; // コマ数(最終フレームの位置)
private var _animationFrames:Array; // フレーム格納用の配列
public function FlashTest() {
init();
}
public function init():void { // 初期化メソッド
_animationFrames = generate_animationFrames(); // アニメーションフレームの生成
_ball = new Sprite(); // 画面に表示される_ball用Sprite
_ball.graphics.lineStyle(1, 0x00FFFF);
_ball.graphics.beginFill(0x00FFFF, 0.2);
_ball.graphics.drawCircle(0, 0, 5);
_ball.graphics.endFill();
_timeGage = new Sprite(); // 画面下部のゲージ用Sprite
_timeGage.graphics.beginFill(0xFFFFFF, 0.5);
_timeGage.graphics.drawRect(0, 0, stage.stageWidth, 3);
_timeGage.graphics.endFill();
_timeGage.x = -1;
_timeGage.y = stage.stageHeight-3;
_locus = new Sprite(); // 軌跡表示用Sprite
// _ball.blendMode = BlendMode.ADD;
_ball.filters = [new GlowFilter(0x00FFFF, 1, 16, 16, 2, 2)];
addChild(_locus);
addChild(_timeGage);
addChild(_ball); // _ballをDisplayTreeへ登録
stage.addEventListener(MouseEvent.MOUSE_DOWN, startRec);
stage.addEventListener(MouseEvent.MOUSE_UP, stopRec);
updateLocus(); // 軌跡の初期化
start(); // レンダリング開始
}
private function generate_animationFrames():Array { // アニメーションフレームを生成するメソッド
var tmp:Array = new Array(); // 出力用の一時的な配列
var easeRatio:Number = 0.1; // イージングの比率
var tmpX:Number = _startX;
var tmpY:Number = _startY;
for(var i:uint = 0; i < _frameCountLimit; i++){
tmpX += (_endX - tmpX)*easeRatio;
tmp.push(new Point(tmpX, tmpY)); // 各コマのx座標、Y座標をコマ数だけ計算して配列に追加
}
return tmp;
}
private function render(e:Event):void { // レンダリング用のメソッド
if(_frameCount < _frameCountLimit) { // 現在のフレーム数が_frameCountLimit以内なら
_ball.x = _animationFrames[_frameCount].x; // _ballのxに今のコマ数のx座標を代入
_ball.y = _animationFrames[_frameCount].y; // _ballのyに今のコマ数のy座標を代入
} else {
// stop(); // アニメーション終了
_frameCount = 0;
}
_timeGage.width = (_frameCount / _frameCountLimit)*stage.stageHeight; //画面下部のゲージを連動させる
_frameCount++; // 再生ヘッドを進める
}
// スタート用のメソッド。renderがENTER_FRAMEのタイミングで実行されるように設定
public function start():void {
addEventListener(Event.ENTER_FRAME, render);
}
// ストップ用のメソッド。renderがENTER_FRAMEのタイミングで実行されるように設定されているのを解除
public function stop():void {
removeEventListener(Event.ENTER_FRAME, render);
}
// 記録スタート用のメソッド。
private function startRec(e:Event):void {
addEventListener(Event.ENTER_FRAME, recMouse);
}
// 記録ストップ用のメソッド。
private function stopRec(e:Event):void {
removeEventListener(Event.ENTER_FRAME, recMouse);
}
private function recMouse(e:Event):void { // マウス記録中に呼び出されるメソッド
if(_frameCount < _frameCountLimit){ // フレームが指定のフレーム以内じゃないと動作させない
_animationFrames[_frameCount].x = mouseX;
_animationFrames[_frameCount].y = mouseY;
updateLocus(); // 軌跡を再描画
}
}
private function updateLocus():void { // フレーム毎に記録されている座標から軌跡を描画するメソッド
_locus.graphics.clear();
_locus.graphics.lineStyle(1, 0xFFFFFF, 0.2);
for(var i:uint = 0; i < _frameCountLimit; i++) {
_locus.graphics.drawCircle(_animationFrames[i].x, _animationFrames[i].y, 2);
}
}
}
}
