You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

SWF导出仅播放1帧求助:20秒计时器控制的单帧眨眼动画异常

解决单帧场景下眨眼动画+20秒自动停止的问题

首先咱们捋清楚核心矛盾:你想让主时间轴停在单帧(避免导出只显单帧的问题),同时让内部的眨眼MovieClip正常随机播放,最后用计时器到点统一停止所有动画。下面一步步给你解决:

第一步:确保眨眼MovieClip能独立随机播放

你的眨眼MovieClip本身得设置成自动循环+随机触发

  • 打开眨眼MovieClip的内部时间轴,确认最后一帧没有加stop();代码,保证它能自己循环
  • 如果要实现随机眨眼节奏,在眨眼MovieClip的第一帧加这段代码:
    // 随机决定从静止帧还是眨眼帧开始播放,模拟自然随机的眨眼效果
    gotoAndPlay(Math.random() > 0.7 ? 2 : 1);
    
    (这里假设第1帧是正常睁眼状态,第2帧开始是眨眼动画,你可以根据自己的动画帧调整数值)

第二步:补全计时器代码,实现20秒全局停止

你原来的计时器代码没写完,把这段完整代码放在主时间轴第一帧就行:

stop(); // 主时间轴停在单帧,彻底解决导出只显单帧的问题

// 创建计时器:每隔1秒触发一次,总共触发20次(刚好对应20秒)
var myTimer:Timer = new Timer(1000, 20);
// 绑定计时器完成事件,20秒后执行停止逻辑
myTimer.addEventListener(TimerEvent.TIMER_COMPLETE, onTimeUp);
// 启动计时器
myTimer.start();

function onTimeUp(e:TimerEvent):void {
    // 先清理计时器,避免内存占用
    myTimer.stop();
    myTimer.removeEventListener(TimerEvent.TIMER_COMPLETE, onTimeUp);
    
    // 停止所有眨眼动画,分两种情况处理:
    // 情况1:如果眨眼实例是直接放在主时间轴上(比如实例名是blink1、blink2...)
    blink1.stop();
    blink2.stop();
    blink3.stop(); // 按你的实例数量依次写
    
    // 情况2:如果把所有眨眼实例放在一个叫blinkContainer的容器里,批量停止更高效
    /*
    for(var i:int = 0; i < blinkContainer.numChildren; i++){
        var blinkMc:MovieClip = blinkContainer.getChildAt(i) as MovieClip;
        if(blinkMc) blinkMc.stop();
    }
    */
}

第三步:解决延长帧长度时眨眼异常的问题

之前你延长主时间轴帧数后眨眼动画不正常,本质是主时间轴播放时会重置内部MovieClip的帧状态,导致眨眼节奏混乱。现在咱们让主时间轴一直停在第一帧,内部MovieClip完全独立运行,就不会有这种冲突了。

最后导出SWF测试:主时间轴停在单帧,所有眨眼实例会自己随机播放,20秒后自动全部停止,完美符合你的需求~

内容的提问来源于stack exchange,提问作者Fuure

火山引擎 最新活动