素材图片酷 图酷镜像二 | 壁纸酷 壁纸镜像二 | 写真扫图酷 | Free Wallpaper | 贴图论坛 | ·设为首页 ·加入收藏
您现在的位置: 图酷 >> 自习室 >> 多媒体制作 >> Flash >> 技巧经验 >> 教程正文

  没有公告


如何将不同fps的flash合并到一起
作者: chenlangeer
教程来源: 闪吧
教程等级:         ★★★
教程录入: 烤焦面包
教程审核: tucoo
添加时间: 2006-9-6
点击次数:
字体选择: 【字体:
相关操作: 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
热门信息:
推荐内容:

flash的fps问题是一个令人困扰的话题。flash本身并不提供任何动态改变帧速的函数。

也无法写一个通用函数来达到这一目的。但凡事只要开动脑筋,总有解决办法的 :)

一. 需要合并的flash完全独立

    在大多数情况下,只需要把一些swf文件串起来逐一播放,而不需要进行嵌套。

想每段swf按照它自己的速度播放,是完全可行的,只需要加少量脚本。

例如:你有3个swf文件,分别命名为:movie.swf,movie1.swf,movie2.swf。

只需要在movie.fla的最后一帧加上一句脚本:loadMovieNum("movie1.swf", 0);

在movie1.fla的最后一帧同样加上一句脚本loadMovieNum("movie2.swf", 0)。是不是很简单,赶快试试看吧。

注意,使用这种方法时,如果在动画的最前面加了loading脚本,

它检测的载入是否完成只是针对第一段,如果需要检测所有片段是否已经载入,需要更复杂的脚本。

当然,写脚本是程序员的事,把任务交给他们吧,呵呵。

二. 需要进行嵌套播放

      这种情况比较麻烦,因为试图找出一劳永逸的方法似乎是不可能的。只能改啊改的,我讨厌重复劳动。

假设子体只包括跳转语句(stop、play、gotoAndStop、gotoAndPlay)。首先来看一下母体,需要加如下代码:

///////在第一帧插入如下代码////////
MovieClip.prototype.c_stop = ASnative(900, 13);
MovieClip.prototype.c_play = ASnative(900, 12);
MovieClip.prototype.c_gotoAndStop = ASnative(900, 17);
MovieClip.prototype.c_gotoAndPlay = ASnative(900, 16);
//重构跳转函数
MovieClip.prototype.stop = function() {
 this.stop_boolean = true;
 this.c_stop()
};
MovieClip.prototype.play = function() {
 this.stop_boolean = false;
 this.c_play()
};
MovieClip.prototype.gotoAndStop = function(n:Number) {
 this.stop_boolean = true;
 this.c_gotoAndStop(n)
};
MovieClip.prototype.gotoAndPlay = function(n:Number) {
 this.stop_boolean = false;
 this.c_gotoAndPlay(n)
};

//子体播放函数
function childRun(target_mc:MovieClip) {
 if (!target_mc.stop_boolean) {
  target_mc.nextFrame();
  if (target_mc._currentframe == target_mc._totalframes) {
   target_mc.gotoAndPlay(1);
  }
 }
 // 递归检查子MC
 for (i in target_mc) {
  if (target_mc._name) {
   childRun(target_mc);
  }
 }
 //下面这句话很重要,它使你的高速动画能得到及时刷新,但相应的也提高了CPU的负载
 updateAfterEvent();
}
//加载侦听器
var mclListener:Object = new Object();
//当子体载入完成时,停止子体并控制其播放
mclListener.onLoadComplete = function(target_mc:MovieClip) {
 clearInterval(child_val);
 child_val = setInterval(childRun, fps, target_mc);
};
var image_mcl:MovieClipLoader = new MovieClipLoader();
image_mcl.addListener(mclListener);

///////在需要加载子体的位置插入如下代码////////
//子体的宿主
this.createEmptyMovieClip("子体", this.getNextHighestDepth());
//如果需要载入的swf帧速是60,那么fps=1000/60
var fps:Number = 1000/60;
image_mcl.loadClip("子体.swf", 子体);

然后,看一下子体文件,假设某帧上原来有下面的函数:
stop();

play_btn.onRelease = function() {

  play();

};
gotoAndStop_btn.onRelease = function() {

  gotoAndStop(30);

};
需要把它们进行一下改造,把所有缺省调用的跳转语句改成"mc.+跳转语句"的方式:
this.stop();

play_btn.onRelease = function() {
 this._parent.play();

};
gotoAndStop_btn.onRelease = function() {

  this._parent.gotoAndStop(30);

};
注意:别忘了改造子体中所有含有跳转语句的脚本(nextFrame和prevFrame不用改),
如果子体含有onEnterFrame程序,请改成SetInterval方式。
如果你的子体在某一帧包括的MovieClip超过了256个,会出现递归溢出的错误,
关于如果防治递归溢出,请参考我的另外一篇帖子:
在一个动作列表中,递归超过了 256 级!!看我是怎么解除这个限制的!! 
OK,问题基本解决了,但愿你看完这个帖子后,不再为flash的fps问题感到困扰。
  • 上一篇教程:
  • 下一篇教程:
  • ::版权和投稿说明::
    • 任何媒体、网站或个人转载、链接、转贴或以其他方式复制发表本站文章,在使用时务必注明“稿件来源:图酷”及“www.tucoo.com”字样,多谢。
    • 本站已注明“来源”的文章均为转载稿,本站转载出于传递更多信息之目的。如本站转载稿涉及版权等问题,请来信与本站联系。
    • 如果您有自己原创的作品,请向我们投稿哦!您可以通过Email:gogocat@21cn.com投出自己的作品,赶快行动吧!
    • 如果觉得我们的资源有用,请推荐给朋友,谢谢!
    ::相关教程::
    电影剪辑对象的绘图方法
    鼠绘环境背景内幕
    关于fscommand调用EXE的一点心得体会
    李宁网站上的菜单解析
    闪速极光的教程EBOOK
    控制动态文本滚动的方法
    DataGrid绑定动态XML,及分页诀窍
    Flash MX本地保存数据的方法
     
    网友评论:(评论内容只代表网友观点,与本站立场无关!) 发表评论