如何向舞台添加有限数量的对象



所以我在我的库中有一个框导出为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) {
    // ...
}

最新更新