как добавить ограниченное количество объектов на сцену - PullRequest
0 голосов
/ 05 января 2012

Итак, в моей библиотеке есть ящик, экспортированный как 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 ]

1 голос
/ 05 января 2012

Мне кажется, что вы создали один _box и повторно добавили его на временную шкалу при вводе фрейма.Это должно работать, если вы создаете новый экземпляр 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 голос
/ 05 января 2012

В вашем коде вы создаете только один блок. Ваш обработчик enterFrame просто присваивает ему новую случайную позицию 16 раз. Если вам нужно 16 блоков, вам нужно каждый раз создавать новый блок в функции enterFrame.

Но вам не нужно использовать здесь событие ENTER_FRAME. Вы можете просто использовать for loop или while 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 для создания ящиков. Обратите внимание, что каждый раз в цикле я создаю НОВЫЙ блок, а не просто повторно использую старый. Я также добавляю прослушиватель событий щелчка мыши в каждое поле, чтобы при щелчке его можно было удалить со сцены.

Вы наверняка захотите изменить это, чтобы оно работало в ваших целях, но оно должно направить вас в правильном направлении.

0 голосов
/ 05 января 2012

Хотя переменная 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) {
    // ...
}
0 голосов
/ 05 января 2012

В настоящий момент вы просто перемещаете одно и то же поле снова и снова, потому что вы создаете только один экземпляр 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);
            } 
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...