将 Action Script 2.0 代码迁移到 Action Script 3.0

Migrate Action Script 2.0 code to Action script 3.0

我有一个在 "Adobe Flash Professional CS5" 上开发的 fla 文件。它使用动作脚本 2.0

现在我必须将这个 fla 文件迁移到 "Adobe Animate CC 2017"。在 IDE 中加载 fla 文件并发布时,遇到以下错误。

符号'AAAA',图层'Definition',第1帧,第20行,第8列1061:通过静态类型[=23]的引用调用可能未定义的方法寄存器Class =].

下面是代码片段

// The default value for Severity parameter must be negative.
function AAAAClass() {
    this.setID(this.mID);
    this.setStatus(this.mStatus);
}

AAAAClass.prototype = new MovieClip();

AAAAClass.prototype.setID = function(variable) {
    this.ID.text = variable;
};

AAAAClass.prototype.setStatus = function(variable) {
    this.Status.text = variable;
    this.Status._visible = false;
};

Object.registerClass("AAAA", AAAAClass); // Compiler shows error at this statement

你可以根据你的as2代码做一些假设:

// The default value for Severity parameter must be negative.
function AAAAClass() {                                      //this is the "constructor"
    this.setID(this.mID);                       
    this.setStatus(this.mStatus);
}

AAAAClass.prototype = new MovieClip();                      //this means the class extends MovieClip (probably a Movie Clip Exported for Actionscript in the .fla file's Library)

AAAAClass.prototype.setID = function(variable) {            
    this.ID.text = variable;                                //from this line we can deduce the ID isn't an int (as intuituion might point to), but a String and the clip must contain a Dynamic TextField named ID
};

AAAAClass.prototype.setStatus = function(variable) {
    this.Status.text = variable;                            //from this line we can deduce the Statusi is also a String and the clip must contain a Dynamic TextField named Status
    this.Status._visible = false;
};

Object.registerClass("AAAA", AAAAClass); // Compiler shows error at this statement

这可以推断为 as 3.0 class,如下所示:

package {

    import flash.display.MovieClip;
    import flash.text.TextField;

    public class AAAA extends MovieClip {

        private var mID:String = "default ID";
        private var mStatus:String = "default status";

        //private var ID:TextField;
        //private var Status:TextField;

        public function AAAA(){
            this.setID(this.mID);
            this.setStatus(this.mStatus);

            //ID = new TextField();
            //Status = new TextField();
        }

        public function setID(variable:String):void{
            this.mID = variable;
            this.ID.text = this.mID;
        };

        public function setStatus(variable:String):void{
            this.mStatus = variable;
            this.Status.text = this.mStatus;
            this.Status.visible = false;
        };

        override public function toString():String{
            return "[AAAA mID=" + mID + " mStatus=" + mStatus + " ]";
        }

    }

}

注意到注释掉的 TextFields 了吗?我无法猜测结构,但我的猜测是,在您的 as 2.0 项目中,链接到 AAAAClass 的库中有一个 MovieClip,它有两个文本字段:IDStatus

关于 as3 和从 as2 到 as3 的迁移,有很多内容需要涵盖。 我建议阅读 Trevor McCauley's Getting Started with ActionScript 3.0 in Adobe Flash CS3 exhaustive article and Dan Carr's Migrating from ActionScript 2 to ActionScript 3: Key concepts and changes 篇文章。

如果您是 as3 的新手,可能会在最小的新 Flash 项目中练习文章中解释的概念,这样一切都简单易懂,然后回到您的项目并应用您学到的知识。