【问题标题】:Keep getting error#1502 for this loop in as3在 as3 中不断收到此循环的错误 #1502
【发布时间】:2016-03-31 22:00:04
【问题描述】:

它应该是一个节奏游戏,当 mc 在舞台上时,布尔值不断地从 true 到 flash 来回切换,你必须在正确的时间抓住它。但我不断收到错误...

while (theBeat)
{
  if (theBeat.currentFrame < 5)
    {
    onBeat = true
    trace(onBeat)
    }

  if (theBeat.currentFrame > 5)
    {
    onBeat = false
    trace(onBeat)
    }
}

给我:

1502脚本已执行超过 15 秒。

【问题讨论】:

  • 在黑暗中射击:你的 while 循环永远不会停止,ui 线程被阻塞超过 15 秒,bam 错误 1502 别名“执行时间错误”。尝试改用 ENTER_FRAME 处理程序重写您的代码。
  • 所以每次我想要布尔值切换时我都必须纠正一个 ENTER_FRAME 函数?那会很痛苦。
  • @Galbert,没有 ENTER_Frame 替换了 While 循环。制作一个输入帧侦听器并将两个 IF 语句放在那里(最好删除跟踪 cos enter Frame 运行每个 SWF 的每个 FPS 并且会减慢 IDE 打印所有结果的速度,可能有一个改变颜色/可见性或其他的图形作为 false/true 的视觉提示)
  • 您无法使用 while 循环控制应用行为。当 while 循环运行时,应用程序视图永远不会更新。了解 AS3 中的线程执行。
  • while (theBeat) 是一个无限循环,如果您从未在循环内将theBeat 设置为null。什么是theBeat 以及如何使用onBeat?显示变量声明。

标签: actionscript-3 loops flash if-statement while-loop


【解决方案1】:

while (theBeat) 是一个无限循环,因为theBeat 永远不会从循环内部设置为null。无休止的循环冻结了 Flash Player。就像在 cmets 中已经提到的 DodgerThud 和 VC.One 一样,您需要随着时间的推移评估条件,例如使用 ENTER_FRAMETimer,而不是在单个循环中。

例子:

addEventListener(Event.ENTER_FRAME, enterFrame);

function enterFrame(e:Event):void {
    if (theBeat) {
        if (theBeat.currentFrame < 5) {
            onBeat = true;
        }
        if (theBeat.currentFrame > 5) {
            onBeat = false;
        }
        trace("onBeat:", onBeat);
    }
}

当事情停止时,只需删除处理程序:

removeEventListener(Event.ENTER_FRAME, enterFrame);

您可以使用Timer 每秒评估一次,如下所示:

var timer:Timer = new Timer(1000);
timer.start();
timer.addEventListener(TimerEvent.TIMER, timerHandler);

function timerHandler(e:TimerEvent):void {
    if (theBeat) {
        if (theBeat.currentFrame < 5) {
            onBeat = true;
        }
        if (theBeat.currentFrame > 5) {
            onBeat = false;
        }
        trace("onBeat:", onBeat);
        if (onBeat == true && spaceDown == true) {
            points++;
            trace("points:", points);
        }
    }
}

并停止计时器:

timer.stop();

【讨论】:

  • 但我不想让它停止。我希望它继续循环并根据歌曲的节拍打开和关闭布尔值。我是否只需要为歌曲的每个节拍复制/粘贴相同的功能?
  • 确实希望它完成循环,除非您想要无限期地冻结 Flash Player 并使整个 SWF 崩溃。 ;) ENTER_FRAME 将无限期地继续调度,以您的帧速率(例如每秒 30 次)执行函数,直到您将其删除。
  • 哦,明白了。谢谢!所以让它每个循环执行一次的唯一方法是让我的帧速率为 1fps?
  • “每个循环执行一次”——你的意思是“每秒执行一次”?如果您希望它以与您的帧速率不同的速率执行,您应该使用Timer。但是你为什么要这样做呢?
  • 因为我正在做一个积分系统,如果你在 onBeat == true 时点击空格键,你会得到一个积分。但是有了这个函数,当 onBeat 为真时,它会为你持有的每一帧提供分数,而不仅仅是一个。
猜你喜欢
  • 2015-05-01
  • 2011-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-27
  • 2021-11-06
  • 1970-01-01
  • 2020-10-03
相关资源
最近更新 更多