现在的位置: 首页 > 综合 > 正文

PV3D_Effect6 PaperWorld特效

2013年09月06日 ⁄ 综合 ⁄ 共 6778字 ⁄ 字号 评论关闭


以下是PV3D_Effect6 PaperWorld的源码:

package {
	import flash.display.*;
	import flash.events.*;
	import flash.utils.*;
	import flash.geom.Matrix;
	import flash.geom.Rectangle;
	import flash.geom.Point;
	import flash.system.System;
	import ImageLoader;
	import ImageZoom;
	import org.papervision3d.scenes.Scene3D;
	import org.papervision3d.cameras.Camera3D;
	import org.papervision3d.view.Viewport3D;
	import org.papervision3d.render.BasicRenderEngine;
	import org.papervision3d.objects.DisplayObject3D;
	import org.papervision3d.objects.primitives.Plane;
	import org.papervision3d.materials.BitmapMaterial;
	import com.greensock.*;
	import com.greensock.easing.*;
	[SWF(width="700",height="480",frameRate="25")]
	
	/**
	 * ...
	 * @author .....Li灬Star 
     * @contact...QQ:168527720 
     */
	
    public class PV3D_Effect6 extends MovieClip {
		private var pic_str:Array=new Array();
		private var Speed:Number=3;
		private var imageloader:ImageLoader;
		private var loadimage:Bitmap;
		private var myZoom:ImageZoom;
        //------------------>建立3D的四大要素
		private var scene:Scene3D;
		private var camera:Camera3D;
		private var viewport:Viewport3D;
		private var renderer:BasicRenderEngine;
		//-------------------------------------->
		private var wrap:DisplayObject3D;
		private var planeVO:Plane;
		private var bmpdataArr:Array;
		private var bmpdataArrCopy:Array;
		private var planesArr:Array;
		private var planeVOs:Array;
		private var planeNames:Array;
		private var objs:Array;
		static private const MAX_CELL_W:uint=10;
		static private const MAX_CELL_H:uint=5;
		static private const DISTANCE:Number=500;
		private var theta:Number=0;
		private var maxWidth:Number=700;
		private var maxHeight:Number=450;
		private var rot:Number=0;
		private var _rotateAngle:Number=0;
		
		public function PV3D_Effect6():void {
			initmc();
		}

		public function initmc() {
			setPV3D();

			if (imageloader==null) {
				pic_str=[{src:"img/1.jpg"}];
				imageloader=new ImageLoader(pic_str);
				imageloader.addEventListener("ALLCOMPLETE",AllComplete);//全部加载完成事件
			} else {
				setObject3D();
			}
		}

		private function setPV3D():void {
			scene = new Scene3D();
			camera = new Camera3D();
			viewport=new Viewport3D(864,480,true,false);
			renderer = new  BasicRenderEngine();
			this.addChild(viewport);
		}

		private function AllComplete(e:Event):void {
			setObject3D();
		}

		private function setObject3D():void {
			camera.z=-5000;
			camera.focus=500;
			camera.zoom=1;
			camera.target=DisplayObject3D.ZERO;
			trace("imageloader.loaderArr.length:"+imageloader.loaderArr.length);
			for (var u:uint=0; u<imageloader.loaderArr.length; u++) {
				loadimage=imageloader.loaderArr[u] as Bitmap;
			}

			myZoom=new ImageZoom(loadimage.width,loadimage.height,maxWidth,maxHeight);
			wrap = scene.addChild(new DisplayObject3D());
			
			bmpdataArr=[];
			bmpdataArrCopy=[];
			//用copyPixels方法分割图片
			var splittedWidth:Number=loadimage.width/MAX_CELL_W;
			var splittedHeight:Number=loadimage.height/MAX_CELL_H;
			var point:Point = new Point(0,0);
			for (var i:int=0; i<MAX_CELL_W;i++) {
				for (var j:int=0; j<MAX_CELL_H; j++) {
					var bmpData:BitmapData=new BitmapData(splittedWidth,splittedHeight,false,0xFF000000);
					bmpData.copyPixels(loadimage.bitmapData,new Rectangle(splittedWidth * i,splittedHeight * j,splittedWidth,splittedHeight),point);
					var bitmap:Bitmap=new Bitmap(bmpData);
					bitmap.width=myZoom.width()/MAX_CELL_W;
					bitmap.height=myZoom.height()/MAX_CELL_H;
					bmpdataArr.push(bitmap.bitmapData);
					bmpdataArrCopy.push(bitmap.bitmapData);
				}
			}
			
			//记录分割后的每张图片的原始坐标,后面根据这个坐标数组来合拢图片
			planesArr=[];
			planeVOs=[];
			objs=[];
			for (var s:int = 0; s < MAX_CELL_W; s++) {
				//planeArr[i] = [];
				for (var t:int = MAX_CELL_H; t > 0; t--) {
					var material:BitmapMaterial=new BitmapMaterial(BitmapData(bmpdataArr.shift()));
					material.doubleSided=true;
					var plane:Plane=new Plane(material,myZoom.width()/MAX_CELL_W,myZoom.height()/MAX_CELL_H,1,1);
					plane.x=myZoom.width()/MAX_CELL_W * s;
					plane.y=myZoom.height()/MAX_CELL_H * t;
					plane.z=0;
					plane.rotationX=0;
					plane.rotationY=0;
					plane.rotationZ=0;
					//------------object数组记录原始坐标
					var obj:Object = new Object();
					obj.x=plane.x;
					obj.y=plane.y;
					obj.z=plane.z;
					obj.rotationX=plane.rotationX;
					obj.rotationY=plane.rotationY;
					obj.rotationZ=plane.rotationZ;
					objs.push(obj);

					planeVO=plane;
					planeVO.x=0;
					planeVO.y=0;
					planeVO.z=0;
					planeVO.alpha=0;
					planeVO.useOwnContainer=true; //useOwnContainer这个属性设为true,才能对plane做alpha的调整
					planeVOs.push(planeVO);
					wrap.addChild(planeVO);
				}
			}
            
			//------------------------->给分割后的每张图片加上name,相当于mc.name
			planeNames=[];
			for (var h:int=0; h<planeVOs.length; h++) {
				planeVOs[h].name="plane"+h;
				planeVOs[h].extra={id:h};
				//trace(planeVOs[i].name);
				planeNames.push(planeVOs[h].name);
			}
            //---------------------------->随机打乱图片位置,形成3D立体效果
			for (var k:int=0; k<planeVOs.length; k++) {
				TweenMax.to(planeVOs[k],Speed/2,{
				      x:Math.random() * maxWidth - maxWidth/2,
				      y:Math.random() * maxHeight - maxHeight/2,
				      z:Math.random() * 2000 - 1000,
				      rotationX:Math.random() * 360, 
				      rotationY:Math.random() * 360, 
				      rotationZ:Math.random() * 360,
				      alpha:1,
				      scale:1,
				      delay:0.04 * k,
				      ease:Cubic.easeOut
				  });
			}

			TweenMax.delayedCall(2.5*Speed,startZoom);

			addEventListener(Event.ENTER_FRAME,onEventRender3D);
			addEventListener(Event.ENTER_FRAME,loop);
		}
        //--------------------------->合拢图片
		private function startZoom():void {
			removeEventListener(Event.ENTER_FRAME,loop);
			for (var i:int=0; i<planeVOs.length; i++) {
				TweenMax.to(planeVOs[i],Speed*1.5,{
				  x:objs[i].x,
				  y:objs[i].y,
				  z:objs[i].z,
				  rotationX:objs[i].rotationX,
				  rotationY:objs[i].rotationY,
				  rotationZ:objs[i].rotationZ,
				  alpha:1,
				  scale:1,
				  delay:0.05*i,
				  ease:Cubic.easeOut});
			}
			TweenMax.to(camera,Speed*1.5,{
						x:0,
						y:0,
						z:-1000,
						focus:100,
						zoom:10,
						ease:Quad.easeOut,
						onUpdate:onUpdateHundler});
			
			TweenMax.to(wrap,Speed*1.5,{
						x:-myZoom.width()/2+40,
						y:-myZoom.height()/2-45,
						z:0,ease:Quad.easeOut,
						onComplete:disappearEffect})
		}

		private function onUpdateHundler():void {
			camera.lookAt(DisplayObject3D.ZERO);
			renderer.renderScene(scene, camera, viewport);
		}
        
		private function disappearEffect():void {
			for (var i:int=0; i<planeVOs.length; i++) {
				TweenMax.to(planeVOs[i],Speed*1.5,{
				   x:myZoom.width()/2-40,
				   y:myZoom.height()/2+45,
				   z:0,
				   rotationX:Math.random() * 360,
				   rotationY:Math.random() * 360,
				   rotationZ:Math.random() * 360,
				   delay:Speed,
				   alpha:0,
				   ease:Back.easeOut
			    });
			}
			
			TweenMax.delayedCall(1.7*Speed,End);
		}
        
		//--------------------------->三角函数控制camera
		private function loop(e:Event):void {
			camera.x=DISTANCE*Math.sin(theta*Math.PI/180);
			camera.y=DISTANCE*Math.cos(theta*Math.PI/180);
			camera.z=DISTANCE*2*Math.cos(theta*Math.PI/180);
			theta+=1;
		}
        //-------------------------->PV3D里面无限渲染,没有渲染就没有3D世界
		private function onEventRender3D(e:Event) {
			renderer.renderScene(scene, camera, viewport);
		}

		public function End():void {
            //-------------------->释放内存
			removeEventListener(Event.ENTER_FRAME, onEventRender3D);
			TweenMax.killAll();
			for(var i:uint=0;i<planeNames.length;i++){
				wrap.removeChildByName(planeNames[i]);
				planeVOs[i].material.destroy();
				planeVOs[i]=null;
			}
			
			for(var j:int=0;j<bmpdataArrCopy.length;j++){
				bmpdataArrCopy[j].dispose();
				bmpdataArrCopy[j]=null;
				
			}
			bmpdataArrCopy=[];
			planeVOs=[];
			theta=0;
			scene.removeChild(wrap);
			this.removeChild(viewport);
			//----------------------->
			imageloader.removeEventListener("ALLCOMPLETE",AllComplete);
			for(var k:int=0;k<imageloader.loaderArr.length;k++){
				imageloader.loaderArr[k].bitmapData.dispose();
				imageloader.loaderArr[k].bitmapData=null;
				imageloader.loaderArr[k]=null;
			}
			imageloader.loaderArr=[];
			imageloader=null;
			System.gc();
		}
	}
}

抱歉!评论已关闭.