无限循环(动作脚本 3)

Posted

技术标签:

【中文标题】无限循环(动作脚本 3)【英文标题】:Infinite Loops (Action Script 3) 【发布时间】:2018-07-20 07:51:42 【问题描述】:

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

但是,每当我使用 while 循环时,AS3 都会在 15 秒后崩溃。我需要使用 while 循环,否则整个代码的范围将结束,游戏将停止在我假定的代码上运行。在我的普通编程语言中,while (true) 会挂起游戏除非我有 Waitframe();在代码中的某个地方让它前进一帧。但我搜索,Actionscript 没有这样的东西,我发现的只是“无限循环是魔鬼 aaaaaaaa”。

太好了,我怎么能用这个来制作游戏?我希望我的游戏持续超过 15 秒,但 AS3 “有用”地在脚本“挂起”时终止脚本,尽管我正在做一些事情(尽管这些东西根本没有真正出现,大概是因为脚本挂起)。我是否错过了允许长时间使用 while 循环的等待功能,还是我做错了?

【问题讨论】:

是的,你做错了。您的应用程序挂起和崩溃的原因是因为 flash 是单线程的,所以您基本上将 ui-thread 放入一个永远无法解析的无限循环中,而 flash 不喜欢这样。相反,您应该在舞台上添加一个 EventListener 并收听 ENTER_FRAME,它每帧调用一次您的回调函数。 所以我把我的while循环变成一个函数并通过监听器调用它?什么是 Enter_Frame?那是每当一帧过去的时候吗? 【参考方案1】:

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

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

【讨论】:

谢谢!这澄清了很多事情:)【参考方案2】:

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

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

    脚本执行。 渲染舞台。

因此,如果您想控制某些内容以使用户看到流畅的动画效果,则需要每帧运行一个脚本。比方说,您有一个想要平稳地向右移动的框。

var Box:DisplayObject;

addEventListener(Event.ENTER_FRAME, onFrame);

function onFrame(e:Event):void

    Box.x++;

通常,Flash Player 会尝试使 FPS 尽可能接近设置。但是,如果您的脚本(它是各种事件的处理程序,不仅是 ENTER_FRAME,还包括键盘事件、鼠标/触摸输入、网络事件等)运行时间过长和/或渲染过于繁重,Flash Player 将不会能够保持 FPS 正确。

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

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

【讨论】:

哦,有道理。谢谢!【参考方案3】:

还有一点,你不想要一个真正的无限循环。一般来说,你想要一个有条件的情况,让用户可以退出。在 C 中,你会这样做:

extern quit;

void init()

    quit = 0;


//inside main()
while(!quit)

    //game functions
    //advance_frame();

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

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

即使在 C 中,您也需要手动推进框架。只有基于游戏的脚本语言才会以某种方式“自动化”这一点,而 Macromedia Flash 的设计初衷从来不是为游戏引擎提供动力。

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

【讨论】:

我一般用break;每当我想退出 while(true) 循环时。这让我可以立即退出循环,而不是等到循环完成。一般来说,如果我的玩家刚刚死去,我不想移动武器,因为游戏结束序列将会发生,移动它们一次只是浪费。也可以。

以上是关于无限循环(动作脚本 3)的主要内容,如果未能解决你的问题,请参考以下文章

KVO 无限循环/循环

在获取数据w / subscribe之后我发送动作时的无限循环

如何在无限循环中每 3 分钟回显一次?

shell 脚本 - 在退出无限循环之前完成迭代

在脚本中并行运行 2 个无限循环,并在脚本停止时终止

为啥我在无限循环中休眠的 python 脚本停止运行?