[Matrix練習]マウスの速さと方向に反応する三角形
/**
* Copyright esukei ( http://wonderfl.net/user/esukei )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/hZ3R
*/
package {
import flash.display.Sprite;
import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.geom.Point;
import flash.events.*;
import flash.geom.Matrix;
import flash.geom.Rectangle;
public class FlashTest extends Sprite {
//ビットマップ
private var bitmapData:BitmapData;
private var bitmap:Bitmap;
//三角形書く用
private var sprite:Sprite;
//1フレーム前のマウス座標格納用。特にPointにする必要なかったけど使ってみたかっただけ。
private var point:Point;
//変形用マトリクス
private var matrix:Matrix;
//コンストラクタ
public function FlashTest() {
//フレームレート設定
stage.frameRate = 30;
//スプライト準備
sprite = new Sprite();
//三角形描画
sprite.graphics.beginFill(0x000000,1.0);
sprite.graphics.moveTo(0, 0);
sprite.graphics.lineTo(0, 50);
sprite.graphics.lineTo(50, 25);
sprite.graphics.lineTo(0, 0);
sprite.graphics.endFill();
//マトリックス初期化
matrix = new Matrix();
//ビットマップ初期化
bitmapData = new BitmapData(stage.stageWidth,stage.stageHeight,true,0x00000000);
bitmap = new Bitmap(bitmapData);
addChild(bitmap);
//ポイント初期化。とりあえずマウス座標代入
point = new Point(mouseX, mouseY);
//ループ設定
addEventListener(Event.ENTER_FRAME, loop);
}
//マウス座標の差分用。なんでここはポイントにしなかったか良く分からん。
private var dx:Number;
private var dy:Number;
//角度
private var r:Number;
//距離
private var d:Number;
//メインループ
private function loop(e:Event):void
{
//差分取得
dx = mouseX - point.x;
dy = mouseY - point.y;
//角度計算
r = Math.atan2(dy,dx);
//移動距離
d = Math.sqrt(dx*dx + dy*dy);
//ステージの対角線を基準にして移動距離の割合でアルファ変化(1.2かけてちょっと見た目補正)
bitmap.alpha = d / Math.sqrt(stage.stageWidth*stage.stageWidth + stage.stageHeight*stage.stageHeight) * 1.2;
/**
* ここから変形開始
*/
//まずは変形基準点が三角形の鼻先になるように移動
matrix.translate(-50,-25);
//移動距離に応じて三角形の長さ変化。0.1とか/15とかは見た目補正
matrix.scale(0.1+d/15,1);
//角度設定
matrix.rotate(r);
//マウスの所まで移動
matrix.translate(mouseX,mouseY);
//ビットマップにdraw
bitmapData.lock();
bitmapData.fillRect(new Rectangle(0,0,stage.stageWidth,stage.stageHeight),0x00000000);
bitmapData.draw(sprite,matrix);
bitmapData.unlock();
/**
* matrixに逆順で元に戻るように変形かけて初期化
* ※これって毎度毎度newするのとどっちが良いんだろうね。
*/
matrix.translate(-mouseX,-mouseY);
matrix.rotate(-r);
matrix.scale(1/(0.1+d/15),1);
matrix.translate(50,25);
//マウスの座標を保存
point.x = mouseX;
point.y = mouseY;
}
}
}