所以我在我的库中有一个框导出为Box。我试过:
package {
import flash.display.MovieClip;
import flash.events.*;
public class Main extends MovieClip {
private var _box:Box=new Box ;
private var boxAmount:Number=0;
private var boxLimit:Number=16;
private var _root:Object;
public function Main() {
addEventListener(Event.ENTER_FRAME, eFrame);
addEventListener(MouseEvent.MOUSE_DOWN, mouseclick);
}
private function eFrame(event:Event):void {
if (boxAmount <= boxLimit) {
boxAmount++;
_box.y=Math.random()*stage.stageHeight;
_box.x=Math.random()*stage.stageWidth;
addChild(_box);
} else if (boxAmount >= boxLimit) {
removeEventListener(Event.ENTER_FRAME, eFrame);
} else {
addEventListener(Event.ENTER_FRAME, eFrame);
}
}
}
}
但它没有按计划工作。
我想做的是让我的盒子留在舞台上随机位置的屏幕上,并在单击时将其删除(但稍后会(。此代码出于某种原因将对象添加到舞台,然后将其删除并再次添加最多 16 次。
谢谢
我似乎已经创建了一个_box,并将其重新添加到输入帧的时间线中。如果您在 eFrame 函数内而不是在它之前创建一个新的框实例,那么它应该可以工作,然后您继续重新分配给相同的变量名称,而不是重用一个对象,例如:
package {
import flash.display.MovieClip;
import flash.events.*;
public class Main extends MovieClip {
private var boxAmount:Number=0;
private var boxLimit:Number=16;
private var _root:Object;
public function Main() {
addEventListener(Event.ENTER_FRAME, eFrame);
addEventListener(MouseEvent.MOUSE_DOWN, mouseclick);
}
private function eFrame(event:Event):void {
if (boxAmount<=boxLimit) {
boxAmount++;
var _box:Box=new Box ;
_box.y=Math.random()*stage.stageHeight;
_box.x=Math.random()*stage.stageWidth;
addChild(_box);
} else if (boxAmount >= boxLimit) {
removeEventListener(Event.ENTER_FRAME, eFrame);
} else {
addEventListener(Event.ENTER_FRAME, eFrame);
}
}
}
}
在你的代码中,你只创建一个盒子。您的 enterFrame 处理程序只是为它分配一个新的随机位置 16 次。如果你想要 16 个框,则需要每次在 enterFrame 函数中创建一个新框。
但您不需要在此处使用 ENTER_FRAME 事件。你可以只使用 for 循环或 while 循环来创建 16 个盒子。
下面是一些代码:
package {
import flash.display.MovieClip;
import flash.events.*;
public class Main extends MovieClip {
private var boxAmount:Number=0;
private var boxLimit:Number=16;
public function Main() {
addBoxes();
}
private function addBoxes():void {
while (boxAmount<=boxLimit) {
boxAmount++;
var box:Box = new Box();
box.y=Math.random()*stage.stageHeight;
box.x=Math.random()*stage.stageWidth;
addChild(box);
// listen for mouse clicks
box.addEventListener(MouseEvent.CLICK, onBoxClick);
}
}
private function onBoxClick(e:MouseEvent):void {
var clickedBox:Box = e.target as Box;
removeChild(clickedBox);
}
}
}
我删除了您的 enterFrame 处理程序,并刚刚创建了一个名为 addBoxes
的函数。我正在使用一个while循环来装箱箱。请注意,每次通过循环时,我都会创建一个 NEW 框,而不仅仅是重用旧框。我还向每个框添加了一个鼠标单击事件侦听器,以便在单击时可以将其从舞台中删除。
你肯定会想改变其中的一些,让它为你的目的工作,但它应该让你朝着正确的方向前进。
您目前所拥有的只是一遍又一遍地重新定位同一个框,因为您只创建一个Box
实例。您需要创建多个Box
实例,并将它们分别添加到舞台中。
package {
import flash.display.MovieClip;
import flash.events.*;
public class Main extends MovieClip {
private var boxAmount:Number=0;
private var boxLimit:Number=16;
private var _root:Object;
public function Main() {
addEventListener(Event.ENTER_FRAME, eFrame);
addEventListener(MouseEvent.MOUSE_DOWN, mouseclick);
}
private function eFrame(event:Event):void {
if (boxAmount<=boxLimit) {
boxAmount++;
//create a new box instance
var _box:Box = new Box();
_box.y=Math.random()*stage.stageHeight;
_box.x=Math.random()*stage.stageWidth;
addChild(_box);
} else {
removeEventListener(Event.ENTER_FRAME, eFrame);
}
}
}
}
尽管变量boxAmount
另有建议,但您说您只需要一个框。因此,要做到这一点,您只需要将以下行移动到构造函数 ( Main
(。
_box.y=Math.random()*stage.stageHeight;
_box.x=Math.random()*stage.stageWidth;
addChild(_box);
然后删除或禁用输入帧事件。在这种情况下,您不需要它。要检查该框是否已被单击,请将侦听器附加到该框本身,而不是其父项:
_box.addEventListener(MouseEvent.MOUSE_DOWN, mouseclick);
if (boxAmount<=boxLimit) {
// ...
} else if (boxAmount >= boxLimit) {
// ...
} else {
// ...
}
这部分看起来真的很奇怪。第一个条件涵盖了第二个条件也涵盖的情况,它们一起已经涵盖了所有可能的情况。 boxAmount
要么小于或等于boxLimits
,要么大于。两次检查相等性是令人困惑的。没有必要包含最后一个 else 语句。它实际上具有与以下代码相同的行为。
if (boxAmount<=boxLimit) {
// ...
} else if (boxAmount > boxLimit) {
// ...
}