返回列表 回复 发帖

解决新手的困扰--如何将不同fps的flash合并到一起

<;P>flash的fps问题是一个令人困扰的话题。flash本身并不提供任何动态改变帧速的函数。也无法写一个通用函数来达到这一目的。但凡事只要开动脑筋,总有解决办法的 :)</P>
<;P><STRONG>一. 需要合并的flash完全独立</STRONG></P>
<;P>在大多数情况下,只需要把一些swf文件串起来逐一播放,而不需要进行嵌套。想每段swf按照它自己的速度播放,是完全可行的,只需要加少量脚本。例如你有3个swf文件,分别命名为movie.swf,movie1.swf,movie2.swf。只需要在movie.fla的最后一帧加上一句脚本:loadMovieNum("movie1.swf", 0);在movie1.fla的最后一帧同样加上一句脚本loadMovieNum("movie2.swf", 0)。是不是很简单,赶快试试看吧。</P>
<;P>注意,使用这种方法时,如果在动画的最前面加了loading脚本,它检测的载入是否完成只是针对第一段,如果需要检测所有片段是否已经载入,需要更复杂的脚本。当然,写脚本是程序员的事,把任务交给他们吧,呵呵。</P>
<;P><STRONG>二. 需要进行嵌套播放</STRONG></P>
<;P>这种情况比较麻烦,因为试图找出一劳永逸的方法似乎是不可能的。只能改啊改的,我讨厌重复劳动。</P>
<;P>假设子体只包括跳转语句(stop、play、gotoAndStop、gotoAndPlay)。首先来看一下母体,需要加如下代码:</P><;PRE><FONT color=#a52a2a>///////在第一帧插入如下代码////////<BR>MovieClip.prototype.c_stop = ASnative(900, 13);<BR>MovieClip.prototype.c_play = ASnative(900, 12);<BR>MovieClip.prototype.c_gotoAndStop = ASnative(900, 17);<BR>MovieClip.prototype.c_gotoAndPlay = ASnative(900, 16);<BR>//重构跳转函数<BR>MovieClip.prototype.stop = function() {<BR> this.stop_boolean = true;<BR> this.c_stop()<BR>};<BR>MovieClip.prototype.play = function() {<BR> this.stop_boolean = false;<BR> this.c_play()<BR>};<BR>MovieClip.prototype.gotoAndStop = function(n:Number) {<BR> this.stop_boolean = true;<BR> this.c_gotoAndStop(n)<BR>};<BR>MovieClip.prototype.gotoAndPlay = function(n:Number) {<BR> this.stop_boolean = false;<BR> this.c_gotoAndPlay(n)<BR>};</FONT></PRE><;PRE><BR><FONT color=#a52a2a>//子体播放函数<BR>function childRun(target_mc:MovieClip) {<BR> if (!target_mc.stop_boolean) {<BR>  target_mc.nextFrame();<BR>  if (target_mc._currentframe == target_mc._totalframes) {<BR>   target_mc.gotoAndPlay(1);<BR>  }<BR> }<BR> // 递归检查子MC<BR> for (i in target_mc) {<BR>  if (target_mc._name) {<BR>   childRun(target_mc);<BR>  }<BR> }<BR> //下面这句话很重要,它使你的高速动画能得到及时刷新,但相应的也提高了CPU的负载 <BR> updateAfterEvent();<BR>}</FONT></PRE><;PRE><FONT color=#a52a2a>//加载侦听器<BR>var mclListener:Object = new Object();<BR>//当子体载入完成时,停止子体并控制其播放<BR>mclListener.onLoadComplete = function(target_mc:MovieClip) {<BR> clearInterval(child_val);<BR> child_val = setInterval(childRun, fps, target_mc);<BR>};<BR>var image_mcl:MovieClipLoader = new MovieClipLoader();<BR>image_mcl.addListener(mclListener);</FONT></PRE><;PRE><BR><FONT color=#a52a2a>///////在需要加载子体的位置插入如下代码////////<BR>//子体的宿主<BR>this.createEmptyMovieClip("子体", this.getNextHighestDepth());<BR>//如果需要载入的swf帧速是60,那么fps=1000/60<BR>var fps:Number = 1000/60;<BR>image_mcl.loadClip("子体.swf", 子体);</FONT><BR></PRE><;PRE></PRE><;PRE></PRE><;PRE>然后,看一下子体文件,假设某帧上原来有下面的函数:</PRE><;PRE><FONT color=#a52a2a>stop();<BR><BR>play_btn.onRelease = function() {<BR><BR>  play();<BR><BR>};<BR>gotoAndStop_btn.onRelease = function() {<BR><BR>  gotoAndStop(30);<BR><BR>};</FONT></PRE><;PRE>需要把它们进行一下改造,把所有缺省调用的跳转语句改成"mc.+跳转语句"的方式:</PRE><;PRE><FONT color=#a52a2a>this.stop();<BR><BR>play_btn.onRelease = function() {<BR> this._parent.play();<BR><BR>};<BR>gotoAndStop_btn.onRelease = function() {<BR><BR>  this._parent.gotoAndStop(30);<BR><BR>};</FONT></PRE><;PRE>注意:别忘了改造子体中所有含有跳转语句的脚本(nextFrame和prevFrame不用改),如果子体含有onEnterFrame程序,请改成SetInterval方式。</PRE><;PRE>如果你的子体在某一帧包括的MovieClip超过了256个,会出现递归溢出的错误,关于如果防治递归溢出,请参考我的另外一篇帖子:<U><FONT color=#0000cc size=4><A HREF="/bbs/viewThread.php?tid=283276?highlight=256">在一个动作列表中,递归超过了 256 级!!看我是怎么解除这个限制的!!</A></FONT></U> </PRE><;PRE>OK,问题基本解决了,但愿你看完这个帖子后,不再为flash的fps问题感到困扰。</PRE>

