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