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,它是一个完整的
对我来说为什么 Adobe 没有记录或鼓励它是个谜
它的用途,因为它是一段很棒的代码。基本上,它允许
你告诉一个特定的功能 运行 当某一帧
一个 MovieClip 被击中。与所有其他 MovieClip 函数不同,它是
从零开始,而不是从一开始,所以你必须从中减去一
所需的帧数以正确使用它。这是它的语法
MovieClip 的上下文 class:
public function MyMovieClip() {
addFrameScript(totalFrames-1, stop);
}
现在当剪辑到达最后一帧时,它会调用它的 stop()
方法而不是循环。显然,这比简单地停止播放 MovieClip 具有更深远的影响和用途。
其实我想出了一个方法,就是用这个方法来制作
弥补我认为 ActionScript 在以下方面的缺陷
影片剪辑和帧标签。由于 Flash 的早期版本,您
可以将字符串标签放在时间轴中的任何帧上并使用它们
作为导航的参考点。从 AS3 开始,Adobe 终于
引入了查看您当前所在标签的功能
一个剪辑(带有 currentLabel 属性)以及所有的列表
剪辑中的标签(currentLabels 属性)。我一直认为
每当帧标签被击中时,Flash 应该发送一个事件,这样
您可以根据标签标记触发操作。
在我的游戏中,我为敌人、玩家和游戏的其他对象创建了单独的动作脚本 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,它是一个完整的 对我来说为什么 Adobe 没有记录或鼓励它是个谜 它的用途,因为它是一段很棒的代码。基本上,它允许 你告诉一个特定的功能 运行 当某一帧 一个 MovieClip 被击中。与所有其他 MovieClip 函数不同,它是 从零开始,而不是从一开始,所以你必须从中减去一 所需的帧数以正确使用它。这是它的语法 MovieClip 的上下文 class:
public function MyMovieClip() {
addFrameScript(totalFrames-1, stop);
}
现在当剪辑到达最后一帧时,它会调用它的 stop() 方法而不是循环。显然,这比简单地停止播放 MovieClip 具有更深远的影响和用途。 其实我想出了一个方法,就是用这个方法来制作 弥补我认为 ActionScript 在以下方面的缺陷 影片剪辑和帧标签。由于 Flash 的早期版本,您 可以将字符串标签放在时间轴中的任何帧上并使用它们 作为导航的参考点。从 AS3 开始,Adobe 终于 引入了查看您当前所在标签的功能 一个剪辑(带有 currentLabel 属性)以及所有的列表 剪辑中的标签(currentLabels 属性)。我一直认为 每当帧标签被击中时,Flash 应该发送一个事件,这样 您可以根据标签标记触发操作。