您的位置:首页 > 其它

flash特效原理:螺旋效果 (2)

2010-01-18 15:03 465 查看
经过上面的测试,现在对原先程序进行一些改造可以创建出不错的效果,你会发现每次改动一些参数很多有趣的效果就会出现了。现在我们尝试做一个调节工具对他们的半径,高度,圈数,视角进行创造。这次会主要借助到flash里面 组件包。Slider 组件来帮助我们完成这一次的尝试。



***过程知道:包括Slider 组件的使用,RadioButton 组件使用,旋转rotationY 的使用。

首先创建一下列组件,包括四个Slider组件,初始化设置他们的初始值和初始化参数,通过改变这些值让参数发生更改,这些参数改变会让原本运行的螺旋效果进行改变,组合非常丰富。效果会让人产生很多惊喜。不妨自己动手也创造出一个来测试。













通过去书写这个程序的时候,依旧发现对深度管理的办法总存在一些问题。

如果细心发现 总是觉得存在一定差异,并没有主流flash 3d 引擎出色。这些不足也折射出cs4的功能还需要进行改造。特别在运算的能力上

flash player 依旧需要改进。在未来一些预感当中,对3d引擎概念,粒子引擎,物理引擎的 这些概念 会加入到flash 元素当中。 对创造flash 的内容会变得更加轻松和有趣。你,也可以尝试一下,只要你有这份兴趣。相信自己!心动不如行动,Go on。



代码清单:其中new photo() 对象是通过库链接的出来的。

