![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: May 2013
Адрес: (0, 0)
Сообщений: 176
|
Есть главный класс, который отвечает за добавление и удаление дополнительных классов, таких как класс реализацией процесса игры, и класс с выбором уровней. Все просто, но есть одна проблема.
В выборе уровня кликаю по символу (в котором же присобачен слушатель MouseEvent.MOUSE_CLICK, потом этот символ диспатчит событие "CLICK_ME") а в классе выбора уровня его слушатель, который удаляет класс с выбором уровня и добавляет класс с самой игрой , после нажатия и перехода на класс с игрой , слушатели нажатия клавиш перестают отвечать, для этого нужно кликнуть по экрану , в итоге флэха отвечает на нажатия клавиш и все работает хорошо, перейдя в выбор уровней, а потом в игру, снова нужно кликнуть по экрану. Почему так происходит? В чем проблема? При этом если в символе событие MouseEvent.MOUSE_WHEEL, то в игре также нужно поводить мышкой чтобы заработало. НО если я при переходе в саму игру НЕ УДАЛЯЮ класс с выбором уровней, то все работает нормально. Почему, что меняется в этот раз меняется ? Не удаляются обработчик события клика? Я уже думал, что это из-за параметра события useCapture , но нет. Примеры: Класс с выбором уровня: public function addListener():void { this.icon.buttom.addEventListener(MouseEvent.MOUSE_DOWN, onClick); } public function onClick(event:MouseEvent):void { this.dispatchEvent( new Event("CLICK_ICON")); } public function Model(_stage:Stage) { this._stage = _stage; addMenu(); } public function addMenu():void { menu = new GameMenu(_stage); this.addChild(menu); menu.addListener(); menu.addEventListener("CLICK_ICON", onClickIcon); } public function delMenu():void { removeChild(menu); } public function onClickIcon(event:Event):void { this.removeEventListener("CLICK_ICON", onClickIcon); trace ("onClickIcon"); menu.addListener(); delMenu(); addCTR(); } public function addCTR():void { ctr = new ControllerForLevels(_stage); addChild(ctr); ctr.addlevel_1(); ctr.addEventListener("END_LEVEL", onEndLevel); } public function onEndLevel(event:Event):void { delCTR(); addMenu(); this.addChild(menu); } public function delCTR():void { removeChild(ctr); ctr.removeEventListener("END_LEVEL", onEndLevel); } Как быть? Заранее спасибо! Добавлено через 2 часа 36 минут Может кто сталкивался, подскажите, что не так |
|
|||||
|
Регистрация: Dec 2010
Адрес: Ярославль
Сообщений: 1,255
|
Слушатель вы вешаете на menu, а удаляете с this. Хотя, не думаю, что проблема в этом.
|
|
|||||
|
Регистрация: May 2013
Адрес: (0, 0)
Сообщений: 176
|
Цитата:
По твоему этого не должно быть? |
|
|||||
|
[+4 06.05.14]
|
По моему - почитайте, что такое модель прежде чем писать ересь. Код ужасен, нечитабелен и бредов. Неудивительно , что ничего нормально не работает.
Я удивляюсь современным игроделам, правда, чтоли все так на соплях держится?
__________________
Марк Tween |
|
|||||
|
Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
|
события мыши (клик, даун, ап и т.д) срабатывают лишь на том объекте, на который вы повешали слушателя, если слушателя вешаете на кнопку, а потом ее удаляете, то куда бы вы дальше не кликнули событие не сработает, аналогично с меню, каким образом оно должно работать если вы удалили меню? создали новый экран, на него и вешайте новое событие клика, удалили экран, удалили подписку на событие, опять создали , опять подписались. и Вообще - да код ужасен, советую не использовать MVC, пока не поймете как работают все классы, которые вы используете.
|
|
|||||
|
блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,113
Записей в блоге: 1
|
Цитата:
И сдается мне, никто из нас не писал чего-либо по всем правилам и канонам с первого раза. В общем, нельзя так.
__________________
hauts.ru |
|
|||||
|
Цитата:
Уже представляю, как ты вечерами хвастаешься друзьям, что всю ночь провозился с моделью ... @Автор, тащить в DisplayObject stage – дурная затея. У них stage уже есть, надо только дождаться, когда он станет доступен (событие ADDED_TO_STAGE). Проблема же сидит в такой штуке, как в фокусе. Чтобы проще понять – представь страницу с 2 текстовыми полями. При нажатии клавиш печататься символы будут в то поле, в котором есть фокус. Соответственно, при сих манипуляциях фокус теряется и события перестают выстреливать. Решение: вешать клавиши на stage. У неё всегда есть фокус.
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
|
Регистрация: May 2013
Адрес: (0, 0)
Сообщений: 176
|
Цитата:
На счет фокуса ты прав, спасибо, в этом то и была проблема. Да, если вешать клавиши на stage, то все работает, но в игре будет, уйма различных кнопок, а на сколько я помню, как утверждал Volsh на стейдж лучше ничего не размещать. Вот я и думаю, а не лучше ли будет просто изменять фокус, - stage.focus = нужный элемент; или все таки это будет не правильно, или предоставлять какие то проблемы? Вообщем, что лучше? |
|
|||||
|
Нет, подписываться на stage – вполне нормальная тема. У тебя есть ссылка на какой-то объект, так почему бы не послушать, что он там вещает?
Плохая затея что-то со stage делать – например, класть туда детей (addChild), или менять не знаю, прозрачность? ) Скорее всего об этом и говорил Wolsh. По хорошему, вообщем-то, вынести всю клавиатурную логику в отдельное место, в отдельный класс, который будет вещать уже всем желающим о клавиатуре. Клавиатура у пользователя одна, так что вполне уместно сделать класс полностью из статичных полей – и ссылок тянуть не надо. Почему это по хорошему? Ну, скажем, в будущем обнаружится, что если кнопку давить – то события начинают спамиться о том что кнопку быстро-быстро нажимают. Обычно этот эффект нежелателен, и в случае с отдельным классом вставить фикс придется только в этом одном месте.
__________________
Тут мужик танцует и поёт про флэш |
![]() |
![]() |
Часовой пояс GMT +4, время: 20:39. |
|
|
« Предыдущая тема | Следующая тема » |
|
|