Adobe Flash 框架脚本与单独的文件脚本

Adobe Flash frame scripting versus seprate file scripting

在我的游戏中,我为敌人、玩家和游戏的其他对象创建了单独的动作脚本 classes 和文件。这很好,因为这让我可以使用枯燥的(不要重复自己)设计原则。但在我的菜单屏幕中,在第 100 帧的开头有一个这样的脚本:

import flash.events.Event;
import flash.display.MovieClip;

var clouds: Array = [cloud1, cloud2, cloud3, cloud4];
var initCloudsX: Array = [cloud1.x, cloud2.x, cloud3.x, cloud4.x];
var nclouds = clouds.length;
var scrollSpeed: Number = 1;

if (this.hasEventListener(Event.ENTER_FRAME)) {
    this.removeEventListener(Event.ENTER_FRAME, scroll);

}


this.addEventListener(Event.ENTER_FRAME, scroll);
function garbageFrame(): void {
    sndBgChannel.stop();
    if (this.hasEventListener(Event.ENTER_FRAME)) {
        this.removeEventListener(Event.ENTER_FRAME, scroll);

    }
}
function scroll(e: Event): void {
    ground1.x -= scrollSpeed;
    ground2.x -= scrollSpeed;

    mountains1.x -= scrollSpeed;
    mountains2.x -= scrollSpeed;
    if (ground1.x < -ground1.width) {

        ground1.x = ground2.x + ground2.width - 5;
    }

    if (ground2.x < -ground2.width) {
        ground2.x = ground1.x + ground1.width - 10;
    }

    if (mountains1.x < -mountains1.width) {

        mountains1.x = mountains2.x + mountains2.width - 2;
    }
    if (mountains2.x < -mountains2.width) {

        mountains2.x = mountains1.x + mountains1.width - 2;
    }




    for (var i: Number = 0; i < nclouds; i++) {
        clouds[i].x -= scrollSpeed;
        if (clouds[i].x < -clouds[i].width) {
            clouds[i].x = initCloudsX[i];
        }
    }
}

到目前为止,我认为这是一个很好的方法,在离开框架 101 之后,通过调用上面定义的 garbageFrame,我可以简单地离开框架而没有任何麻烦或打扰。 但这里提出的问题是,例如假设在第 300 帧中,有一个实例名称为 clouds 的影片剪辑。编译器将向我抛出一个错误,你在框架 101.so:

之前定义了一个 clouds 类型的数组

1 ) 它告诉我,如果我定义一个变量, frame 1 ,它不会在任何其他帧中被破坏。

2) 我认为在后台,flash 编译器生成了一个 class,它将帧的每个动作都放在它上面,所以它不允许我重新定义一个变量或函数两次。

现在您对使用动作脚本编程的混合方法有何想法,我的意思是同时使用框架脚本和分隔文件 classes(和链接)。这有意义吗?框架脚本的优点和缺点是什么?

提前致谢..

也许有人认为post不令人兴奋而投下了post,但我会自己回答这个问题。在阅读、搜索和思考其他评论之后,即使其他用户可能认为没有答案,最终答案是:

在我继续之前,我应该继续说明 记录应不惜一切代价避免在时间表上编码。 在这一点上,基本上没有什么是你不能用 classes 来控制你的 DisplayObjects 的,并强制你的代码进入 classes 强加了更好的架构和更少的快捷方式 稍后会回来咬你。 现在,我说“基本上”是因为在 AS3(特别是 Flash CS3)之前,您仍然必须在任何 您不想循环播放的影片剪辑。自从切换到 all-class 脚本架构,我发现无法做到这一点非常令人沮丧 从我的 FLA 中轻松删除最后一点零散的时间线代码 一劳永逸。然后我发现了一个未记录的方法 的电影剪辑。它叫做 addFrameScript,它是一个完整的 对我来说为什么 Adob​​e 没有记录或鼓励它是个谜 它的用途,因为它是一段很棒的代码。基本上,它允许 你告诉一个特定的功能 运行 当某一帧 一个 MovieClip 被击中。与所有其他 MovieClip 函数不同,它是 从零开始,而不是从一开始,所以你必须从中减去一 所需的帧数以正确使用它。这是它的语法 MovieClip 的上下文 class:

public function MyMovieClip() {
  addFrameScript(totalFrames-1, stop);
}

现在当剪辑到达最后一帧时,它会调用它的 stop() 方法而不是循环。显然,这比简单地停止播放 MovieClip 具有更深远的影响和用途。 其实我想出了一个方法,就是用这个方法来制作 弥补我认为 ActionScript 在以下方面的缺陷 影片剪辑和帧标签。由于 Flash 的早期版本,您 可以将字符串标签放在时间轴中的任何帧上并使用它们 作为导航的参考点。从 AS3 开始,Adobe 终于 引入了查看您当前所在标签的功能 一个剪辑(带有 currentLabel 属性)以及所有的列表 剪辑中的标签(currentLabels 属性)。我一直认为 每当帧标签被击中时,Flash 应该发送一个事件,这样 您可以根据标签标记触发操作。