代码之家  ›  专栏  ›  技术社区  ›  Dimentio

无限循环(动作脚本3)

  •  -1
  • Dimentio  · 技术社区  · 6 年前

    我不熟悉Flash Actionscript,因为我的编程课使用它。我通常使用C++(或其变体),并涉猎过Java,所以Actionscript对我来说很熟悉。

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

    Soooo,我怎么能用这个做游戏呢?我希望我的游戏能持续15秒以上,而AS3在脚本“挂起”时会“有帮助地”终止脚本,尽管我做了一些事情(虽然这些事情根本没有出现,大概是因为脚本挂起了)。我是否错过了允许延长while循环使用时间的等待功能,或者我做错了?

    3 回复  |  直到 6 年前
        1
  •  2
  •   Organis    6 年前

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

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

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

    所以,如果您想控制某些内容,以便用户看到平滑的动画效果,则需要每帧运行一个脚本。比方说,你有一个盒子,你想平稳地向右移动。

    var Box:DisplayObject;
    
    addEventListener(Event.ENTER_FRAME, onFrame);
    
    function onFrame(e:Event):void
    {
        Box.x++;
    }
    

    通常,Flash播放器会尽量使FPS尽可能接近设置。但是,如果脚本(它是各种事件的处理程序,不仅可以输入\u帧,还可以输入键盘事件、鼠标/触摸输入、网络事件等)运行时间过长和/或渲染量过大,Flash Player将无法保持FPS正确。

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

    那么,你的问题的解决方案取决于你在那里尝试做什么,但在任何情况下 必须 完成任务,让Flash Player继续运行,以便您的应用程序正常运行。

        2
  •  1
  •   Olin Kirkland    6 年前

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

    stage.addEventListener(Event.ENTER_FRAME, function(e:Event):void {
      // Your code here
      // Called every frame
    });
    
        3
  •  1
  •   ZoriaRPG    6 年前

    另一点是,你不想要一个真正的无限循环。通常,您需要有条件的情况,以便用户可以退出。在C中,您将执行以下操作:

    extern quit;
    
    void init()
    {
        quit = 0;
    }
    
    //inside main()
    while(!quit)
    {
        //game functions
        //advance_frame();
    }
    

    如果玩家试图退出、死亡或赢得游戏,你会打破这个循环,每个都有一个唯一的值,例如退出=1表示正常退出,2表示死亡,3表示获胜;然后为每一个循环创建一个不同的循环(主循环内)。

    无限循环通常很少见,使用时应格外小心。通常,在任何情况下,您都希望有一条语句使它们退出。

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

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