flash on 2011-8-25
greensock
flash
pv3d
/**
* Copyright leebig1982 ( http://wonderfl.net/user/leebig1982 )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/zIe9
*/
package {
import flash.text.TextField;
//greensock
import com.greensock.TweenLite;
import com.greensock.easing.*;
// flash
import flash.events.Event;
import flash.events.MouseEvent;
// pv3d
import org.papervision3d.view.BasicView;
import org.papervision3d.materials.WireframeMaterial;
import org.papervision3d.materials.ColorMaterial;
import org.papervision3d.materials.utils.MaterialsList;
import org.papervision3d.objects.primitives.Cube;
import org.papervision3d.view.layer.ViewportLayer;
public class test3D_Cube extends BasicView {
//中央點的xyz
private var centerX:Number = 0;
private var centerY:Number = 0;
private var centerZ:Number = 0;
//半徑
private var radius:Number = 500;
//物件數量
private var itemOfNumber:Number = 6;
//每個物件分配的弧度
private var angleUnit:Number = Math.PI * 2 / itemOfNumber;
// 方體模型陣列
private var CubeModArr:Array;
//方塊模型Layer 名稱陣列
private var CubeLayerArr:Array;
//目前選定的方塊
private var nowIndex:int = 0;
// 建構子
public function test3D_Cube()
{
// 建置3D環境
init3D();
//監聽closeBtn
var closeText:TextField = new TextField();
closeText.text = 'Close';
this.stage.addChild(closeText);
closeText.addEventListener(MouseEvent.CLICK , clickCloseBtn);
}
// 建置3D環境
private function init3D():void
{
// 建立模型(方體)
// 參數1:材質列表
// 參數2:方體寬度
// 參數3:方體深度
// 參數4:方體高度
// 參數5:寬度分隔節數
// 參數6:深度分隔節數
// 參數7:高度分隔節數
CubeModArr = new Array;
CubeLayerArr = new Array;
for ( var i:int = 0 ; i < itemOfNumber ; i ++ ) {
// 建立材質列表
var CubeMatList:MaterialsList = new MaterialsList();
// 將方體六面材質加入材質列表
CubeMatList.addMaterial( new ColorMaterial( Math.random() * 0xffffff ), "front" );
CubeMatList.addMaterial( new ColorMaterial( Math.random() * 0xffffff ), "back" );
CubeMatList.addMaterial( new ColorMaterial( 0x000000 ), "left" );
CubeMatList.addMaterial( new ColorMaterial( 0x000000 ), "right" );
CubeMatList.addMaterial( new ColorMaterial( 0x000000 ), "top" );
CubeMatList.addMaterial( new ColorMaterial( 0x000000 ), "bottom" );
CubeModArr[i] = new Cube( CubeMatList, 200, 20, 400, 5, 5, 1);
//建立可點選的圖層 並設定名稱
CubeLayerArr[i] = CubeModArr[i].createViewportLayer(this.viewport, false);
CubeLayerArr[i].name = String(i);
CubeLayerArr[i].addEventListener(MouseEvent.CLICK , clickHandel);
// 將模型加入3D場景中
this.scene.addChild(CubeModArr[i]);
}
//設定位置
setCubePosision();
// 開始渲染
this.startRendering();
}
//設定位置
private function setCubePosision():void {
var i:int;
var tmpAdd:int = 0;
for ( i = nowIndex ; i < itemOfNumber ; i ++ ) {
//設定方塊新座標
setCubeXY( CubeModArr[i] , tmpAdd );
tmpAdd ++;
}
if ( nowIndex > 0 ) {
for ( i = 0 ; i < nowIndex ; i ++ ) {
//設定方塊新座標
setCubeXY( CubeModArr[i] , tmpAdd );
tmpAdd ++;
}
}
}
//設定方塊新座標
private function setCubeXY( inCube:Cube , add:int ):void {
var addAngle:Number = angleUnit * add ;
//算出弧度
var angle:Number = Math.PI - addAngle;
//新的x跟z
var newX:Number = centerX + Math.sin(angle) * radius;
var newZ:Number = centerZ + Math.cos(angle) * radius;
//算出Y軸翻轉的角度
var Yrel:Number = addAngle * 180 / Math.PI;
if ( Yrel == 0) {
Yrel = 180;
/*
//判斷原始角度 如果>0 表示按了右邊
if ( inCube.rotationY >= 0 ) {
Yrel = 180;
}else {
Yrel = -180;
}
*/
}else {
if( Yrel >= 180){
Yrel = Yrel - 360;
}
}
//用tween動畫把方塊移過去
TweenLite.to(inCube, 1, {x:newX, z:newZ , rotationY:Yrel , ease:Expo.easeIn});
}
//滑鼠click
private function clickHandel(evt:MouseEvent):void {
if ( nowIndex == int(evt.target.name)) {//如果案了目前選的 進行動畫放大
doTweenMovie();
}else{
//設定目前選的方塊int
nowIndex = int(evt.target.name);
//移動方塊位置
setCubePosision();
}
}
//進行方塊翻轉 以及放大
private function doTweenMovie():void {
var tmpCube:Cube = CubeModArr[nowIndex] ;
//第一段動畫結束
var tmpFunA:Function = function ():void {
trace('第一段動畫結束');
tmpFunB();
};
var tmpFunB:Function = function ():void {
//第2段動畫
TweenLite.to( tmpCube, 1, { z:-1000 , rotationX:0 , rotationY:180 , rotationZ:0 });
};
//第一段動畫
TweenLite.to( tmpCube, 0.5, { scaleX:1.2, scaleY:1.2,scaleZ:1.2, rotationX:70 , rotationY:20 , rotationZ:100 ,onComplete:tmpFunA });
}
//按下closeBtn
private function clickCloseBtn( evt:MouseEvent):void {
var tmpCube:Cube = CubeModArr[nowIndex] ;
//第一段動畫結束
var tmpFunA:Function = function ():void {
trace('第一段動畫結束');
tmpFunB();
};
var tmpFunB:Function = function ():void {
//第2段動畫
TweenLite.to( tmpCube, 0.5, { scaleX:1, scaleY:1, scaleZ:1, rotationX:0 , rotationY:0 , rotationZ:0 ,onComplete:setCubePosision} );
};
//第一段動畫
TweenLite.to( tmpCube, 0.7, { z:-600 ,rotationX:-50 , rotationY:100 , rotationZ:-30 ,onComplete:tmpFunA });
}
}
}