package
{
import flash.display.DisplayObject;
import flash.display.Sprite;
import flash.events.Event;
import flash.filters.DropShadowFilter;
import gs.easing.Cubic;
import gs.TweenMax;
import org.papervision3d.materials.ColorMaterial;
import org.papervision3d.materials.MovieMaterial;
import org.papervision3d.materials.utils.MaterialsList;
import org.papervision3d.objects.DisplayObject3D;
import org.papervision3d.objects.primitives.Cube;
import org.papervision3d.view.BasicView;
public class CubeTransition extends Sprite {
private var _displayObjectArray :Array = new Array();
private var _currentDisplayObject :DisplayObject = null;
private var view :BasicView;
private var cube :Cube = null;
private var isRolling:Boolean = false;
public var displayWidth:int = 800;
public var displayHeight:int = 340;
public function CubeTransition(pWidth:int,pHeight:int) {
view = new BasicView(pWidth, pHeight, false, false);
view.camera.zoom = 10;
view.camera.focus = 100;
super.addChild(view);
init3DObject();
}
private function init3DObject():void {
rootNode = new DisplayObject3D();
view.scene.addChild(rootNode);
}
override public function addChild(child:DisplayObject):DisplayObject {
_displayObjectArray.push(child);
child.visible = false;
child.x = view.viewport.viewportWidth / 2 - displayWidth / 2;
child.y = view.viewport.viewportHeight / 2 - displayHeight/2;
return super.addChild(child);
}
private function startEffect(pID:uint):void {
if (isRolling) {
return;
}
if (_currentDisplayObject == null) {
_currentDisplayObject = _displayObjectArray[pID];
_currentDisplayObject.visible = true;
return;
}
var _targetClip:DisplayObject = _displayObjectArray[pID];
if (_currentDisplayObject == _targetClip || _targetClip == null) {
return;
}
var _currentMovieMat:MovieMaterial = new MovieMaterial(_currentDisplayObject, false, false, false);
var _TargetMovieMat :MovieMaterial = new MovieMaterial(_targetClip, false, false, false);
var _colotMat :ColorMaterial = new ColorMaterial();
var _ml :MaterialsList = new MaterialsList(
{
front : _colotMat,
right : _TargetMovieMat,
back : _currentMovieMat,
left : _colotMat,
bottom : _colotMat,
top : _colotMat
} );
_currentDisplayObject.visible = false;
_currentDisplayObject = _targetClip;
if (cube != null) view.scene.removeChild(cube)
cube = new Cube(_ml, displayWidth,displayWidth, displayHeight, 10, 10, 5);
//object3D.z = view.camera.focus * view.camera.zoom - Math.abs(view.camera.z);
//PV3D物件 100% 寬、高出現的公式。
cube.z = view.camera.focus * view.camera.zoom - Math.abs(view.camera.z) + displayWidth / 2;
//因為是Cube, 所以還要加上寬度的一半。
view.scene.addChild(cube);
startTransition();
}
private function startTransition():void {
view.startRendering();
//view開始運算。
isRolling = true;
TweenMax.to(view, .4,
{
dropShadowFilter: { color:0x000000, alpha:0.5, blurX:60, blurY:60, strength:1, angle:120, distance:30 }
} );
TweenMax.to(view, .3,
{
delay:.41,
dropShadowFilter: { color:0x000000, alpha:0.5, blurX:60, blurY:60, strength:0, angle:120, distance:30 }
} );
TweenMax.to(cube, .7, {
rotationY : 90,
ease : Cubic.easeOut,
onComplete : tweenCompleteHandler
} );
}
public function set viewStackAt(pID:uint):void {
startEffect(pID);
}
private function tweenCompleteHandler():void {
//Tween完成時, 移除Cube。
isRolling = false;
view.scene.removeChild(cube)
cube = null;
//view.stopRendering();
_currentDisplayObject.visible = true;
//讓目標的可視物件出現。
this.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
//晚個一fps再把view的運算函式取消掉。
}
private function enterFrameHandler(e:Event):void {
this.removeEventListener(Event.ENTER_FRAME, enterFrameHandler);
view.stopRendering();
}
}
}
demo