import mx.transitions.Tween;
import mx.transitions.easing.*;
import flash.display.BitmapData;
import flash.geom.Matrix;
import flash.geom.Point;
import flash.geom.Rectangle;
import flash.display.*;
import flash.filters.GlowFilter;
var glow1:GlowFilter = new GlowFilter(0xffffff, 0.5, 2, 2, 8, 3, true);
var pNum = 8;//写真の枚数
var vNum = 4;//縦方向回転分割数(実質的には4)
var hNum = 6;//水平分割数
var w = 600;//写真の幅
var h = 337;//写真の高さ
var part_w = w/hNum;//分割矩形の幅
var picNo = 1;//表示写真番号の初期値
var rd = 2*Math.PI/vNum;//写真の面の垂直方向の角度
var r = h/2/Math.tan(rd/2);//写真の面の回転中心からの距離
var count = 0;//回転する分割面特定のための通し番号
var bmd = [];//各分割面のビットマップデータの配列定義
//写真表示用ムービークリップの作成・配置
var imgBox = this.createEmptyMovieClip("imgBox", 0);
imgBox._x = Stage.width/2-w/2;
imgBox._y = Stage.height/2-20;
imgBox.filters = [glow1];
//前写真の読み込みと初期写真番号の表示
for (i=1; i<=pNum; i++) {
loadImg("img/p"+i+".jpg",i);
}
pNo_box.text = picNo+"/"+pNum;
//写真の読み込み・BitmapData化
function loadImg(imgDir, n) {
var bmp = imgBox.createEmptyMovieClip("bmp"+i, 1000+i);
var mcLoader:MovieClipLoader = new MovieClipLoader();
mcLoader.loadClip(imgDir,bmp);
var loadListener = new Object();
//画像読み込み終了後次に
loadListener.onLoadInit = function() {
//画像(bmp)のBitmapData化
bmd[n] = new BitmapData(w, h, true, 0x00FFFFFF);
bmd[n].draw(bmp);
bmp.removeMovieClip();
deviding(n);
};
mcLoader.addListener(loadListener);
}
//写真の分割
function deviding(n) {
for (j=1; j<=hNum; j++) {
//通し番号を付けて分割画像収納用MCを作成
count++;
mc = imgBox.createEmptyMovieClip("rec_mc"+count, count);
in_mc = mc.createEmptyMovieClip("in_mc"+count, count);
in_mc._y = -h/2; //短冊縦方向中央を回転軸とする
mc._x = (part_w-1)*(j-1); //part_w-1 は隙間を埋めるための補正
mc.bitmap = new BitmapData(part_w, h);
mc.rect = new Rectangle(part_w*(j-1), 0, part_w, h);
mc.bitmap.copyPixels(bmd[n],mc.rect,new Point(0, 0));
in_mc.attachBitmap(mc.bitmap,2000+count);
mc.inum = n;
mc.jnum = j;
mc.diff = 2*Math.PI/vNum;
}
}
//分割面の時間差をおいた回転
function circulatn(d_mc) {
imgBoxTween();
d_mc.lag = getTimer();
d_mc.onEnterFrame = function() {
if (getTimer()-this.lag>100*this.jnum) {
if (passdirection*(2*Math.PI/vNum*picNo-this.diff)<0.02) {
this.diff = 2*Math.PI/vNum*picNo;
delete this.onEnterFrame;
pNo_box.text = picNo+"/"+pNum;
} else {
this.diff += passdirection*0.1;
}
this.rd = (this.diff-(this.inum-1)/vNum*2*Math.PI);
//縦方向のサイズ、位置を変化させて回転状態にする
mcx = (this.jnum-1)*(part_w-1);
mcy = r*Math.cos(this.rd);
a = 1;
b = 0;
c = 0;
d = Math.sin(this.rd);
var myMatrix:Matrix = new Matrix(a, b, c, d, mcx, mcy);
this.transform.matrix = myMatrix;
//各写真の深度調節
this.depth = Math.floor((2*Math.PI/vNum
-Math.abs(this.inum*2*Math.PI/vNum-this.diff))*100);
this.swapDepths(this.depth);
}
};
}
//トランジション時の全体画像縮小・拡大アクション
function imgBoxTween() {
var twxs1 = new Tween(imgBox, "_xscale", Regular.easeOut, 100, 60, 0.5, true);
var twys1 = new Tween(imgBox, "_yscale", Regular.easeOut, 100, 60, 0.5, true);
var twx1 = new Tween(imgBox, "_x", Regular.easeOut, Stage.width/2-w/2,
Stage.width/2-w/2*0.6, 0.5, true);
twx1.onMotionFinished = function() {
var twxs2 = new Tween(imgBox, "_xscale", Regular.easeIn, 60, 100, 0.5, true);
var twys2 = new Tween(imgBox, "_yscale", Regular.easeIn, 60, 100, 0.5, true);
var twx2 = new Tween(imgBox, "_x", Regular.easeIn, Stage.width/2-w/2*0.6,
Stage.width/2-w/2, 0.5, true);
};
}
//「送る」ボタンのイベント
f_btn.onRelease = function() {
passdirection = 1;
count = 0;
for (i=1; i<=pNum; i++) {
for (j=1; j<=hNum; j++) {
count++;
mc = imgBox["rec_mc"+count];
if (picNo<pNum) {
circulatn(mc);
}
}
}
picNo++;
b_btn._visible = true;
if (picNo>pNum-1) {
f_btn._visible = false;
} else {
f_btn._visible = true;
}
};
//「戻る」ボタンのイベント
b_btn.onRelease = function() {
passdirection = -1;
count = 0;
for (i=1; i<=pNum; i++) {
for (j=1; j<=hNum; j++) {
count++;
mc = imgBox["rec_mc"+count];
if (picNo>1) {
circulatn(mc);
}
}
}
picNo--;
f_btn._visible = true;
if (picNo<2) {
b_btn._visible = false;
} else {
b_btn._visible = true;
}
};
|
mc.bitmap = new BitmapData(part_w, h);
mc.rect = new Rectangle(part_w*(j-1), 0, part_w, h);
mc.bitmap.copyPixels(bmd[n],mc.rect,new Point(0, 0));
in_mc.attachBitmap(mc.bitmap,2000+count);
分割画像収納用MCに、元写真の、その位置・その大きさの部分のビットマップデータをコピーし、表示させる
this.depth = Math.floor((2*Math.PI/vNum-Math.abs(this.inum*2*Math.PI/vNum-this.diff))*100);
this.swapDepths(this.depth);
表示面(立方体の一番手前)に近い画像ほど深度が大きくなるように設定
|