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

时间:2012-01-05 16:58:12

标签: actionscript-3 flash-cs4

所以我的库中有一个导出为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次。

谢谢

4 个答案:

答案 0 :(得分:1)

我似乎已经创建了一个_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);





        }
    }
}
}

答案 1 :(得分:1)

在您的代码中,您只创建一个框。你的enterFrame处理程序只是为它分配了16次新的随机位置。如果你想要16个盒子,你每次都需要在enterFrame函数中创建一个新盒子。

但是你不需要在这里使用ENTER_FRAME事件。您可以使用for loopwhile loop创建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循环来装箱。请注意,每次循环我都会创建一个新框,而不仅仅是重用旧框。我还为每个框添加了一个鼠标单击事件监听器,以便在单击时将其从舞台中删除。

你肯定想要改变其中的一些以使其适用于你的目的,但它应该让你朝着正确的方向前进。

答案 2 :(得分:0)

您目前所拥有的只是一遍又一遍地重新定位同一个框,因为您只创建了一个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);
            } 
        }
    }
}

答案 3 :(得分:0)

虽然变量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,要么大于if (boxAmount<=boxLimit) { // ... } else if (boxAmount > boxLimit) { // ... } 。检查两次相等是令人困惑的。没有必要包含最后一个else语句。它实际上与以下代码具有相同的行为。

{{1}}