执行此特定循环时,Flash挂起

时间:2016-02-22 06:15:36

标签: actionscript-3 flash

如果这个问题非常愚蠢,请原谅我,但我无法弄清楚该怎么做,这就是我问的原因。 在这里,我宣布一个小的白色方块作为一个动画片段符号(Dot),我希望在整个屏幕上的特定间隙之后生成它。 因此,当我在Flash CS6上执行此(测试它)代码时,它会挂起。在那之后,我将被迫结束该计划而不做任何进一步的事情。

import flash.ui.*;
stop();
Mouse.hide();
var ctX:int = 0,ctY:int = 0,done:Boolean = false;
var base:Object = MovieClip(root);
this.addEventListener(Event.ENTER_FRAME, eFrame);
function eFrame(event:Event):void
{
    while (done == false)
    {
        var dots:Dot = new Dot  ;
        dots.x +=  (50 * ctX);
        dots.y +=  (50 * ctY);
        ctX++;
        if (ctX == 11)
        {
            ctX = 0;
            ctY++;
        }
        else if (ctX == 11 && ctY == 10)
        {
            done = true;
            break;
        }
        stage.addChild(dots);
    }
}

提前谢谢你。  I have attached a screenshot of the situation.

1 个答案:

答案 0 :(得分:1)

循环永远不会完成,因为done=true的条件是ctX==11,但ctX==11导致ctX=0在第一个条件中:

if (ctX == 11) // when ctX is 11
{
    ctX = 0; // ctX is reset to 0
    ctY++;
}
else if (ctX == 11 && ctY == 10) // so you will never have ctX=11 here
{
    done = true;
    break; // (Tip: you don't need `done` since `break` exits the loop)
}

你可以通过交换条件来解决这个问题,但我认为使用while循环是不必要的复杂和脆弱的。为什么不直接使用两个for循环:

for (var ctX:int = 0; ctX < 11; ctX++) {
    for (var ctY:int = 0; ctY < 11; ctY++) {
        var dots:Dot = new Dot();
        dots.x = (50 * ctX);
        dots.y = (50 * ctY);
        stage.addChild(dots);
    }
}

这更清晰,更不易碎,因为循环是固定的长度。

你甚至可以用一个for循环和一点点数学来做,但是你会失去一些清晰度:

for (var i:int = 0; i < 11 * 11; i++) {
    var dots:Dot = new Dot();
    dots.x = (50 * (i % 11));
    dots.y = (50 * int(i / 11));
    stage.addChild(dots);
}