[原创]
问题的提出:
DIRECTOR做动画有一个问题,动画的快慢受制于帧速率,如果设置TEMPO=1,所谓的动画将不堪设想!或许我们不会设置这样底的速率,但是如果目标机器运行速度非常慢,那么我们看到的动画也将是非常的慢,失去原有的状态!这一点,我想在flash里面也有这种情况!关于这个问题,国外有一篇文章也探讨过(http://www.director-online.com/buildArticle.php?id=1153),但是他的这个代码在我的机器上测试也不能很好的运作(我测试时是将TEMPO设置为1)。如何创建一个不受tempo速率限制的动画呢?
解决之道是,运用director中的定时器对象。用TIMEOUT而不用THE MILLISECONDS。
下面我用一个简单的实例来探讨这个问题。
一、the milliseconds 的局限
the milliseconds 只是一个系统变量,它不能直接激发一个动作,必须要通过某种机制来达到触发某个动作的目的。常用的就是在exitframe 或 prepareframe 句柄中获取它,通过比较,看是否超时,如果超时则调用某个句柄。典型的代码是:
property _timestart,_timelap(假定已经初始化)
on exitframe me
if the milliseconds - _timestart > _timelap then dosomething
exit
end
很明显,这种时间比较检测受到TEMPO的限制,如果TEMPO偏低,将会起不到预定的效果。
解决问题的方法之一是在 idle句柄里检测:
on idle
if the milliseconds - _timestart > _timelap then dosomething
exit
end
但idle是全局句柄,不方便在behavior中使用,另外,在idle里如果有大量处理代码,将加重系统负担,影响dir的运行效率。
所以用the milliseconds 并不是一个非常好的选择。
二、定时器对象TIMEOUT简介
在director mx 2004的文档里面是这样说的:“A timeout object is a script object that acts like a timer and sends a message when the timer expires。”翻译过来即,timeout 对象是一个脚本定时器对象,当设定的时间间隔过后就会发送一个消息(也可以调用一段程序),以设定的频率调用句柄。
在Movie Script 中使用timeout:
-----------------以下代码都在一个movie script中
on create_a_timer
new timeout("timename",100,#timerhandle)
end
on timerhandle
put "timername timer is on"
end
--如果要删除定时器,则要调用对象的forget()方法,如timeout("timename").forget()
如果要调用另外一个behavior script中的某个handle则要在new中加入一个参数指向这个behavior script的对象。例如:
on create_a_timer
p=script("behavior").new()
new timeout("timename",100,#timerhandle,p)
end
则定时器就会调用名为behavior的行为脚本中的timerhandle句柄。
了解至此,就可以很好地利用定时器对象构建动画了。
-----------------------------------------------
三、运用面向对象技术封装定时器对象动作
我们可以用面向对象的技术封装动画效果,然后用一个行为进行控制。
后面的实例动画就是用一个父脚本封装了Fade效果,可以淡入,可以淡出,还可以循环但如淡出,当然可以无限扩充。以下是代码:
property _blendstart,_blendend,_blendstep
property _On
property _spritenum
property TimerName
property _blendDir
on new me,_n
TimerIndex=0
_spritenum=_n
return me
end
on SayHello me,What
put What && "sprite" && _spritenum
end
on Blend_FadeIn
if _On=false then exit
if sprite(_spriteNum).blend=_blendEnd then
-- if _movie<>0 then timeout(TimerIndex).forget()
timeout(Timername).forget()
exit
end if
-- put _on
-----------------------------------------------
_blend=sprite(_spriteNum).blend
_blend=_blend+_blendStep
if _blend>_blendEnd then _blend=_blendEnd
sprite(_spriteNum).Blend=_blend
updatestage
-- put "Fade"
end
on Blend_FadeOut
if _On=false then exit
if sprite(_spriteNum).blend=_blendend then
-- if TimerIndex<>0 then timeout(TimerIndex).forget()
timeout(Timername).forget()
put "blendfadeout"
exit
end if
-- put _on
-----------------------------------------------
_blend=sprite(_spriteNum).blend
_blend=_blend-_blendStep
if _blend<_blendEnd then _blend=_blendEnd
sprite(_spriteNum).Blend=_blend
updatestage
end
on Blend_FadeCycle
if _On=false then exit
-------------------------
--第一个方向
_blend=sprite(_spriteNum).blend
-- put _blendDir
_blend=_blend+ _blendDir * _blendStep
-- put _blend
if _blendDir = 1 then
if _blend>max(_blendStart,_blendEnd) then
_blend=max(_blendStart,_blendEnd)
_blendDir=-1
end if
else
if _blend<min(_blendEnd,_blendStart) then
_blend=min(_blendEnd,_blendStart)
_blendDir=1
end if
end if
sprite(_spriteNum).blend=_blend
updatestage
end
------------------------------------------------------------------------------
------------------------------------------------------------------------------
on SetFade me,FadeStyle,_TimerName,Timerlap,blendstart,blendend,Blendstep,_bOn
_blendstart=blendstart
_blendend=blendend
_blendstep=Blendstep
_On=_bOn
TimerName=_TimerName
if _blendStart>_blendEnd then
_blendDir=-1
else
_blendDir=1
end if
sprite(_spriteNum).blend=_blendStart
case FadeStyle of
1:-------------------------FadeIn
t=new timeout(TimerName,TimerLap,#Blend_FadeIn,me)
TimerIndex=_movie.timeoutlist.count
2:-------------------------FadeOut
t=new timeout(TimerName,TimerLap,#Blend_FadeOut,me)
TimerIndex=_movie.timeoutlist.count
3:-------------------------FadeCycle
t=new timeout(TimerName,TimerLap,#Blend_FadeCycle,me)
TimerIndex=_movie.timeoutlist.count
end case
end
有了父脚本(相当于c++里面的类的声明)以后,就可以在各种场合下使用了。可以用行为包装这个效果,既可以让某个精灵具有这个效果,也可以制作闪烁按钮(鼠标放上去则闪烁)
Shockwave 动画:
问题的提出:
DIRECTOR做动画有一个问题,动画的快慢受制于帧速率,如果设置TEMPO=1,所谓的动画将不堪设想!或许我们不会设置这样底的速率,但是如果目标机器运行速度非常慢,那么我们看到的动画也将是非常的慢,失去原有的状态!这一点,我想在flash里面也有这种情况!关于这个问题,国外有一篇文章也探讨过(http://www.director-online.com/buildArticle.php?id=1153),但是他的这个代码在我的机器上测试也不能很好的运作(我测试时是将TEMPO设置为1)。如何创建一个不受tempo速率限制的动画呢?
解决之道是,运用director中的定时器对象。用TIMEOUT而不用THE MILLISECONDS。
下面我用一个简单的实例来探讨这个问题。
一、the milliseconds 的局限
the milliseconds 只是一个系统变量,它不能直接激发一个动作,必须要通过某种机制来达到触发某个动作的目的。常用的就是在exitframe 或 prepareframe 句柄中获取它,通过比较,看是否超时,如果超时则调用某个句柄。典型的代码是:
property _timestart,_timelap(假定已经初始化)
on exitframe me
if the milliseconds - _timestart > _timelap then dosomething
exit
end
很明显,这种时间比较检测受到TEMPO的限制,如果TEMPO偏低,将会起不到预定的效果。
解决问题的方法之一是在 idle句柄里检测:
on idle
if the milliseconds - _timestart > _timelap then dosomething
exit
end
但idle是全局句柄,不方便在behavior中使用,另外,在idle里如果有大量处理代码,将加重系统负担,影响dir的运行效率。
所以用the milliseconds 并不是一个非常好的选择。
二、定时器对象TIMEOUT简介
在director mx 2004的文档里面是这样说的:“A timeout object is a script object that acts like a timer and sends a message when the timer expires。”翻译过来即,timeout 对象是一个脚本定时器对象,当设定的时间间隔过后就会发送一个消息(也可以调用一段程序),以设定的频率调用句柄。
在Movie Script 中使用timeout:
-----------------以下代码都在一个movie script中
on create_a_timer
new timeout("timename",100,#timerhandle)
end
on timerhandle
put "timername timer is on"
end
--如果要删除定时器,则要调用对象的forget()方法,如timeout("timename").forget()
如果要调用另外一个behavior script中的某个handle则要在new中加入一个参数指向这个behavior script的对象。例如:
on create_a_timer
p=script("behavior").new()
new timeout("timename",100,#timerhandle,p)
end
则定时器就会调用名为behavior的行为脚本中的timerhandle句柄。
了解至此,就可以很好地利用定时器对象构建动画了。
-----------------------------------------------
三、运用面向对象技术封装定时器对象动作
我们可以用面向对象的技术封装动画效果,然后用一个行为进行控制。
后面的实例动画就是用一个父脚本封装了Fade效果,可以淡入,可以淡出,还可以循环但如淡出,当然可以无限扩充。以下是代码:
property _blendstart,_blendend,_blendstep
property _On
property _spritenum
property TimerName
property _blendDir
on new me,_n
TimerIndex=0
_spritenum=_n
return me
end
on SayHello me,What
put What && "sprite" && _spritenum
end
on Blend_FadeIn
if _On=false then exit
if sprite(_spriteNum).blend=_blendEnd then
-- if _movie<>0 then timeout(TimerIndex).forget()
timeout(Timername).forget()
exit
end if
-- put _on
-----------------------------------------------
_blend=sprite(_spriteNum).blend
_blend=_blend+_blendStep
if _blend>_blendEnd then _blend=_blendEnd
sprite(_spriteNum).Blend=_blend
updatestage
-- put "Fade"
end
on Blend_FadeOut
if _On=false then exit
if sprite(_spriteNum).blend=_blendend then
-- if TimerIndex<>0 then timeout(TimerIndex).forget()
timeout(Timername).forget()
put "blendfadeout"
exit
end if
-- put _on
-----------------------------------------------
_blend=sprite(_spriteNum).blend
_blend=_blend-_blendStep
if _blend<_blendEnd then _blend=_blendEnd
sprite(_spriteNum).Blend=_blend
updatestage
end
on Blend_FadeCycle
if _On=false then exit
-------------------------
--第一个方向
_blend=sprite(_spriteNum).blend
-- put _blendDir
_blend=_blend+ _blendDir * _blendStep
-- put _blend
if _blendDir = 1 then
if _blend>max(_blendStart,_blendEnd) then
_blend=max(_blendStart,_blendEnd)
_blendDir=-1
end if
else
if _blend<min(_blendEnd,_blendStart) then
_blend=min(_blendEnd,_blendStart)
_blendDir=1
end if
end if
sprite(_spriteNum).blend=_blend
updatestage
end
------------------------------------------------------------------------------
------------------------------------------------------------------------------
on SetFade me,FadeStyle,_TimerName,Timerlap,blendstart,blendend,Blendstep,_bOn
_blendstart=blendstart
_blendend=blendend
_blendstep=Blendstep
_On=_bOn
TimerName=_TimerName
if _blendStart>_blendEnd then
_blendDir=-1
else
_blendDir=1
end if
sprite(_spriteNum).blend=_blendStart
case FadeStyle of
1:-------------------------FadeIn
t=new timeout(TimerName,TimerLap,#Blend_FadeIn,me)
TimerIndex=_movie.timeoutlist.count
2:-------------------------FadeOut
t=new timeout(TimerName,TimerLap,#Blend_FadeOut,me)
TimerIndex=_movie.timeoutlist.count
3:-------------------------FadeCycle
t=new timeout(TimerName,TimerLap,#Blend_FadeCycle,me)
TimerIndex=_movie.timeoutlist.count
end case
end
有了父脚本(相当于c++里面的类的声明)以后,就可以在各种场合下使用了。可以用行为包装这个效果,既可以让某个精灵具有这个效果,也可以制作闪烁按钮(鼠标放上去则闪烁)
Shockwave 动画:
回复Comments
作者:
{commentrecontent}