Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   как создать кнопку с семью состояниями? (http://www.flasher.ru/forum/showthread.php?t=157361)

filepark 04.06.2011 14:48

как создать кнопку с семью состояниями?
 
Пожалуйста, присоветуйте, как сделать кнопку, чтобы у неё было семь состояний: отжата (“_up”, “_over”, “_down”) , нажата (“_up”, “_over”, “_down”) , отключена. Первое, что приходит в голову: написать класс расширяющий Sprite, в котором создать три объекта: Sprite изображающий отключенное состояние и два Simple Button - один “кнопка нажата”, другой “кнопка отжата”. Красота!, нужно добавить всего лишь один слушатель MouseEvent.MOUSE_UP и добавлять/удалять один из трёх означенных объектов из списка отображения в зависимости от ситуации. Одна беда: если отпустить кнопку мыши над такой кнопкой сначала Simple Button вернётся в состояние “_over”, только потом наступит событие MOUSE_UP, т.е. я не успеваю удалить объект Simple Button из списка отображения, до того как он вернётся в “_over” - как результат, моргает!

Но думается мне, так кнопки строить “неправильно”, подскажите как “правильно”, схему в общих чертах.

Dukobpa3 04.06.2011 14:59

Спрайт, семь картинок, смена вида по событиям.

Плюс параметр "состояние", при смене состояния отжата/нажата/отключена - менять подписки на события.

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

goodguy 04.06.2011 15:02

Забить на SimpleButton - ибо это вообще хлам.
Создать 2 мувика - один для отображения состояний кнопки если она не нажата, другой для всех состояний когда нажата. Добавить оба мувика в один спрайт, но у одного из них сделать свойство visible = false;
при изменении состояний нажата / не нажата менять у них свойство visible.
Код AS3:

pressedButton.visible = false;
unpressedButton.visible = true;

Этот вариант проще всего.

Dukobpa3 04.06.2011 15:08

goodguy, кажись это не отличается ничем от того что автор делает ;) Только и того что вместо батона свои мувики.

filepark 04.06.2011 17:13

Dukobpa3 Да, но в описанном мной методе есть одно преимущество: всё, что касается отображения кнопок (события “_up”, “_over”, “_down”) находится внутри класса, вне объекта кнопки мне нужно лишь слушать MOUSE_UP, из родителя кнопки (меню, например, где этих кнопок может быть много) сказать объекту кнопки, в каком она состоянии, нажатом, отжатом или выключена. Один слушатель на всё меню.

В описанном же Вами методе мне придётся в родителе (в меню, например) создать три слушателя и управлять всеми семью состояниями из родителя. Т.е. по сути, можно вообще обойтись без класса кнопки. Не буду же я в каждой кнопке ставить по три слушателя, у меня этих кнопок уже несколько десятков в четырёх меню. Я раньше делал MovieClip с семью кадрами, по сути тоже самое.

Впрочем, я спрашиваю как “правильно”, т.е. профессионально, если сказанное Вами так и есть, что ж смирюсь, буду делать так.

Dukobpa3 04.06.2011 17:21

Один раз создать класс "awesomeButtonWith7States" и потом его пользовать никто не запрещал:))

Создать такой вот класс с семью кадрами/картинками
Один раз попариться продумать кто чего там слушает и как реагирует
А потом все ваши менюшки делать из этих кнопок.

Только надо еще озадачитсья чтоб кнопка слала ивенты наружу какие-то типа "батон_в_зажатом_состоянии_кликнули"/"батон_в_отпущенном_состоянии_кликнули"

А не просто на клики по ним подписываться, ибо если просто на клики то придется еще и в родителе доп-аналитику вести в каком же состоянии была кнопка когда по ней кликнули.

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

filepark 04.06.2011 17:34

т.е придётся в каждой кнопке ставить свои три слушателя... надеялся этого избежать... понятно, спасибо.

Dukobpa3 04.06.2011 17:38

Я не совсем понимаю что должно получиться в итоге....

У кнопки семь состояний но работать она должна как обычная кнопка что ли?

Есть еще такое понятие как бабблинг чтоб можно было слушать не каждую кнопку а меню в целом....

Огласите пожалуйста весь список задач.

Добавлено через 8 минут
есть класс "крутая кнопка"
в этом классе есть семь картинок-спрайтов-мувиков - как вам удобнее
этот класс слушает свои события либо события этих картинок и меняет свой вид в зависимости от этого
так это этот класс опять же сам себя слушаетна предмет кликов, и в зависимости от текущего состояни отправляет наружу событие "кликнули зажатую кнопку"/"кликнули отжатую кнопку" - это событие должны быть bubbles = true - чтобы всплывало по дисплей листу пока его не остановят

всё.

Теперь есть класс меню, у которого внутри есть пачка этих кнопок, и дальше уже в зависимости от набора задач меню оно может либо само слушать события этих кнопок (именно те которые продиспатчили вручную("кликнули зажатую кнопку"/"кликнули отжатую кнопку"), а не клики, это два события на кнопку), или же в меню можно вообще кнопки не слушать, а слушать просто само меню в родителе меню. Родитель в котором будет лежать меню получит все события кнопок (для этого нам выше нужно было bubbles = true). И как-то отреагирует на них.

Добавлено через 10 минут
Цитата:

т.е придётся в каждой кнопке ставить свои три слушателя... надеялся этого избежать...
И чего избегать то? Кнопка должна быть мертвым грузом на сцене и молчать? Как же она с внешним миром будет общаться кроме событий.

goodguy 04.06.2011 18:05

Цитата:

Сообщение от Dukobpa3 (Сообщение 1001169)
goodguy, кажись это не отличается ничем от того что автор делает ;) Только и того что вместо батона свои мувики.

Да, но мувики можно контролировать как хочешь, а эти кнопки себя всегда ведут одинаково

filepark 04.06.2011 18:15

Об этом я и говорю. Каждая кнопка может быть нажата, отжата и выключена. Сейчас у меня один слушатель в меню MOUSE_UP, который смотрит какую кнопку кликнули, при этом диспатчит событие в объект основного класса. Там думают, и говорят сначала меню, а тот, в свою очередь, этой и другим кнопкам, в какое состояние им перевестись (нажата, отжата и выключена). Сейчас ни меню, ни вышестоящего родителя совершенно не интересует, как и когда каждая кнопка будет отображать события “_up”, “_over”, “_down”, - это дело самой кнопки, в зависимости от состояния.

Если же я буду делать спрайт с семью картинками (или семикадровый мувиклип), то мне придётся либо в каждой кнопке установить по три слушателя (MOUSE_OVER , MOUSE_OUT, MOUSE_UP), при этом слушателей будет очень много. Либо передать эти функции вышестоящему меню, но тогда класс кнопки вовсе будет не нужен. Меню будет говорить каждой кнопке в каком из семи состояний ей быть, что по-моему, очень неудобно.

Флуд: К сожалению, я не знаю как работает Simple Button и насколько меньше памяти будет тратиться на использование двух Simple Button (по моему теперешному рецепту), по сравнению с использованием Sprite с тремя слушателями. :-(. Я не знаю какое событие диспатчит Simple Button (и диспатчит ли вообще) когда над ним отпускается кнопка мыши, его можно было бы остановить и предотвратить переход из состояния “_down” в “_over” (это единственное, что меня сейчас неустраивает). Но я предполагаю, что мой подход в корне неправильный, потому и спрашиваю, как правильно.


Часовой пояс GMT +4, время: 10:06.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.