母体.fla (64 KB)

子体.fla (81.5 KB)

收藏了...研究ING..
谢谢分享
我在舞台帧设默认值是12fps,然后在舞台上放3个元件元件名分别是a1,a2,a3,分别在第1帧,第2帧,第3帧.
在元件a1中放两个按钮,分别为btn1和btn2,
对第1帧的a1元件让它按50fps运动,在btn1上写代码如下:
on (release) {
function next(ob1) {
var next_frame = ob1._currentframe%50+1;
//50是因为元件a1有50帧
ob1.gotoAndStop(next_frame);
//用gotoAndStop后 trae(ob1._currentframe); 输出为 1,2,3,4,5,6,。。30,1,2,3。。
trace(next_frame);
updateAfterEvent();
}
//这个函数是进下一帧
aa = setInterval(next, 1000/50, _root.a1);
//这3个参数指的是,调用函数,间隔毫秒数,让哪个路径动画播放
}
按下btn1时意思是控制播放!
在btn2上写:
on (release) {
clearInterval(aa);
this.stop();
}
按下btn2时意思是暂停!!!

但是不是运动速度就=50fps???还是有点偏差???
以上运行好象符合要求!?
另外出现了两个问题:
1.如果场景舞台默认帧速为1fps,a1按照这个代码好象不是帧速=50fps实现!!!如下:<帧速率设置5>文件

2.当我对btn1多按几下,再按btn2时,却无法控制,这是何故??/如下:<帧速率设置6>文件

请指点,谢谢!!!!

帧速率设置5.fla (66 KB)

帧速率设置5.swf (8.3 KB)

帧速率设置6.fla (66 KB)

帧速率设置6.swf (8.53 KB)

问题是如何把几个SWF文件放到一个FLA文件中?
很好,很强大!~顶拉!~~
好好学习啊,真的要好好学习
阅读ing
看得好累呀
返回列表