Форум 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=215798)

Appleman 05.07.2021 00:35

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

Есть основной экран игры, на нём элементы пользовательского интерфейса, на них висят слушатели событий клика. Игрок вызвал главное меню, меню появилось на экране. До тех пор, пока пользователь не вернётся в игру, никакие элементы игрового интерфейса не должны действовать. Вопрос, как наиболее технологично временно приостановить их работу, не убирая с экрана? Снимать слушатели событий, выставлять EnableMouse в false? Уверен, что подобную проблему многие решали и имеют обоснованные рекомендации.

Спасибо.

Wolsh 05.07.2021 03:31

Ну так, если у тебя есть контроллер игрового интерфейса (HUD) логично в нем иметь методы activate/deactivate, контроллеры чуть ли не для этого и придумали)) А вот "жизнь" в модели ты как останавливаешь, или у тебя нет таймера? Ну, я имею ввиду, что такие вещи как "пауза" в игре должны быть естественным образом предусмотрены, если это не "пятнашки" конечно. Должен же быть какой-то "главный" контроллер, не игрового процесса, а Игры в смысле Приложения.. и способность создавать, запускать, останавливать и начинать заново Игровой процесс (и сохранять и загружать сейвы) — его непосредственная задача. Это как плеер, в котором проигрывается игра.
Возможно, ты работал над игровым процессо м все это время и не задумывался ни о какой "паузе". Ну, значит пришло время подумать)) ведь надо не только мышь оглушить, но и все процессы остановить. чтобы враг там тебя не растерзал, пока ты в меню ковыряешься.

Appleman 05.07.2021 13:26

У меня игровая механика немного иная. Читаешь текст, смотришь арт, выбираешь вариант действий. После этого Модель всё рассчитывает, создаёт вектор инструкций для Вью и отправляет событие. Вью его хватает и разбирает поштучно: обновляется текст, обновляется арт, всякие шкалы-иконки каждого из персонажей. Ну и так далее. Так что главного таймера как такового нет.

На счёт методов activate/deactivate разумно, но я имел в виду вопрос реализации на более приземлённом уровне, внутри этих методов. Нормально будет снимать, а затем обратно вешать слушатели событий или есть какие-то более элегантные способы?

Wolsh 05.07.2021 14:57

А, могут быть визуальные проблемы из-за обработки мыши ВНУТРИ вью — всякие там ховеры/клики на кнопках и звуки.
И это уже проблема Вью, согласен, для нее подходит определение "более приземленного уровня". Это не имеет к MVC отношения, делай как удобно на уровне вьюхи.

Appleman 05.07.2021 16:43

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

И ещё, ты наверняка видел мои вопросы в соседней теме на счёт кто кого создаёт. Я чего-то уже всю голову сломал, мне нужен совет. Поясню. Если речь идёт о чисто внутриигровых компонентах, которые сами по себе имеют иерархическую структуру (например MVC персонажа внутри MVC игрового процесса), то описанный подход (вью создаёт вью, модель - модель) работает прекрасно.

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

Wolsh 06.07.2021 02:50

Ну тут как однозначно скажешь? Зависит от твоей реализации. Понятно, что самый простой способ — кинуть mouseEnabled/mouseChildren прямо на контейнер. Ну а если например кнопочки умеют показывать визуально свое неактивное состояние, то их же надо лично каждую в это состояние перевести. Или, например, однажды возикнет странное желание отключить НЕ ВСЕ кнопочки.
Отписываться, потом опять подписываться, это конечно диковато, как будто ты создаешь партизанский бестелесный контроллер внутри Вью. Я бы использовал для дисплейных объектов дисплейные методы (mouseEnabled/mouseChildren) и не парился. Тебе же нужно не распределение Событий отредактировать, а тупо спрятать объекты от мыши.

Appleman 06.07.2021 10:13

Цитата:

Сообщение от Wolsh (Сообщение 1206928)
Я бы использовал для дисплейных объектов дисплейные методы (mouseEnabled/mouseChildren) и не парился. Тебе же нужно не распределение Событий отредактировать, а тупо спрятать объекты от мыши.

Спасибо. Вот и я вчера пришёл к тому же. Посмотрел код и вспомнилось, что помимо нажатий, у меня ещё висят слушатели событий наведения мыши, плюс отдельно иконки регистрируются в классе Tooltips, а там ещё чуть ли не 3 слушателя. Всё это снимать и ставить - порнография.

undefined 06.07.2021 22:59

может ляпну не в тему, но обычно UI можно заблочить прозрачным спрайтом на весь экран

Appleman 07.07.2021 13:29

Хм... Какая-то, господа, у меня пока фигня получается.

Вопрос заглушить решился просто - назначением mouseChildren = false самому старшему в иерархии контейнеру. Но проблема возникла в момент, когда всё потребовалось вернуть обратно. Вариант присвоить true почему-то не работает. Пока не понимаю, почему... :(

undefined 07.07.2021 14:27

попробуй поиграться с mouseEnabled. Он обычно в паре с mouseChildren идет


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

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