无限循环(动作脚本 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)的主要内容,如果未能解决你的问题,请参考以下文章