无限循环(动作脚本 3)

Infinite Loops (Action Script 3)

我是 Flash Actionscript 的新手,因为我的编程 class 使用它。我通常使用 C++(或其变体)并涉足 Java,因此 Actionscript 对我来说非常熟悉。

但是,每当我使用 while 循环时,AS3 都会在 15 秒后崩溃。我需要使用 while 循环,否则整个代码的范围将结束并且游戏将在我假定的代码上停止 运行。在我的普通编程语言中,while (true) 会挂起游戏 除非 我有 Waitframe();在代码的某处让它前进一帧。但是我搜索了一下,Actionscript没有这样的东西,我找到的都是"Infinite loops are the devil aaaaaaaa"。

太棒了,我怎么能用这个做游戏呢?我希望我的游戏持续超过 15 秒,但 AS3 "helpfully" 会终止脚本应该 "hang",尽管我做了一些事情(尽管那些东西根本没有真正出现,大概是因为脚本挂)。我是不是错过了允许长时间使用 while 循环的等待函数,还是我做错了?

Flash 在 "Frame" 系统上工作,本质上是一个按帧率计算的计时器。 将所有游戏代码放入一个新函数中,并使用事件侦听器调用该函数。

stage.addEventListener(Event.ENTER_FRAME, function(e:Event):void {
  // Your code here
  // Called every frame
});

与 C/C++ 环境不同,Flash Player(最初较少涉及脚本,更多涉及动画)不是实时环境,而是分阶段工作,通常称为帧 (一个基本的 Flash Player 循环包括将播放头前进到任何当前 timeline/MovieClip) 的下一帧。

因此,每个阶段分为两个步骤:

  1. 脚本执行。
  2. 正在渲染舞台。

所以,如果你想控制某些东西让用户看到流畅的动画,你需要每帧 运行 一个脚本。比方说,你有一个盒子你想平滑地向右移动。

var Box:DisplayObject;

addEventListener(Event.ENTER_FRAME, onFrame);

function onFrame(e:Event):void
{
    Box.x++;
}

通常情况下,Flash Player 会尝试使 FPS 尽可能接近设置。但是,如果您的脚本(它是各种事件的处理程序,不仅 ENTER_FRAME,还有键盘事件、mouse/touch 输入、网络事件等)运行 太长 and/or 渲染太重,Flash Player 将无法保持正确的 FPS。

这也是脚本执行阶段有限制的原因,默认设置为 15 秒。 Flash Player 建议中止脚本 运行ning 太长时间可能会出现故障。

然后,您的问题的解决方案取决于您在那里尝试做什么,但无论如何您必须完成事情并让 Flash Player 继续进行,以便您的应用程序正常运行。

还有一点,您不需要真正的无限循环。通常,您需要有条件的情况,以便用户可以退出。在 C 中,你会做:

extern quit;

void init()
{
    quit = 0;
}

//inside main()
while(!quit)
{
    //game functions
    //advance_frame();
}

如果玩家尝试退出、死亡或赢得游戏,您将打破该循环,每个都有一个唯一的值,例如 quit == 1 表示正常退出,== 2 表示死亡,== 3 为 winnig;然后每个循环都有一个不同的循环(在 main 内)。

无限循环一般很少见,应格外小心使用。在任何情况下,通常您都需要一个导致它们退出的语句。

即使是C,也需要手动前移帧。只有基于游戏的脚本语言往往 'automate' 以某种方式做到这一点,而 Macromedia Flash 的设计从未旨在为游戏引擎提供动力。

现在大学真的教授 Flash 游戏设计了吗?!如果是这样,那就太可怕了。