打印

[AS1&2] 制件动画轮翻播放的时候碰上问题了

要制作一个动画轮翻播放的效果:
一个大的容器用来动态载入动画,并列出被载入动画的标签,以便用户点击查看感兴趣的动画。当用户没有任何点击的时候,动画按照各自设置好的时间播放,到时间之后就跳转到另外一个动画播放。

这些动画的载入我是使用创建一个空白的MovieClip,然后将动画载入进来。自动播放的时间控制是使用setTimeout/setInterval来控制的。现在的问题是,动画如果比较大,而网速比较慢的时候,播放的时间就不准了,那个动画载入花掉多少时间,这个动画就少播多少时间。而我想要的是,不管这个动画载入花掉多长时间都不影响它的播放时间,不知道怎么解决了。
主要是不知道我这个空白MovieClip什么时候载入完成,望各位高手给些思路。

为避免各位看不懂我在描述什么,贴出代码,从代码逻辑上来帮我分析一下,谢谢。
复制内容到剪贴板
代码:
function loadXml(url)
{
    var rXml = new XML();
    rXml.ignoreWhite = true;
    rXml.load(url);
    rXml.onLoad = function (success)
    {
        if (success)
        {
            itemArray = this.firstChild.childNodes;            
            Image_Loader.createEmptyMovieClip("empty",1);
            if(itemArray.length > 1){
                var i = 0;
                while (i < itemArray.length)
                {
                  _root.attachMovie("btn", "btn" + i, 1000 + i, {_x: 15 + 25 * i, _y: 120});
                  _root["btn" + i].txt.text = i + 1;
                  _root["btn" + i].index = i;
                  _root["btn" + i].onPress = btnPress;
                   i++;
                 }
                 showBtn(index);
            }else{
                index = 0;
            }
            SwitchImage();
        }
    };
}
var SwitchImage = function(){
    clearInterval(waitID);
    loadNextPic();
    timeLabel = jumpTime;
    waitID = setInterval(SwitchImage,jumpTime);
    showBtn(index);
}
function loadNextPic()
{
    index++;
    if (index > itemArray.length - 1){
        index = 0;
    }
    Loader_Item = itemArray[index].attributes;
    Image_Loader.empty.loadMovie(Loader_Item.picUrl);
    Image_Loader.empty.onPress = function(){
        getUrl(Loader_Item.link,"_blank");
    }
    jumpTime = Loader_Item.time * 1000;
}
function btnPress()
{
    _root.index = this.index;
    clearInterval(waitID);
    Loader_Item = itemArray[index].attributes;
    Image_Loader.empty.loadMovie(Loader_Item.picUrl);
    waitID = setInterval(SwitchImage,Loader_Item.time * 1000);
    timeLabel = Loader_Item.time * 1000;
    showBtn(index);
}
function showBtn(id)
{
       var i = 0;
       while (i < itemArray.length)
       {
            _root["btn" + i].gotoAndStop(1);
         i++;
        }
        _root["btn" + id].gotoAndStop(2);
}
var index = -1;
var waitID = 0;
var itemArray = new Array();
var Loader_Item;
var jumpTime;
var swfPath;
swfPath = "site_swf.xml";
loadXml(swfPath);
承接定制建站、在线系统,代理域名、邮局、主机,价格从优。
有意者站内PM。
新一代四无新人……
55~~~代码怎么连个注释都没有啊!?害我眼都花了

不过你描述的情况一般都是由于你在点击按钮或者外部动画onLoad的时候没有及时clearInterval,造成时间冲突,按这个思路先自检一下吧,而且最好trace一下,看是否真的clearInterval了。
不是没有clearInterval,事实上,这些都正常,之所以动画没有播放完,那是因为动画载入需要时间,这个载入时间也被算到动画播放时间里去了,造成载入花了多长时间,在播放的时候就少放了多长时间。
如果我载入小图片或者被载入的动画比较小,能快速被加载完成并播放的,就一点问题都没有了。
承接定制建站、在线系统,代理域名、邮局、主机,价格从优。
有意者站内PM。
新一代四无新人……

TOP

