Flash Actionscript 3 Включение / выключение кнопок меню - PullRequest
1 голос
/ 25 декабря 2010

Это, наверное, действительно просто, но я не могу понять это.Взгляните на код, я переместил 2 экземпляра этого класса кнопок (CategoryButton) на сцену.Как вы можете видеть, когда вы нажимаете кнопку, она должна идти в AndPlay (3), записывать себя как selectedBtn.Когда нажата вторая кнопка, она должна снова включить прослушиватель для первой кнопки, удалить слушателей для себя и установить себя в качестве вновь выбранной кнопки.К сожалению, этот код не делает этого.Когда я нажимаю на первую кнопку, она перемещает кнопку в кадр 3 и удаляет своих слушателей.Я нажимаю вторую кнопку, и она делает то же самое, за исключением того, что она не добавляет слушателей для первой кнопки снова.

Я новичок в AS3, любая помощь очень ценится, спасибо.

package classes {
    import flash.events.MouseEvent;
    import flash.display.MovieClip;
    import flash.display.Sprite;

    public class CategoryButton extends MovieClip{

        //this stores the currently selected button
        public var selectedBtn:Object;

        public function CategoryButton() {
            // listen for over
            addEventListener(MouseEvent.MOUSE_OVER, rolloverToggle);

        }

        protected function rolloverToggle(event:MouseEvent):void {
            gotoAndStop(2);
            removeEventListener(MouseEvent.MOUSE_OVER, rolloverToggle);
            addEventListener(MouseEvent.MOUSE_OUT, rolloutToggle);
            addEventListener(MouseEvent.CLICK, buttonToggle);
        }

        protected function rolloutToggle(event:MouseEvent):void {
            gotoAndStop(1);
            removeEventListener(MouseEvent.MOUSE_OUT, rolloutToggle);
            addEventListener(MouseEvent.MOUSE_OVER, rolloverToggle);
        }

        protected function buttonToggle(event:MouseEvent):void {
            if(selectedBtn) {
                trace(selectedBtn.name)
                selectedBtn.addEventListener(MouseEvent.MOUSE_OVER, rolloverToggle);
                selectedBtn.gotoAndStop(1);

                event.currentTarget.removeEventListener(MouseEvent.MOUSE_OUT, rolloutToggle);
                event.currentTarget.removeEventListener(MouseEvent.MOUSE_OVER, rolloverToggle);
                event.currentTarget.removeEventListener(MouseEvent.CLICK, buttonToggle);

                event.currentTarget.gotoAndStop(3);

                selectedBtn = event.currentTarget;
            }else {

                selectedBtn = event.currentTarget;
                trace(selectedBtn.name);
                selectedBtn.removeEventListener(MouseEvent.MOUSE_OUT, rolloutToggle);
                selectedBtn.removeEventListener(MouseEvent.MOUSE_OVER, rolloverToggle);
                selectedBtn.removeEventListener(MouseEvent.CLICK, buttonToggle);

                selectedBtn.gotoAndStop(3);
            }
        }

    }

}

Ответы [ 2 ]

1 голос
/ 25 декабря 2010

Как я это исправил:

  1. Нажата кнопка A (A установлена ​​как selectedBtn, слушатели отключены, состояние изменено на кадр 3)
  2. Нажата кнопка B (слушатель selectedBtn сброшен, состояние изменено, selectedBtn установлен на кнопку B)

Вот где проблема, слушатель А был настроен следующим образом:

addEventListener(MouseEvent.MOUSE_OVER, rolloverToggle);

Это привело к тому, что Кнопка B снова ожила. Исправление состояло в том, чтобы просто изменить прослушиватель на currentTarget, а также gotoAndStop, для состояний over и out.

event.currentTarget.gotoAndStop(1);
event.currentTarget.removeEventListener(MouseEvent.MOUSE_OUT, rolloutToggle);


package classes {
import flash.events.MouseEvent;
import flash.display.MovieClip;
import flash.display.Sprite;

public class CategoryButton extends MovieClip{

    //this stores the currently selected button
    public static var selectedBtn:Object;

    public function CategoryButton() {
        // listen for over
        addEventListener(MouseEvent.MOUSE_OVER, rolloverToggle);
        trace("called");

    }

    protected function rolloverToggle(event:MouseEvent):void {
        event.currentTarget.gotoAndStop(2);
        event.currentTarget.removeEventListener(MouseEvent.MOUSE_OVER, rolloverToggle);
        event.currentTarget.addEventListener(MouseEvent.MOUSE_OUT, rolloutToggle);
        event.currentTarget.addEventListener(MouseEvent.CLICK, buttonToggle);
    }

    protected function rolloutToggle(event:MouseEvent):void {
        event.currentTarget.gotoAndStop(1);
        event.currentTarget.removeEventListener(MouseEvent.MOUSE_OUT, rolloutToggle);
        event.currentTarget.addEventListener(MouseEvent.MOUSE_OVER, rolloverToggle);
    }

    protected function buttonToggle(event:MouseEvent):void {
        if(selectedBtn) {
            trace(selectedBtn.name);
            selectedBtn.addEventListener(MouseEvent.MOUSE_OVER, rolloverToggle);
            selectedBtn.gotoAndStop(1);

            event.currentTarget.removeEventListener(MouseEvent.MOUSE_OUT, rolloutToggle);
            event.currentTarget.removeEventListener(MouseEvent.MOUSE_OVER, rolloverToggle);
            event.currentTarget.removeEventListener(MouseEvent.CLICK, buttonToggle);

            event.currentTarget.gotoAndStop(3);

            selectedBtn = event.currentTarget;
        }else {

            selectedBtn = event.currentTarget;
            selectedBtn.removeEventListener(MouseEvent.MOUSE_OUT, rolloutToggle);
            selectedBtn.removeEventListener(MouseEvent.MOUSE_OVER, rolloverToggle);
            selectedBtn.removeEventListener(MouseEvent.CLICK, buttonToggle);

            selectedBtn.gotoAndStop(3);

        }
    }

}

}

1 голос
/ 25 декабря 2010

Я сам не очень знаком с AS3, но, возможно, что-то идет не так, когда вы пытаетесь выполнить логический тест для вашего объекта selectedBtn if(selectedBtn).Почему бы не иметь переменную-член, такую ​​как «is_selected_button», которая отслеживает состояние кнопки, а затем проверять ее в своем операторе if вместо проверки объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...