SWF导出仅播放1帧求助:20秒计时器控制的单帧眨眼动画异常
解决单帧场景下眨眼动画+20秒自动停止的问题
首先咱们捋清楚核心矛盾:你想让主时间轴停在单帧(避免导出只显单帧的问题),同时让内部的眨眼MovieClip正常随机播放,最后用计时器到点统一停止所有动画。下面一步步给你解决:
第一步:确保眨眼MovieClip能独立随机播放
你的眨眼MovieClip本身得设置成自动循环+随机触发:
- 打开眨眼MovieClip的内部时间轴,确认最后一帧没有加
stop();代码,保证它能自己循环 - 如果要实现随机眨眼节奏,在眨眼MovieClip的第一帧加这段代码:
(这里假设第1帧是正常睁眼状态,第2帧开始是眨眼动画,你可以根据自己的动画帧调整数值)// 随机决定从静止帧还是眨眼帧开始播放,模拟自然随机的眨眼效果 gotoAndPlay(Math.random() > 0.7 ? 2 : 1);
第二步:补全计时器代码,实现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




