DynamicStack
1時間でカッコいいViewStack作る. LIVE CODING 2010/07/30 22:14-24:25 ひとまず完成,結局2時間くらいかかってしまった。 複数のDisplayObjectをEffectつきで切り替え表示できる DynamicStackクラスを作成しました。 クリックで写真が切り替わります。 エフェクトの追加は割と簡単にできるようになっているので、 ちょこちょこやってくつもりです。 特徴とか 複数のエフェクトを重ねてつかうことができる。 ボタンなどを含んだSpriteにもつかえるはず(未テスト) 画像はこちらからお借りしました。 http://sozai-free.com/
♥2 |
Line 120 |
Modified 2010-08-01 11:18:14 |
MIT License
archived:2017-03-10 11:19:53
| (replaced)
Related images
- cee894fed3be286c32b3af4b9ab5788a2809dec9
- 392fec0c0f2e35cb9a92c74df45b259c3b9f17ff
- b4f1fc75b232a258ee294a3cbc838360f64a5a7d
ActionScript3 source code
/**
* Copyright shohei909 ( http://wonderfl.net/user/shohei909 )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/pb4T
*/
//1時間でカッコいいViewStack作る. LIVE CODING 2010/07/30 22:14-24:25
//ひとまず完成,結局2時間くらいかかってしまった。
//複数のDisplayObjectをEffectつきで切り替え表示できる
//DynamicStackクラスを作成しました。
//クリックで写真が切り替わります。
//エフェクトの追加は割と簡単にできるようになっているので、
//ちょこちょこやってくつもりです。
//特徴とか
//複数のエフェクトを重ねてつかうことができる。
//ボタンなどを含んだSpriteにもつかえるはず(未テスト)
//画像はこちらからお借りしました。
//http://sozai-free.com/
package {
import flash.system.LoaderContext;
import flash.events.Event;
import flash.display.Loader;
import flash.display.Sprite;
import flash.net.URLRequest;
[SWF(width=465, height=465, backgroundColor=0x000000)]
public class FlashTest extends Sprite {
private var imgUrl:Array = ["http://assets.wonderfl.net/images/related_images/c/ce/cee8/cee894fed3be286c32b3af4b9ab5788a2809dec9",
"http://assets.wonderfl.net/images/related_images/3/39/392f/392fec0c0f2e35cb9a92c74df45b259c3b9f17ff",
"http://assets.wonderfl.net/images/related_images/b/b4/b4f1/b4f1fc75b232a258ee294a3cbc838360f64a5a7d"
];
private var images:Array = [];
private var count:int = 0;
private var stack:DynamicStack = new DynamicStack(400,400);
public function FlashTest():void {
// 画像読み込み
for(var i:int=0;i<imgUrl.length;i++){
images[i] = new Loader();
images[i].load( new URLRequest(imgUrl[i]), new LoaderContext(true));
stack.addStack(images[i]);
}
addChild(stack);
stage.addEventListener("mouseDown",onClick);
}
public function onClick(e:Event):void{
count++;
if(count>=imgUrl.length){count=0}
var d:Array = DynamicStack.EFFECT_NAME;
stack.removeEffect(0,-1);
stack.addEffect( d[int( Math.random()*d.length)] );
//二重エフェクト
if(Math.random()<0.2){ stack.addEffect( d[int( Math.random()*d.length)] ) };
stack.display(count);
}
}
}
import flash.filters.*;
import flash.geom.*;
import flash.events.Event;
import flash.display.*;
class DynamicStack extends Sprite{
private var w:int,h:int;
private var transMap:BitmapData;
private var bitmap:Bitmap;
private var maskMap:Bitmap = new Bitmap(new BitmapData(1,1));
private var children:Vector.<DisplayObject> = new Vector.<DisplayObject>();
private var _selectedChild:int = 0;
private var effects:Vector.<Object> = new Vector.<Object>();
private var time:int = 0;
private var maxTime:int = 0;
private var center:Point;
public static const EFFECT_NAME:Array = ["fade","zoomOut","spin","slide","blur","color","flash"];
public static const EFFECT_DATA:Array = [
{name:"normal",type:"matrix",time:0,matrix:new Matrix() },
{name:"fade",type:"matrix",time:30,matrix:new Matrix() },
{name:"zoomOut",type:"matrix",time:30,matrix:new Matrix(0.8,0,0,0.8) },
{name:"spin",type:"matrix",time:30,matrix:new Matrix(0.98,-0.02,0.02,0.98) },
{name:"slide",type:"matrix",time:30,matrix:new Matrix(1,0,0,1,-2,0) },
{name:"blur",type:"filter",time:30,filter:new BlurFilter() },
{name:"color",type:"filter",time:30,filter:new ColorMatrixFilter([0.8,0.2,0,0,10, 0,0.8,0.2,0,10, 0.2,0,0.8,0,10, 0,0,0,1,0]) },
{name:"flash",type:"filter",time:30,filter:new ColorMatrixFilter([0.4,0.6,0,0,5, 0,0.3,0.8,0,5, 0.8,0,0.1,0,5, 0,0,0,1,5]) }
];
public function DynamicStack(w:int,h:int):void{
transMap = new BitmapData(w,h,true,0x01AAAAAA);
bitmap = new Bitmap(new BitmapData(w,h,true,0x0));
bitmap.visible = false; super.addChild(bitmap);
addEventListener("enterFrame",onFrame);
super.addChild(maskMap); maskMap.scaleX = w; maskMap.scaleY = h; mask = maskMap;
}
public function addStack(obj:DisplayObject):DisplayObject{
children.push(obj); addChildAt(obj,0); obj.visible = false;
return obj;
}
public function display(index:int):DisplayObject{
children[_selectedChild].visible = false;
var size:int = effects.length;
time = 0;
for(var i:int=0;i<size;i++){ time += effects[i].time; }
maxTime = time;
if(time>0){
bitmap.visible = true;
var b:BitmapData = bitmap.bitmapData;
b.fillRect(b.rect,0);
b.draw( children[_selectedChild] );
}
_selectedChild = index;
return children[index];
}
//エフェクトの追加
public function addEffect(effectName:String="normal"):void{ effects.push(effect(effectName)); }
//エフェクトの削除 (index から lengthの数だけ削除, ただし、length=-1で以降全て削除)
public function removeEffect(index:int=0,length:int=1):Object{ return effects.splice(index, length) }
//オブジェクトを渡して、エフェクトを追加します。
public function addEffectObject(effect:Object):void{ effects.push(effect) }
//指定された名前のEffectを返します
static public function effect(effectName:String="normal"):Object{ return EFFECT_DATA[EFFECT_NAME.indexOf(effectName)+1]; }
//matrixタイプのEffectを作ってかえします
static public function matrixEffect(matrix:Matrix,time:int=40):Object{ return { name:"fade",type:"matrix",time:time,matrix:matrix } }
//filterタイプのEffectを作ってかえします
static public function filterEffect(filter:BitmapFilter,time:int=40):Object{ return { name:"fade",type:"filter",time:time,filter:filter } }
private function onFrame(e:Event=null):void{
if(_selectedChild>=0 && _selectedChild<children.length){
var b:BitmapData = bitmap.bitmapData;
children[_selectedChild].visible = true;
var size:int = effects.length;
if(time>0){
b.lock();
for(var i:int=0;i<size;i++){
switch(effects[i].type){
case "matrix":
b.draw(b,effects[i].matrix);
break;
case "filter":
b.applyFilter(b,b.rect,new Point,effects[i].filter);
}
var r:uint = (1- time / maxTime)*256;
b.merge(transMap,b.rect,new Point(),r,r,r,r);
time--;
}
b.unlock();
}
}
if(time==0){
bitmap.visible = false;
}
}
}