package {
import flash.display.Sprite;
import flash.display.MovieClip;
import flash.filters.GlowFilter;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.display.Loader;
import flash.net.URLRequest;
import fl.transitions.Tween;
import fl.transitions.easing.*;
import fl.transitions.TweenEvent;
//ステージの設定
[SWF(width=800, height=400, frameRate=24, backgroundColor=0x000000)]
//クラス
public class photoviewer20 extends Sprite {
var num:Number = 13; //写真枚数
var w:Number = 240; //サムネイルの幅
var h:Number = 160; //サムネイルの高さ
var glow1:GlowFilter = new GlowFilter(0xffffff,0.8,3,3,8,3);
var glow2:GlowFilter = new GlowFilter(0xff0000,0.4,10,10,8,3,true);
var preMousex:Number; //移動前のマウス位置(x座標)
var movex:Number; //マウス移動距離(x軸方向)
var speed:Number = 1 / 200; //マウス移動距離にかかる速度係数
var kd:Number = 0; //マウス移動距離に反応してサムネイルが移動する角速度
var url:String; //読み込み画像ファイルへのパス
var screen:MovieClip; //拡大画像読み込み用MC
var a = []; //深度管理用関数で使用する配列類
var b = [];
var c = [];
var d = [];
var e = [];
//サムネイルの表示、イベント設定、移動
public function photoviewer20():void {
screen = new MovieClip();
addChild(screen);
for (var i:uint = 0; i < num; i++) {
var mc:MovieClip = new MovieClip();
mc.buttonMode = true;
mc.n = i;
mc.name = "sp" + i;
var inner_mc:MovieClip = new MovieClip(); //サムネイル読み込み用入れ子のMC
inner_mc.x = - w / 2; //中心をmcの左上に
inner_mc.y = - h / 2;
mc.addChild(inner_mc);
url = "img/ps" + i + ".jpg"; //サムネイルのパス
loadThumb(inner_mc);
var rd = -1/2*Math.PI + i / (num+1) * Math.PI;
addChild(mc);
mc.filters = [glow1];
mc.addEventListener(MouseEvent.ROLL_OVER, rollover);
mc.addEventListener(MouseEvent.ROLL_OUT, rollout);
mc.addEventListener(MouseEvent.CLICK, loadImg);
mc.addEventListener(Event.ENTER_FRAME, enterframe);
}
function enterframe(event:Event):void {
var p_mc:MovieClip = event.target as MovieClip;
kd += (speed - kd) / 50;
rd = kd + event.target.n / (num+1) * Math.PI - 1/2*Math.PI;
if (Math.cos(rd) < 0) {
if (movex > 0) {
rd = rd - Math.PI;
} else {
rd += Math.PI;
}
}
p_mc.x = stage.stageWidth / 2 + 230 * Math.sin(rd);
p_mc.y = stage.stageHeight / 2 + 1 * Math.cos(rd);
p_mc.yPosition = Math.cos(rd);
p_mc.rotationY = rd / Math.PI * 180; //rotationYでサムネイルを位置に応じた台形に変換
if (Math.cos(rd) < 0.2) { //x軸に近い(両脇の)サムネイルを非表示に(0.2は適当)
p_mc.visible = false;
} else {
p_mc.visible = true;
}
depthControll(); //yPositionが大きいほど(中央に近いほど)深度が
setChildIndex(p_mc,e[event.target.n]); //大きくなるように管理用関数をもとに設定する
if (e[event.target.n] == num - 1) {
p_mc.alpha = 1.0; //中央にきたサムネイルだけをアルファ値を1.0に
} else {
p_mc.alpha = 0.6;
}
}
stage.addEventListener(MouseEvent.MOUSE_DOWN, mDownHandler);
}
//サムネイルのロールオーバーでグロー効果付与
private function rollover(event:MouseEvent):void {
event.currentTarget.filters = [glow2];
}
//サムネイルのロールアウトで元に戻す
private function rollout(event:MouseEvent):void {
event.currentTarget.filters = [glow1];
}
//サムネイルの読み込み関数
private function loadThumb(mc):void {
var imgLoader = new Loader();
var urlReq:URLRequest = new URLRequest(url);
imgLoader.load(urlReq);
mc.addChild(imgLoader);
}
//拡大写真の読み込み関数
private function loadImg(event:MouseEvent):void {
var imgLoader = new Loader();
var url:String = "img/p" + event.currentTarget.n + ".jpg";
var urlReq:URLRequest = new URLRequest(url);
imgLoader.load(urlReq);
screen.addChild(imgLoader);
imgLoader.contentLoaderInfo.addEventListener( Event.COMPLETE , displayPic);
function displayPic():void {
var inTween = new Tween(screen,"alpha",Regular.easeOut,0,1,1,true);
screen.buttonMode = true;
screen.removeEventListener( Event.COMPLETE , displayPic);
screen.addEventListener(MouseEvent.CLICK, removeImg);
function removeImg(event:MouseEvent):void {
var outTween = new Tween(screen,"alpha",Regular.easeOut,1,0,0.5,true);
outTween.addEventListener(TweenEvent.MOTION_FINISH, onMotionFinished);
function onMotionFinished(event:TweenEvent):void {
screen.removeEventListener(MouseEvent.CLICK, removeImg);
screen.removeChild(imgLoader);
imgLoader = null;
}
}
}
}
//マウスがドラッグされた距離の測定、移動量の積算
private function mDownHandler(e:MouseEvent):void {
preMousex = mouseX;
stage.addEventListener(MouseEvent.MOUSE_MOVE, mMoveHandler);
function mMoveHandler(e:MouseEvent):void {
movex = mouseX - preMousex;
speed += movex / 200;
preMousex = mouseX;
}
function mUpHandler(e:MouseEvent):void {
speed += 0;
stage.removeEventListener(MouseEvent.MOUSE_MOVE,mMoveHandler);
}
stage.addEventListener(MouseEvent.MOUSE_UP, mUpHandler);
}
//深度管理用関数
private function depthControll():Array {
for (var i:uint=0; i<num; i++) {
var o_mc = MovieClip(getChildByName("sp" + i));
var currentyPosition = o_mc.yPosition;
a[i] = [currentyPosition,i];
}
b = a.sortOn([0],[Array.NUMERIC]);
for (var j:uint=0; j<num; j++) {
c[j] = [b[j][1],j];
}
d = c.sortOn([0],[Array.NUMERIC]);
for (var k:uint=0; k<num; k++) {
e[k] = d[k][1];
}
return e;
}
}
} |