认证您的手机,获得手机认证图标, 更多手机认证的好处
那你就在等动画载入完成后先clearInterval,然后再setInterval
其实你这个问题我以前在做图片轮播模型的时候也碰到过,当时我就是这么做的,祝你好运
this.createEmptyMovieClip("image_mc", this.getNextHighestDepth());//创建一个装置装载图片的MC
var mcload:MovieClipLoader = new MovieClipLoader();//MovieClipLoader类
var mclListener:Object = new Object();//申明侦听器
mclListener.onLoadInit = function(target:MovieClip) {//加载成功执行的动作
target.imgload_txt.removeTextField();//一定要删除它,否则加载进度100%的字样会永远显示
target._x = 200;
target._y = 20;
target._width = 780;
target._height = 560;
//在这里设置时间或者播放效果(推荐用TWEEN类)!!!!!!!
};
mclListener.onLoadProgress = function(target:MovieClip, bytesLoaded:Number, bytesTotal:Number) {
//trace("文件/"+bytesLoaded+"/"+bytesTotal);
target.createTextField("imgload_txt", 999, 400, 200, 120, 80);
target.imgload_txt.text = "加载进度:"+int(bytesLoaded/bytesTotal*10000)/100+"%";//楼上想要的主要功能在这里实现
//trace(target.imgload_txt.text);
};
mcload.addListener(mclListener);//注册侦听器
mcload.loadClip("展示.swf", image_mc);//加载swf以及图片都可以,这里执行加载动作

TOP

引用:
原帖由 jimohuoshan 于 2007-4-30 22:26 发表
那你就在等动画载入完成后先clearInterval,然后再setInterval
其实你这个问题我以前在做图片轮播模型的时候也碰到过,当时我就是这么做的,祝你好运
问题是不知道被载入的动画什么时候载入完成。
我输播的是动画,不是图片,所以时间是不能统一的,尽管思路是一样的,但是需要监听要播放的动画什么时候被载入完成。
承接定制建站、在线系统,代理域名、邮局、主机,价格从优。
有意者站内PM。
新一代四无新人……

TOP

用MovieClipLoader类

var ListNode:XMLNodes;
var curNode:XMLNodes;
var ContainerMC:MovieClip;
var IntervalID:Number;
var IntervalTimeDelay:Number=5000;
var mcload:MovieClipLoader = new MovieClipLoader();
mcload.addListener(this);

function onLoadInit = function(target:MovieClip) {
    IntervalID=setInterval(this,"GoNext",IntervalTimeDelay);
}
function LoadNode(node:XMLNodes){
    mcload.loadClip(node.nextSbling.attributes.url,ContainerMC);
    curNode=node;
}

function GoNext(){
   clearInterval(IntervalID);
   if(curNode.nextSibling!=null)    curNode=curNode.nextSibling;
      else curNode=ListNode.firstChild;
  LoadNode(curNode);
}

LoadNode(ListNode.firstChild);
hey~同志们还好么?

TOP

大家可能没有看清我的情况
这里再说明一下。
情况一:我播放的是动画,不同的动画所播放的时间是都不一样的,所以使用统一的时间是不符合要求的。
情况二:动画什么时候被载入完成我不知道(其实这个才是我现在面临的最大问题)。
因为我使用的动态创建一个空白影片来载入动画,所以不能用纯粹的类似于_root.getBytesTotal这样来获取大小,尝试过使用empty.getBytesTotal这种方法来获取,但得到的数据都是0。
承接定制建站、在线系统,代理域名、邮局、主机,价格从优。
有意者站内PM。
新一代四无新人……

TOP

MovieClipLoader类的onLoadInit方法不但可以在影片被载入完成时触发,而且应该还能获得影片的总帧数,你不需要知道影片播放的总时间,只需要用onEnterFrame侦测影片的当前帧是否为最后一帧来判断影片是否播放完成了。

TOP

我觉得你可以使用MovieClipLoader来完成,用onLoadInit来侦测加载完毕,完毕以后才触发你的setInterval来记时,时间到了再转入下一个MovieClioLoader

TOP

现在我重新改写了,但是很奇怪的是,都没有办法使用MovieClipLoader来跟踪,会是什么原因?
你们所说的onLoadInit我也用了,但是一直都不会触发这个动作,我添加addListener也不行,把Flash帮助里的代码复制进去也不能用,郁闷了。。。
现在使用onEnterFrame来跟踪帧数,起先的几秒钟得到的当前帧跟总帧数是一样的,后面才是正常的,再次郁闷。

[ 本帖最后由 帅青蛙 于 2007-5-8 17:38 编辑 ]
承接定制建站、在线系统,代理域名、邮局、主机,价格从优。
有意者站内PM。
新一代四无新人……

TOP

我跟你一起郁闷了,还是贴代码出来看看吧!

TOP

可以在每个动画的最后一帧发送出一个事件,或者赋个值或者执行一个函数就可以了

TOP