package 
{
	import flash.display.MovieClip;
	import flash.events.*;
	import flash.geom.PerspectiveProjection;
	import fl.controls.Slider;
	import fl.events.SliderEvent;
	import fl.controls.RadioButton;
	import fl.controls.RadioButtonGroup;

	public class Main extends MovieClip
	{
		private var num:int=50;//一共有多少个螺旋点
		private var numOfRotations:int=3;//圈数
		private var anglePer:Number = ((Math.PI*2) *numOfRotations) / num;
		private var R:int=400;//半径
		private var h:int=0;//高度
		private var contain:MovieClip=new MovieClip();//容器
		private var list:Array=new Array();//用于管理图片的
		private var type:String="rotationY";//选择类型
		public function Main()
		{
			init();
			creat3D();
		}

         //初始化组件和设备  
		private function init():void
		{
			root.transform.perspectiveProjection.fieldOfView=100;//初始化透视角度
			addChild(contain);
			contain.x=stage.stageWidth/2-600;
			contain.y=stage.stageHeight/2-800;
			contain.z=1000;
            
			//调整角度
			var hd_angle:Slider=new Slider();
			hd_angle.name="hd_angle";
			hd_angle.addEventListener(SliderEvent.CHANGE,changeValue);
			addChild(hd_angle);
			hd_angle.move(523,100);
			hd_angle.width=200;
			setSlider(hd_angle,{snap:1,interval:10,min:1,max:20,value:1});
           
		    //调节半径
			var hd_R:Slider=new Slider();
			hd_R.addEventListener(SliderEvent.CHANGE,changeValue);
			hd_R.name="hd_R";
			addChild(hd_R);
			hd_R.move(523,170);
			hd_R.width=200;
			setSlider(hd_R,{snap:1,interval:10,min:1,max:600,value:1});
            
			//调节高度
			var hd_height:Slider=new Slider();
			hd_height.addEventListener(SliderEvent.CHANGE,changeValue);
			hd_height.name="hd_height";
			addChild(hd_height);
			hd_height.move(523,220);
			hd_height.width=200;
			setSlider(hd_height,{snap:1,interval:10,min:1,max:80,value:1});
			
			//调整视角
			var hd_perspective:Slider=new Slider();
			hd_perspective.addEventListener(SliderEvent.CHANGE,changeValue);
			hd_perspective.name="hd_perspective";
			addChild(hd_perspective);
			hd_perspective.move(523,270);
			hd_perspective.width=200;
			setSlider(hd_perspective,{snap:10,interval:10,min:1,max:179,value:100});

			//选择旋转角度
			var ground:RadioButtonGroup=new RadioButtonGroup("rotation");
			var ridio1:RadioButton=new RadioButton();
			var ridio2:RadioButton=new RadioButton();
			addChild(ridio1);
			addChild(ridio2);
			ridio1.move(550,294);
			ridio2.move(650,294);
			ridio1.label="rotationX";
			ridio2.label="rotationY";
			ridio1.value="rotationX";
			ridio2.value="rotationY";
			ridio2.selected=true;
			ground=ridio1.group=ridio2.group;
			ground.addEventListener(MouseEvent.CLICK, clickHandler);
		}
         
		//设置Slider 的属性
		private function setSlider(hslider:Slider,obj:Object):void
		{
			hslider.snapInterval=obj.snap;
			hslider.tickInterval=obj.interval;
			hslider.minimum=obj.min;
			hslider.maximum=obj.max;
			hslider.value=obj.value;
		}

		private function changeValue(event:SliderEvent):void
		{

			switch (event.currentTarget.name)
			{
				case "hd_angle" :
					numOfRotations=event.value;
					trace(numOfRotations);
					h=0;
					anglePer = ((Math.PI*2) *numOfRotations) / num;
					for (var i:int=0; i<list.length; i++)
					{

						list[i].x=Math.cos(anglePer*i)*R;
						list[i].z=Math.sin(anglePer*i)*R;
						list[i].y=h+=30;
						list[i].rotationY = (-i*anglePer) * (180/Math.PI)+90;
					}

					break;

				case "hd_R" :
					R=event.value;
					h=0;
					for (var i:int=0; i<list.length; i++)
					{

						list[i].x=Math.cos(anglePer*i)*R;
						list[i].z=Math.sin(anglePer*i)*R;
						list[i].y=h+=30;
						list[i].rotationY = (-i*anglePer) * (180/Math.PI)+90;
					}

					break;

				case "hd_height" :
					var temp:int=event.value;
					h=0;
					for (var i:int=0; i<list.length; i++)
					{

						list[i].x=Math.cos(anglePer*i)*R;
						list[i].z=Math.sin(anglePer*i)*R;
						list[i].y=h+=temp;
						list[i].rotationY = (-i*anglePer) * (180/Math.PI)+90;
					}

					break;
					
					
					
				case "hd_perspective" :
			    var tempangle:int=event.value;
				root.transform.perspectiveProjection.fieldOfView=tempangle;
					break;
					

			}
		}

         //选择旋转角度
		private function clickHandler(event:MouseEvent):void
		{

			chooseRotationType(event.target.selection.value);

		}
          
        //改变旋转的类型
		private function chooseRotationType(types:String):void
		{

			switch (types)
			{
				case "rotationX" :
					type="rotationX";
					break;

				case "rotationY" :
					type="rotationY";
					break;

			}

		}

		//创建螺旋效果
		private function creat3D():void
		{

			for (var i:int=0; i<num; i++)
			{
				var image:photo=new photo();
				list.push(image);
				contain.addChild(image);
				image.x=Math.cos(anglePer*i)*R;
				image.z=Math.sin(anglePer*i)*R;
				image.y=h+=30;//每一个螺旋点都递增30
				image.rotationY = (-i*anglePer) * (180/Math.PI)+90;//偏移
				image.addEventListener(Event.ENTER_FRAME,Run);
			}
		}

		private function Run(event:Event):void
		{
			if (type=="rotationY")
			{
				contain.rotationY+=0.01;
				contain.rotationX=0;
			}
			else if (type=="rotationX")
			{
				contain.rotationX+=0.01;
				contain.rotationY=0;
			}
			sortZ();
		}

		private function sortZ():void
		{
			list.sortOn("z",Array.DESCENDING|Array.NUMERIC);
			for (var i:int=0; i<list.length; i++)
			{
				var myimage:photo=list[i];
				contain.setChildIndex(myimage,i);

			}

		}

	}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: