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