You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 14:36:04