淡入和淡出Word下载.docx
《淡入和淡出Word下载.docx》由会员分享,可在线阅读,更多相关《淡入和淡出Word下载.docx(8页珍藏版)》请在冰豆网上搜索。
根据本模型,假设变化速率为0.05时,则每个时间周期,对象的透明度增加0.05。
如果对象的初始透明度是0,对象在动画开始的时候完全不可见,则经历1个时间周期后,对象的alpha变为0.05;
经历2个时间周期后,对象的alpha变为0.10;
经历3个时间周期后,对象的alpha变为0.15……当经历20个时间周期后,对象的alpha变为1.00,此时对象完全不透明显示。
换而言之,这一过程就是动画对象在20个时间周期内从不可见逐渐切入到完全显示状态,实现了对象的淡入。
同理,淡出效果也可以使用此模型,不过变化速率是一个负值。
假设变化速率为-0.05,则每个时间周期,对象的透明度减少0.05。
对于一个初始alpha属性为1的对象,为当经历20个时间周期后,其alpha值变为0.00,此时对象完全透明不可见。
这一过程实现了动画对象由完全显示到完全消失的渐变效果,是为淡出。
8.4.2
脚本实现
考虑到淡入和淡出效果都是基于同样的数学模型,可以在代码实现时运用函数将其过程模块化。
(1)建立参数fadeInOut(),该函数不需要返回值,但显然需要参数,分别是对象anim_obj,以及对象的变化速率fade_rate。
代码如下。
functionfadeInOut(anim_obj:
DisplayObject,fade_rate:
Number):
void{
return;
}
(2)在函数内添加代码,以根据变化速率fade_rate控制动画对象anim_obj的alpha属性。
本函数将来是在定时器的触发响应函数中周期调用的,所以每一次执行时,只需要修改1*fade_rate到anim_obj.alpha即可。
只需要一条语句就能达到目的。
anim_obj.alpha+=fade_rate;
(3)将此函数添加到例8-4中,修改定时器响应函数,注释掉原有的语句,新添加对fadeInOut()的引用。
整体代码如下:
varanimTimer:
Timer=newTimer(50,100);
animTimer.addEventListener("
timer"
,animTimerHandler);
timerComplete"
,animComplete);
animTimer.start();
functionanimTimerHandler(event:
TimerEvent):
void{
//动画代码编写入口
//animObject1.alpha=(animObject1.alpha==1?
0:
1);
fadeInOut(animObject1,-0.05)//新增对fadeInOut()函数的引用
}
//响应定时器结束事件
functionanimComplete(event:
animObject1.alpha=1;
//自定义的模块
(4)至此,代码初步成型了。
运行程序,可以看到显示对象animObject1逐渐淡出的效果。
如果把fadeInOut函数中的fade_rate设为正值,这可以令alpha初始状态为0的不可见对象逐渐淡入。
fade_rate的绝对值越小,淡入淡出的过程就越平滑,读者可自行实验。
使用如此简短的代码,便能实现淡入淡出效果,可见AS3确实是很简便的动画控制语言。
下一节将介绍如何进一步强化模块,使其能胜任更多的任务。
8.4.3
模块的封装
上节编写的模块虽然能实现简单的淡入淡出功能,但是在代码设计上并不符合OOP模块的封装规范,存在许多问题:
1.不利于OOP封装
直接在模块内部操作对象属性,不利于OOP封装。
作为通用模块,完全可以适用于对象各种属性的相类似轨迹的运算,而不是仅仅局限于操作alpha属性,例如:
显示对象的红色通道逐渐淡出淡入等。
然而,如果在内部操作对象alpha属性,使得此模块的功能固化了,在其他场合下不可利用。
此外,有时情况需要对运算后的数值稍作修正再传递给舞台对象,上节所写的模块无法提供这种灵活性,在实际开发中应尽量避免这样不符合规范的模块出现,如图8-14所示。
图8-14
不符合规范的模块封装
2.无数值检查
算术运算直接赋值给对象,没有数值检查。
这种习惯是危险的。
如果超出了被赋值变量的允许范围,在一些情况下会出现难以预期的错误。
作为程序员,应自觉养成良好的习惯,在代码中对数值进行检查。
3.缺少注释和模块说明
当团队共享和日后维护时,缺少注释和说明的代码将造成许多麻烦。
实践证明:
编写脚本代码时不写注释说明,无益于加快开发进度。
插入注释和说明实属举手之劳,应当时时自觉为之。
8.4.4
淡入淡出模块
基于以上原因,需要对此模块改写。
functionfadeInOut(obj_attr:
Number,change_rate:
Number,max_value:
Number=1):
Number{
vartemp_attr:
temp_attr=obj_attr+change_rate;
returntemp_attr;
在改写后的代码中,参数obj_attr取代了anim_obj,其意义不再是显示对象本身,而是显示对象的某项属性。
在模块内部,也并不对此属性进行操作,而是新建了一个变量temp_attr,其值根据传入参数运算得到。
在模块的返回值中,将变量temp_attr的值传递到外部,供调用代码处理。
对于模块,输入和输出都是纯数据,模块执行本职的运算任务,并不修改对象(如图8-15所示)。
这种写法就良好地体现了OOP的模块封装精神。
图8-15
符合要求的模块封装
除此之外,新的模组具备了一个返回值。
应该认真界定此返回值的取值范围。
对于本例,简易取值是0到1的Number类型,这样,即使是那些取值在0到255之间的颜色通道,也可以很轻松地通过255*fadeInOut()方式获得可用值。
因此,添加相应的数值检查语句如下。
Number,max_value:
temp_attr=temp_attr/max_value;
if(temp_attr<
=0){
temp_attr=0;
if(temp_attr>
=1){
temp_attr=1;
}
相比上节中只包含一条语句的模块,此处的代码量确实增加了不少。
可只要养成了习惯,书写这样的代码是很迅速的,并不会拖延开发的进度。
当然,补上注释和说明也是必要的。
//说明:
fadeInOut()实现线性轨迹的淡入淡出计算。
//参数:
obj_attr为对象属性;
change-rate为变化速率,正为淡入,反之淡出;
max_value为对象属性取值范围。
//返回值:
计算后的属性值,从0到1之间的小数。
//functionfadeInOut(obj_attr:
Number{}
//版本1.0
改写后的模块更加适合OOP开发,也便于扩展和封装进自定义方法内,在稍后的开发中持续发挥作用。
随着各种模块越来越多,功能越来越强,形成各种强大的类。
海纳百川,最终实现开发的整体进化,完成开发任务,这就是AS3的OOP开发过程。
8.4.5
渐变闪动
当显示对象在完全显示和完全消失之间切换,形成了闪动效果。
当闪动两种极限状态之间存在过渡状态,则形成了渐变效果。
当显示对象从完全显示淡出,直至完全消失,然后又从完全消失状态淡入,回复到完全显示,如是周而复始,就形成了交迭渐变闪动(如图8-16所示)。
图8-16
线性淡出渐变和交迭渐变闪动
使用现有模块,在例8-4中实现交迭渐变闪动是非常容易的。
(1)为了控制轨迹的走向,需要先声明一个新的变量fadeStep。
并在“fadeInOut()”函数中,同animObject1.alpha一起作为参数传递。
varfadeStep:
……
animObject1.alpha=fadeInOut(animObject1.alpha,fadeStep);
(2)当fadeStep为-0.05时,对象animObject1将会淡出;
判断animObject1.alpha的值,在对象消失后,重设fadeStep为0.05,则对象animObject1将会淡入,直至animObject1.alpha==1,判断并再次将fadeStep设为-0.05,即完成了一个交迭渐变闪动的周期。
if(animObject1.alpha==1){
fadeStep=-0.05
if(animObject1.alpha==0){
fadeStep=0.05
(3)考虑到变量的作用域,需要在定时器开始之前声明fadeStep全局变量,并为其赋予初始值。
这样,在定时器触发响应函数中,fadeStep的值可以保持稳定。
如果将fadeStep声明在了定时器触发响应函数中,则默认作为一个局部变量,每次执行都会被创建和删除,就无法起到应有的作用了。
如果一定要使用在定时器触发响应函数中声明的变量,则必须增加更多的验证代码,读者可自行尝试。
完整代码段如下。
Number=0.05;
//动画代码编写入口
if(animObject1.alpha==1){
fadeStep=-0.05;
if(animObject1.alpha==0){
fadeStep=0.05;
animObject1.alpha=fadeInOut(animObject1.alpha,fadeStep);
animObject1.alpha=1;
Number{
temp_attr=temp_attr/max_value;
if(temp_attr<
=0){
if(temp_attr>
=1){
千里之行,始于足下。
深刻理解和掌握功能程序模块的写法,打好基础,步步为营,日后开发具有万行代码规模的项目也并非遥不可及的事。
(4)运行程序,可以看到对象animObject1在舞台上交迭淡入淡出,相当平滑完美。
其周期轨迹如图8-17所示。
图8-17
线性交迭渐变闪动轨迹
8.4.6
透明度渐变
以交迭渐变闪动为代表的透明度渐变,是一种常用的动画效果。
不仅可以直接使用该效果表现夜空繁星和烛光的闪烁,也可同其他显示对象灵活组合出各种变化。
很多令人印象深刻的视觉特效,往往是灵活运用透明度渐变的结果。
例如,可以灵活使用透明度渐变调整对象的颜色,也许听起来不太可能,但不仅可行,而且相当简单。
当一个红色显示对象覆盖在蓝色显示对象上时,对红色对象应用交迭渐变闪动,最终效果是蓝色对象在蓝色和红色之间交叠渐变,实现了颜色的调整,如图8-18所示。
与直接修改蓝色对象的颜色相比,此法在代码编写时更加直观。
由于现代计算机处理器对透明度运算的硬件优势,采用这种机制生成的颜色过渡动画,在执行效率上还要更高一些。
特别是对高分辨率的舞台显示,其优势更加明显。
图8-18
利用透明度交迭渐变更改颜色