flash actionScript3 3维旋转效果代码
用flash的actionScript3.0做一个圆圈状循环特效,主要是逻辑算法问题。收先看下面的效果:
定义场景宽度
var s_w:Number = 400;//定义场景stage 宽度
逻辑分析:
要看到下面的效果,首先看水平轴x的位移。
x轴的位移为 x基础位移(环绕的原点的x轴)+旋转半径*偏移参数(-1到1);
定义基础位移
var b_x:Number= 220;//定义基础位置x
var b_p_x:Number = 200;//定义基础偏移量
再看 竖轴y的位移。
y轴的位移为 y的基础位移(环绕的原点的y轴)+上下偏移半径*偏移参数(-1到1);
var b_y:Number = 200;//定义基础位置y
var b_p_y:Number = 30;//定义基础偏移量
运行逻辑:设置整个动画为1帧,处于播放状态。
关键逻辑:如何确定移动速度和偏移参数,这就涉及到算法问题。
1.首先看移动速度,根据鼠标在舞台的中间偏移量来计算。左边为负,右边为正。
var t_n:Number = 0;//定义的临时变量t_n 用来时刻鼠标位移差
t_n += (stage.mouseX-stage.stageWidth/2)/s_w;//该数值可正可负
2.偏移参数如何计算FORASP.cn
根据sin 和cos值,sin和cos是从0-1重复的,角度变量从0->正负无穷,则定义每一个对象的偏移量参数为s_in和c_os。
分析,设sin值用来计算x位移,则cos则计算y位移,因为,当x为0时,y为-1 或者-1,即,当对象在最中间时,对象应该离我们中间距离,也就是离我们最近。
分析,设sin值用来计算x位移,则cos则计算y位移,因为,当x为1时,y为0,即,当对象在最中间时,对象应该离我们偏左最大偏移
分析,设sin值用来计算x位移,则cos则计算y位移,因为,当x为1时,y为0,即,当对象在最中间时,对象应该离我们偏右最大偏移
那么 通过t_n来时刻对鼠标偏移进行相加,当偏移过大,则t_n变化大,反之则小。
3.获取计算偏移参数
因为每个图像不能重复,则要平均分不到圆环中,则将360度分配给n个对象位置,则每个为360/n;即单位偏移量
假设为n=6则第一个为60 第二个为120 ... 网站制作学习网,froasp.cn原创
obj.range = (t_n+单位位置偏移量)*Math.PI*2/360;//然后每个的偏移t_n+单位位置偏移量,则为整体偏移半径 *PI *2 /360则为该圆圈的弧度。
obj.s_in = Math.sin(obj.range);//对每个对象进行弧度的sin计算,不管弧度多大或者多小sin后均在 -1 至1中徘徊
obj.c_os = Math.cos(obj.range);//对每个对象进行弧度的cos计算
4,设置位置,以及显示大小,透明度
obj.x = b_p_x * obj.s_in + b_x;//获取水平位置,则为sin*基础偏移量+ 基础位置
obj.y = (b_p_y + 60 )* obj.c_os+b_y;//同上
obj.alpha = obj.c_os<0.5?0.5:obj.c_os;//当透明度小于0.5时,则让其等于0.5
obj.scaleX = obj.c_os+1;//对对象大小改变,当远离我们的时刻cos为-1,sin为0,此时最小
obj.scaleY = obj.c_os+1;//同上www.forasp.cn本站原创
总体代码如下,其他都不解释了
var b_p_x:Number = 200;//定义基础偏移量
var b_p_y:Number = 30;//定义基础偏移量
var b_x:Number= 220;//定义基础位置x
var b_y:Number = 200;//定义基础位置y
var s_w:Number = 400;//定义场景stage 宽度
var t_n:Number = 0;//temp_num 用来判断sin的百分之
var $num:Number = 6;
for (var i:uint=1; i<=$num; $i++) {
this["obj"+i].s = $i;
this["obj"+i].da = 60*$i;
this["obj"+i].buttonMode=true;
this["obj" + $i].addEventListener(Event.ENTER_FRAME,P);
}
function P(me:Event):void{
t_n += (stage.mouseX-stage.stageWidth/2)/s_w;
var obj = me.target;
obj.range = (t_n+obj.da)*Math.PI*2/360;
obj.s_in = Math.sin(obj.range);
obj.c_os = Math.cos(obj.range);
obj.x = b_p_x * obj.s_in + b_x;
obj.y = (b_p_y + 60 )* obj.c_os+b_y;
obj.alpha = obj.c_os<0.5?0.5:obj.c_os;
obj.scaleX = obj.c_os+1;
obj.scaleY = obj.c_os+1;
this.setChildIndex(obj,(obj.c_os+1)*3);
}