Лучшие практики для приостановки кнопок в ActionScript 3 - PullRequest
1 голос
/ 04 октября 2009

Есть ли лучший способ настроить флеш-проект с большим количеством навигации, чем это нужно?:

bottomNav.contact_btn.addEventListener(MouseEvent.CLICK, changeContent);
bottomNav.portfolio_btn.addEventListener(MouseEvent.CLICK, changeContent);
bottomNav.news_btn.addEventListener(MouseEvent.CLICK, changeContent);
bottomNav.inspiration_btn.addEventListener(MouseEvent.CLICK, changeContent);
bottomNav.home_btn.addEventListener(MouseEvent.CLICK, changeContent);


secondaryNav.about_btn.addEventListener(MouseEvent.CLICK, changeContent);
secondaryNav.services_btn.addEventListener(MouseEvent.CLICK, changeContent);
secondaryNav.home_btn.addEventListener(MouseEvent.CLICK, changeContent);

secondaryNav.inspiration_btn.addEventListener(MouseEvent.CLICK, changeContent);
secondaryNav.inspiration_archive_btn.addEventListener(MouseEvent.CLICK, changeContent);
secondaryNav.portfolio_showcase_btn.addEventListener(MouseEvent.CLICK, changeContent);
secondaryNav.portfolio_archive_btn.addEventListener(MouseEvent.CLICK, changeContent);

и если нет, то между моментами анимации всегда бывают моменты, когда последнее, что вы хотите сделать, - это чтобы кто-то нажал кнопку и включил другую функцию в середине вашей красивой очистки между двумя сценами. Вы заканчиваете (или по крайней мере я делаю) бесчисленные ошибки и разозлили клиента.

Что вы делаете, чтобы приостановить всех этих слушателей, не добавляя функцию в конец каждой другой функции, чтобы временно отключить их?

Пожалуйста, если у кого-то есть магическая практика, я бы хотел ее услышать.

относительно того, как я это делаю, я писал что-то вроде этого:

function suspendBtns():void
{
secondaryNav.inspiration_archive_btn.removeEventListener(MouseEvent.CLICK, changeContent);
secondaryNav.portfolio_showcase_btn.removeEventListener(MouseEvent.CLICK, changeContent);
secondaryNav.portfolio_archive_btn.removeEventListener(MouseEvent.CLICK, changeContent);

}

и добавит suspendBtns(); до конца каждой функции, которая будет переходить между клипами.
тогда, очевидно, другая функция с именем enactBtns() или что-то в этом роде.

Я пытался один раз просто добавить одного слушателя событий на сцену:

stage.addEventListner(MouseEvent.CLICK, doFunction);

и тогда функция найдет имя btn, например:

function doFunction(e:Event):void{

 switch(e.target.name){     
    case"home_btn":
    doThis();
    break;

    case"away_btn":
    doThat();
    break;

  }

}

и так далее. Это не сработало так хорошо, как будто мне нужно было нажать каждую кнопку дважды, чтобы она заработала.

И мне все еще пришлось приостановить прослушиватель событий между действиями.

Ответы [ 4 ]

2 голосов
/ 04 октября 2009

Альтернативой удалению слушателей, чтобы временно отключить кнопки, как в приведенной выше функции suspendBtns, является установка mouseEnabled в false.

так вместо:

function suspendBtns():void
{
secondaryNav.inspiration_archive_btn.removeEventListener(MouseEvent.CLICK, changeContent);
secondaryNav.portfolio_showcase_btn.removeEventListener(MouseEvent.CLICK, changeContent);
secondaryNav.portfolio_archive_btn.removeEventListener(MouseEvent.CLICK, changeContent);
}

... у вас будет:

function suspendBtns():void
{
secondaryNav.inspiration_archive_btn.mouseEnabled = false;
secondaryNav.portfolio_showcase_btn.mouseEnabled = false;
secondaryNav.portfolio_archive_btn.mouseEnabled = false;
}

Таким образом, функции suspendBtns не нужно будет знать, какие прослушиватели удалить, и, соответственно, добавить их снова, когда кнопки должны быть снова включены. Он также отключит другие MouseEvent, такие как MOUSE_OVER и т. Д.

И я бы также рекомендовал хранить кнопки в массиве, как предложили Аллан и Тахир.

0 голосов
/ 04 октября 2009

Простой логический флаг, такой как ignoreUI, также будет работать. В коде события проверьте ignoreUI, чтобы увидеть, должна ли функция немедленно вернуться. Таким образом, ничего не произойдет, если пользователь нажмет кнопку, раскрывающийся список и т. Д., Если этого не произойдет.

0 голосов
/ 04 октября 2009

Я часто вижу эту ошибку на флеш сайтах и ​​думаю, что это следует считать ошибкой.

Я бы не согласился с булевым флагом, потому что даже с этой булевой проверкой сработали бы эффекты ролловера и свертывания (и мне не хотелось бы, чтобы они были включены, когда происходит переход).

Что я делаю в своих проектах Flash, так это то, что все мои кнопки расширяют класс SimpleButton публичными функциями, такими как и. В рамках этих общедоступных функций я назначаю и удаляю всех слушателей при опрокидывании / выводе / нажатии / отпускании, чтобы эти функции стали доступны для всех кнопок.

Кроме того, при отправке событий щелчка и т. Д. Я расширяю класс Event и передаю дополнительный аргумент родительскому классу, чтобы он знал, какая кнопка была нажата. Этот родительский класс может отслеживать, какая кнопка активна сейчас, а какая была последней, в переменных типа activeButton_New и activeButton_Last для хранения их числового значения.

И, да, все они должны быть в массиве, поэтому их довольно легко назначать / удалять, что-то вроде этого:

for ( var i:int = 0; i < this.arrayForButtons.length; i ++ )
{
 SimpleButton ( this.arrayForButtons[ i ] ).removeListeners ();
}

и наоборот для назначения слушателей.

0 голосов
/ 04 октября 2009

Возможно, чтобы сохранить набор текста, вы можете нажать все кнопки в массиве. Тогда, когда вы добавляете или удаляете слушателей, вы можете циклически проходить через каждый элемент массива с помощью простого цикла for?

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