Friday, February 27, 2009

CoverFlow AS2

import blueroad.paper.BasePaper;
import caurina.transitions.Tweener;
import com.drca.reflect.ReflectionAS2;
import org.papervision3d.materials.MovieMaterial;
import org.papervision3d.objects.Plane;
import org.papervision3d.Papervision3D;
/**
* ...
* @author binhdocco
*/
class blueroad.coverflow.CoverFlowManager extends BasePaper {
private var mov1_mc: MovieClip;
private var mov2_mc: MovieClip;
private var mov3_mc: MovieClip;
private var mov4_mc: MovieClip;
private var mov5_mc: MovieClip;

private var pics: Array;
private var planes: Array = [];
//for tweener
private var time: Number = 1;
private var TRANSITION_ANI: String = "easeoutback";
//for position
private var distance: Number = 300;
private var roAngle: Number = -60;

public function CoverFlowManager() {

}
public function onLoad() {
init();
}
public function init3d() {
//trace("planes.length : " + planes.length);
pics = [mov1_mc, mov2_mc, mov3_mc, mov4_mc, mov5_mc];
planes = [];
for (var i:Number = 0; i < pics.length; i++) {
//var linkageId: String = pics[i];

var mov: MovieClip = pics[i];
new ReflectionAS2( { mc:mov, alpha:40, ratio:70, distance:0, reflectionDropoff:1 } );
mov._visible = false;
//trace("mov : " + mov);
//new Reflect( { mc:mov, alpha:50, ratio:50, distance:0, updateTime:0, reflectionDropoff:1 } );
var mat: MovieMaterial = new MovieMaterial(mov, true);
mat.oneSide = false;
mat.smooth = true;
//get width & height
var plane: Plane = new Plane(mat , mov.width, mov.height, 10, 10);
plane.x = i * distance;
plane.y += mov._height / 4;
plane.extra = { status: "normal", id: i };
planes.push(plane);
//plane.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, onClickPlane);
//plane.addEventListener(InteractiveScene3DEvent.OBJECT_OVER, onOverPlane);
//plane.addEventListener(InteractiveScene3DEvent.OBJECT_OUT, onOutPlane);
scene.push(plane);
//plane.container.onRelease = Relegate.create(this, onClickPlane, plane);
}
setEvents();
}

private function setEvents():Void {
//clearInterval(this.interval);
for (var i:Number = 0; i < planes.length; i++) {
var plane: Plane = Plane(planes[i]);
plane.container.onRelease = Relegate.create(this, onClickPlane, plane);
}
//show active plane
var activePlane: Plane = planes[Math.floor(planes.length / 2)];
setPlaneActive(activePlane);
}

private function onClickPlane(e:Plane):Void {
var plane: Plane = Plane(e);
switch (plane.extra.status) {
case "active":
zoomPlane(plane);
break;
case "zoom":
deZoomPlane(plane);
break;
case "normal":
setPlaneActive(plane);
break;
}
}

private function setPlaneActive(pic:Plane):Void {

var id:Number = pic.extra.id;
var top:Number=-50;
var depth:Number;
var i:Number;
var dis:Number = distance / 3;
//tracePos(pic);
//TweenMax.to(pic, .5, { rotationY:0, rotationX:0, rotationY:0, x:0, z: -300, scale:1 } );
Tweener.addTween(pic, { time: time - 0.2, rotationY:0, rotationX:0, rotationY:0, x:0, z: -300, scale:1 } );// , onComplete: tracePos, onCompleteParams: [pic] } );

for (i = id-1; i >=0; i--) {
dis += distance / (id - i);
depth = top + Math.abs(id - i) * 20;
planes[i].extra.status = "normal";
//TweenMax.to(planes[i], .5, { rotationY: -roAngle, x:0 - dis, z:depth } );
Tweener.addTween(planes[i], { time: time , rotationY: -roAngle, x:0 - dis, z:depth} );
}

dis = distance / 3;
i = 0;
for (i = id+1; i dis += distance / (i - id);
depth = top + Math.abs(id - i) * 20;
planes[i].extra.status = "normal";
//TweenMax.to(planes[i], .5, { rotationY:roAngle, x:0 + dis, z:depth } );
Tweener.addTween(planes[i], { time: time, rotationY:roAngle, x:0 + dis, z:depth} );
}
pic.extra.status = "active";
}

private function zoomPlane(pic:Plane):Void {
var o:Number = 0;
//TweenMax.to(pic, .5, { z: -600, rotationY:o } );
Tweener.addTween(pic, { time: .7, z: -650, rotationY:o , transition: TRANSITION_ANI} );
pic.extra.status = "zoom";
}

private function deZoomPlane(pic:Plane):Void {
//TweenMax.to(pic, .5, { z: -300, rotationY:0 } );
Tweener.addTween(pic, { time: time, z: -300, rotationY:0 , transition: TRANSITION_ANI} );
pic.extra.status = "active";
}

private function tracePos(pic:Plane):Void {
trace("===== pic : " + pic.container);
trace("pic x : " + pic.x);
trace("pic y : " + pic.y);
trace("pic z : " + pic.z);
}
}

No comments: