当我执行这个特定循环时 Flash 挂起
Flash hangs when I execute this particular loop
如果这个问题很愚蠢,请原谅我,但我不知道该怎么做,这就是我问这个问题的原因。
在这里,我将一个小的白色方块声明为动画片段符号(点),我希望在整个屏幕上的特定间隙后生成它。
因此,当我在 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);
}
}
循环永远不会结束,因为 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);
}
如果这个问题很愚蠢,请原谅我,但我不知道该怎么做,这就是我问这个问题的原因。 在这里,我将一个小的白色方块声明为动画片段符号(点),我希望在整个屏幕上的特定间隙后生成它。 因此,当我在 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);
}
}
循环永远不会结束,因为 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);
}