読み込んだ画像を、matrixで歪ませながら拡大させる。
http://wonderfl.net/c/wJDq/
構造は、fork前と同じです。
_containerの中に、_canvas,_p0,_p1,_p2,_p3が入ってます。
ゆがんでいるイメージを描画しているのはdraw()のなかのbeginBitmapFill()です。
歪ませるのにはMatrixが必要です。そのMatrixは_getTransformMatrix()で設定しています。
このMatrixの設定のために、_p0,_p1,_p2,_p3(fork前のインスタンス名は_cP0,_cP1,_cP2,_cP3)の位置情報を使用しています。
手軽に試す場合は、
1.bitmapImageStringArrayのイメージURIを差し替える。
2.TestImageの画像サイズ(縦横400)を適宜変更する。
3.Tweenerのプロパティをいじる
などしてくみてださい。
※連打するとTweenerがわやわやですが、これ以上複雑にするのをやめます。
調整する必要があれば、フラグを立ててがんばってください。
※画像が静止すると、下に1ピクセル余計な線ができます。
簡単な調整として、TestImageの高さを-1してます。
※policyfileの読み込み待ち用TIMERは不細工です。
もっとスマートな方法があれば教えてください
/**
* Copyright sinketu ( http://wonderfl.net/user/sinketu )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/7fIw6
*/
// forked from y_tti's てらこ23で発表したものの説明2
//http://wonderfl.net/c/wJDq/
/*
構造は、fork前と同じです。
_containerの中に、_canvas,_p0,_p1,_p2,_p3が入ってます。
ゆがんでいるイメージを描画しているのはdraw()のなかのbeginBitmapFill()です。
歪ませるのにはMatrixが必要です。そのMatrixは_getTransformMatrix()で設定しています。
このMatrixの設定のために、_p0,_p1,_p2,_p3(fork前のインスタンス名は_cP0,_cP1,_cP2,_cP3)の位置情報を使用しています。
手軽に試す場合は、
1.bitmapImageStringArrayのイメージURIを差し替える。
2.TestImageの画像サイズ(縦横400)を適宜変更する。
3.Tweenerのプロパティをいじる
などしてくみてださい。
※連打するとTweenerがわやわやですが、これ以上複雑にするのをやめます。
調整する必要があれば、フラグを立ててがんばってください。
※画像が静止すると、下に1ピクセル余計な線ができます。
簡単な調整として、TestImageの高さを-1してます。
※policyfileの読み込み待ち用TIMERは不細工です。
もっとスマートな方法があれば教えてください
*/
package
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.MovieClip;
import flash.utils.Timer;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Matrix;
import flash.geom.Point;
import caurina.transitions.Tweener;
import net.hires.debug.Stats;
import flash.system.Security;
import flash.events.TimerEvent;
[SWF(width = "465", height = "465", frameRate = "30", backgroundColor = "0x000000")]
public class Main extends MovieClip
{
private var _container:Sprite;
private var _canvas:Sprite;
private var _bmd:BitmapData;
private var _stageW:Number = 465;
private var _stageH:Number = 465;
private var _p0:CirclePoint;
private var _p1:CirclePoint;
private var _p2:CirclePoint;
private var _p3:CirclePoint;
private var myBitmapMaker:BitmapMaker;
private var _counter:uint = 0;
private var miniBitmapSize:uint = 40;
public function Main()
{
Security.loadPolicyFile("http://www.sinketu.com/wonderfl/crossdomain.xml");
var lpTimer:Timer=new Timer(500,1);
//policyfileの読み込み待ち用TIMER
lpTimer.addEventListener(TimerEvent.TIMER,setBitmap);
lpTimer.start();
}
public function setBitmap(e:TimerEvent):void{
myBitmapMaker = new BitmapMaker(this);
}
public function init():void {
_bmd = Bitmap(new TestImage()).bitmapData;
_canvas = new Sprite();
_container = new Sprite();
_container.addChild(_canvas);
addChild(_container);
_container.x = (_stageW - _bmd.width)/2;
_container.y = (_stageH - _bmd.height)/2;
_p0 = new CirclePoint(0,0);
_p1 = new CirclePoint(_bmd.width,0);
_p2 = new CirclePoint(0,_bmd.height);
_p3 = new CirclePoint(_bmd.width,_bmd.height);
_container.addChild(_p0);
_container.addChild(_p1);
_container.addChild(_p2);
_container.addChild(_p3);
xClick(null);
_container.addEventListener(MouseEvent.CLICK, xClick);
_container.buttonMode=true;
addEventListener(Event.ENTER_FRAME, xEnterFrame);
}
private function xEnterFrame(e:Event):void
{
_draw();
}
private function xClick(e:MouseEvent):void
{
var sw:Number = stage.stageWidth / 2;
var sh:Number = stage.stageHeight / 2;
_container.visible = true;
_bmd.draw(myBitmapMaker.bitmaapArray[_counter % myBitmapMaker.bitmaapArray.length]);
_p0.x = -miniBitmapSize+_bmd.width/2;
_p1.x = miniBitmapSize+_bmd.width/2;
_p2.x = -miniBitmapSize+_bmd.width/2;
_p3.x = miniBitmapSize+_bmd.width/2;
_p0.y = -miniBitmapSize+_bmd.height/2;
_p1.y = -miniBitmapSize+_bmd.height/2;
_p2.y = miniBitmapSize+_bmd.height/2;
_p3.y = miniBitmapSize+_bmd.height/2;
Tweener.addTween(_p0, { x:_p0.initPoint.x, y:_p0.initPoint.y, time:Math.floor(0.5*Math.random()*10)/10+0.3, transition:"easeOutBack",delay:0.1});
Tweener.addTween(_p1, { x:_p1.initPoint.x, y: _p1.initPoint.y, time:Math.floor(0.5*Math.random()*10)/10+0.3, transition:"easeOutBack",delay:0.15});
Tweener.addTween(_p2, { x:_p2.initPoint.x, y: _p2.initPoint.y, time:Math.floor(0.5*Math.random()*10)/10+0.3, transition:"easeOutBack" ,delay:0.2});
Tweener.addTween(_p3, { x:_p3.initPoint.x, y: _p3.initPoint.y, time:Math.floor(0.5*Math.random()*10)/10+0.3, transition:"easeOutBack",delay:0.25} );
_counter++;
}
private function _draw():void {
//初期状態のポイント取得
var aP0:Point = _p0.initPoint;
var aP1:Point = _p1.initPoint;
var aP2:Point = _p2.initPoint;
var aP3:Point = _p3.initPoint;
//初期状態のポイントよりマトリックス取得
var initMatrix1:Matrix = _getTransformMatrix( aP0 , aP1 , aP2 );
var initMatrix2:Matrix = _getTransformMatrix( aP3 , aP2 , aP1 );
//変更状態のポイント取得
var bP0:Point = new Point(_p0.x , _p0.y );
var bP1:Point = new Point(_p1.x , _p1.y );
var bP2:Point = new Point(_p2.x , _p2.y );
var bP3:Point = new Point(_p3.x , _p3.y );
//変更状態のポイントよりマトリックス取得
var editMatrix1:Matrix = _getTransformMatrix( bP0 , bP1 , bP2 );
var editMatrix2:Matrix = _getTransformMatrix( bP3 , bP2 , bP1 );
//初期状態と変更状態のマトリックスを合体
var newMatrix1:Matrix = initMatrix1.clone();
newMatrix1.concat(editMatrix1);
var newMatrix2:Matrix = initMatrix2.clone();
newMatrix2.concat(editMatrix2);
//前のをすべて消去
_canvas.graphics.clear();
//マトリックスを適応
//分割した1個目を描画
_canvas.graphics.beginBitmapFill(_bmd , newMatrix1 );
_canvas.graphics.moveTo(bP0.x , bP0.y );
_canvas.graphics.lineTo(bP1.x , bP1.y );
_canvas.graphics.lineTo(bP2.x , bP2.y );
_canvas.graphics.endFill();
//分割した2個目を描画
_canvas.graphics.beginBitmapFill(_bmd , newMatrix2 );
_canvas.graphics.moveTo(bP3.x , bP3.y );
_canvas.graphics.lineTo(bP1.x , bP1.y );
_canvas.graphics.lineTo(bP2.x , bP2.y );
_canvas.graphics.endFill();
}
private function _getTransformMatrix($pt0:Point, $pt1:Point, $pt2:Point):Matrix
{
var w:Number = _bmd.width;
var h:Number = _bmd.height;
var mat:Matrix = new Matrix();
mat.a = ($pt1.x - $pt0.x) / w;
mat.b = ($pt1.y - $pt0.y) / w;
mat.c = ($pt2.x - $pt0.x) / h;
mat.d = ($pt2.y - $pt0.y) / h;
mat.tx = $pt0.x;
mat.ty = $pt0.y;
return mat;
}
}
}
import flash.display.Loader;
import flash.display.MovieClip;
import flash.display.LoaderInfo;
import flash.display.Bitmap;
import flash.display.Shape;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.events.Event;
import flash.net.URLRequest;
import flash.geom.Point;
class CirclePoint extends Sprite {
public var initPoint:Point;
public function CirclePoint($x:Number , $y:Number) {
this.x = $x;
this.y = $y;
this.initPoint = new Point( $x , $y );
}
}
class TestImage extends Bitmap {
private var _w:Number = 400;
private var _h:Number = 400-1;
public function TestImage():void {
var bmd:BitmapData = new BitmapData(_w, _h);
this.bitmapData = bmd;
}
}
class BitmapMaker
{
private var info:LoaderInfo;
public var bitmaapArray:Array = new Array();
public static const bitmapImageStringArray:Array = ["http://www.sinketu.com/wonderfl/sample01.jpg","http://www.sinketu.com/wonderfl/sample02.jpg"];
private var _counter:uint=0;
private var myLoader:Loader;
private var _mc:MovieClip;
public function BitmapMaker(mc:MovieClip)
{
_mc = mc;
_counter = 0;
makeBitmap();
}
private function makeBitmap():void
{
myLoader = new Loader();
myLoader.load(new URLRequest(bitmapImageStringArray[_counter]));
info = myLoader.contentLoaderInfo;
info.addEventListener(Event.COMPLETE, xImgLoaded);
}
private function xImgLoaded(e:Event):void
{
bitmaapArray.push(myLoader);
_counter++
if (_counter >= bitmapImageStringArray.length) {
_mc.init() ;
}else {
makeBitmap();
}
}
}