2009年2月14日

code test

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