AS2转AS3 Flash网站预加载器加载异常 代码正确性验证与修复求助
AS2转AS3预加载器修复方案
现有代码核心错误
- 变量命名冲突:进度条元件
loadBar、数值文本loadNum被后续定义的同名字段覆盖,导致元件操作失效 - 进度计算逻辑错误:
load、total、percentage均为未定义变量,加载进度需从loaderInfo接口直接获取 - 事件机制用法错误:AS3不支持
onEnterFrame直接赋值写法,必须通过addEventListener绑定事件,事件回调函数首个参数固定为Event类型,不可自定义参数 - 属性名不规范:AS3大小写敏感,元件宽度为
width(不是_width),横向缩放为scaleX(不是Scalex) - 帧跳转逻辑冗余:无需靠帧循环判断加载状态,直接监听
loaderInfo的加载事件即可更稳定触发加载完成逻辑
修复后完整代码
将以下代码写在预加载帧的帧动作里即可:
import flash.events.Event; import flash.events.ProgressEvent; import flash.display.DisplayObject; // 定义动画帧数常量 const NFRAMES:int = 6; // 监听加载进度和完成事件 loaderInfo.addEventListener(ProgressEvent.PROGRESS, onLoadUpdate); loaderInfo.addEventListener(Event.COMPLETE, onLoadComplete); // 进度更新回调 function onLoadUpdate(e:ProgressEvent):void { // 计算加载百分比 var percentLoaded:Number = Math.round((e.bytesLoaded / e.bytesTotal) * 100); // 更新文本显示 loadNum.text = percentLoaded + "%"; // 计算进度条目标宽度(按原有逻辑是百分比*2) var targetBarWidth:Number = percentLoaded * 2; // 计算数值文本目标X坐标 var targetNumX:Number = percentLoaded * 2; // 执行进度条宽度动画 animateWidth(loadBar, targetBarWidth); // 执行文本位移动画 animateX(mc_loadNum, targetNumX); } // 加载完成回调 function onLoadComplete(e:Event):void { // 移除加载监听 loaderInfo.removeEventListener(ProgressEvent.PROGRESS, onLoadUpdate); loaderInfo.removeEventListener(Event.COMPLETE, onLoadComplete); // 跳转到主内容帧,可按需求替换成对应帧号/帧标签 gotoAndPlay(48); } // 通用宽度缓动动画函数 function animateWidth(target:DisplayObject, targetWidth:Number):void { // 存储动画初始值 var startWidth:Number = target.width; var deltaWidth:Number = targetWidth - startWidth; var frameCount:int = 0; // 绑定帧事件 function onFrame(e:Event):void { frameCount++; if(frameCount <= NFRAMES) { target.width = easeOutQuad(frameCount, startWidth, deltaWidth, NFRAMES); } else { // 动画完成移除事件 target.removeEventListener(Event.ENTER_FRAME, onFrame); } } target.addEventListener(Event.ENTER_FRAME, onFrame); } // 通用X轴位移动画函数 function animateX(target:DisplayObject, targetX:Number):void { var startX:Number = target.x; var deltaX:Number = targetX - startX; var frameCount:int = 0; function onFrame(e:Event):void { frameCount++; if(frameCount <= NFRAMES) { target.x = easeOutQuad(frameCount, startX, deltaX, NFRAMES); } else { target.removeEventListener(Event.ENTER_FRAME, onFrame); } } target.addEventListener(Event.ENTER_FRAME, onFrame); } // 缓动函数保持原有逻辑不变 function easeOutQuad(time:Number, beginX:Number, changeX:Number, durationX:Number):Number { if ((time /= durationX / 2) < 1) { return changeX / 2 * time * time + beginX; } return -changeX / 2 * ((--time) * (time - 2) - 1) + beginX; }
注意事项
- 确保预加载帧只有加载相关资源,主内容全部放在后面的帧,否则预加载会失效
- 确认场景上的进度条元件实例名是
loadBar,百分比文本实例名是loadNum,跟随进度移动的文本元件实例名是mc_loadNum,和代码里的命名一致
内容的提问来源于stack exchange,提问作者Megan McDemott
相关产品推荐
相关产品推荐

