Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 18.11.2013, 21:12
zCHESNOKz вне форума Посмотреть профиль Отправить личное сообщение для zCHESNOKz Посетить домашнюю страницу zCHESNOKz Найти все сообщения от zCHESNOKz
  № 1  
Ответить с цитированием
zCHESNOKz
 
Аватар для zCHESNOKz

Регистрация: May 2013
Адрес: (0, 0)
Сообщений: 176
По умолчанию Как объяснить двойное срабатывание события (MouseEvent) ?

Есть главный класс, который отвечает за добавление и удаление дополнительных классов, таких как класс реализацией процесса игры, и класс с выбором уровней. Все просто, но есть одна проблема.

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

Почему так происходит? В чем проблема? При этом если в символе событие MouseEvent.MOUSE_WHEEL, то в игре также нужно поводить мышкой чтобы заработало.

НО если я при переходе в саму игру НЕ УДАЛЯЮ класс с выбором уровней, то все работает нормально. Почему, что меняется в этот раз меняется ? Не удаляются обработчик события клика?

Я уже думал, что это из-за параметра события useCapture , но нет.

Примеры:

Класс с выбором уровня:


Код AS3:
 public function addListener():void
		{
			this.icon.buttom.addEventListener(MouseEvent.MOUSE_DOWN, onClick);
		}
 
		public function onClick(event:MouseEvent):void
		{
			this.dispatchEvent( new Event("CLICK_ICON"));
		}
Главный класс, который отвечает за переход:

Код AS3:
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 минут
Может кто сталкивался, подскажите, что не так

Старый 18.11.2013, 23:51
illuzor вне форума Посмотреть профиль Отправить личное сообщение для illuzor Найти все сообщения от illuzor
  № 2  
Ответить с цитированием
illuzor
 
Аватар для illuzor

Регистрация: Dec 2010
Адрес: Ярославль
Сообщений: 1,255
Код AS3:
menu.addEventListener("CLICK_ICON", onClickIcon);
Код AS3:
this.removeEventListener("CLICK_ICON", onClickIcon);
Слушатель вы вешаете на menu, а удаляете с this. Хотя, не думаю, что проблема в этом.

Старый 19.11.2013, 00:00
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 3  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Проблема в коде, особенно в классе Model который принимает стейдж в конструкторе.
__________________
Марк Tween

Старый 19.11.2013, 00:31
zCHESNOKz вне форума Посмотреть профиль Отправить личное сообщение для zCHESNOKz Посетить домашнюю страницу zCHESNOKz Найти все сообщения от zCHESNOKz
  № 4  
Ответить с цитированием
zCHESNOKz
 
Аватар для zCHESNOKz

Регистрация: May 2013
Адрес: (0, 0)
Сообщений: 176
Цитата:
Сообщение от in4core Посмотреть сообщение
Проблема в коде, особенно в классе Model который принимает стейдж в конструкторе.

По твоему этого не должно быть?

Старый 19.11.2013, 00:58
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 5  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
По моему - почитайте, что такое модель прежде чем писать ересь. Код ужасен, нечитабелен и бредов. Неудивительно , что ничего нормально не работает.
Я удивляюсь современным игроделам, правда, чтоли все так на соплях держится?
__________________
Марк Tween

Старый 19.11.2013, 10:44
Isfet вне форума Посмотреть профиль Отправить личное сообщение для Isfet Найти все сообщения от Isfet
  № 6  
Ответить с цитированием
Isfet

Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
события мыши (клик, даун, ап и т.д) срабатывают лишь на том объекте, на который вы повешали слушателя, если слушателя вешаете на кнопку, а потом ее удаляете, то куда бы вы дальше не кликнули событие не сработает, аналогично с меню, каким образом оно должно работать если вы удалили меню? создали новый экран, на него и вешайте новое событие клика, удалили экран, удалили подписку на событие, опять создали , опять подписались. и Вообще - да код ужасен, советую не использовать MVC, пока не поймете как работают все классы, которые вы используете.

Старый 19.11.2013, 11:28
Hauts вне форума Посмотреть профиль Отправить личное сообщение для Hauts Посетить домашнюю страницу Hauts Найти все сообщения от Hauts
  № 7  
Ответить с цитированием
Hauts
 
Аватар для Hauts

блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,113
Записей в блоге: 1
Отправить сообщение для Hauts с помощью ICQ Отправить сообщение для Hauts с помощью Skype™
Цитата:
По моему - почитайте, что такое модель прежде чем писать ересь. Код ужасен, нечитабелен и бредов. Неудивительно , что ничего нормально не работает.
Я удивляюсь современным игроделам, правда, чтоли все так на соплях держится?
Весьма смелое и грубое утверждение, учитывая, что человек учится и спрашивает, как сделать лучше. Да и судить про "современных игроделов" и про то, на чем "всё" дежрится — это смело. Я б себе такого не позволил.

И сдается мне, никто из нас не писал чего-либо по всем правилам и канонам с первого раза. В общем, нельзя так.
__________________
hauts.ru

Старый 19.11.2013, 11:36
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 8  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,599
Записей в блоге: 17
Цитата:
Сообщение от in4core
Проблема в коде, особенно в классе Model который принимает стейдж в конструкторе.
А ещё там проблёскивает наследование от дисплей обджекта, а, следовательно, узкое мышление о том, что модель – это модель данных – здесь не работает.
Уже представляю, как ты вечерами хвастаешься друзьям, что всю ночь провозился с моделью ...

@Автор, тащить в DisplayObject stage – дурная затея. У них stage уже есть, надо только дождаться, когда он станет доступен (событие ADDED_TO_STAGE).
Проблема же сидит в такой штуке, как в фокусе. Чтобы проще понять – представь страницу с 2 текстовыми полями. При нажатии клавиш печататься символы будут в то поле, в котором есть фокус. Соответственно, при сих манипуляциях фокус теряется и события перестают выстреливать.
Решение: вешать клавиши на stage. У неё всегда есть фокус.

Старый 19.11.2013, 13:19
zCHESNOKz вне форума Посмотреть профиль Отправить личное сообщение для zCHESNOKz Посетить домашнюю страницу zCHESNOKz Найти все сообщения от zCHESNOKz
  № 9  
Ответить с цитированием
zCHESNOKz
 
Аватар для zCHESNOKz

Регистрация: May 2013
Адрес: (0, 0)
Сообщений: 176
Цитата:
Сообщение от Psycho Tiger Посмотреть сообщение
А ещё там проблёскивает наследование от дисплей обджекта, а, следовательно, узкое мышление о том, что модель – это модель данных – здесь не работает.
Уже представляю, как ты вечерами хвастаешься друзьям, что всю ночь провозился с моделью ...

@Автор, тащить в DisplayObject stage – дурная затея. У них stage уже есть, надо только дождаться, когда он станет доступен (событие ADDED_TO_STAGE).
Проблема же сидит в такой штуке, как в фокусе. Чтобы проще понять – представь страницу с 2 текстовыми полями. При нажатии клавиш печататься символы будут в то поле, в котором есть фокус. Соответственно, при сих манипуляциях фокус теряется и события перестают выстреливать.
Решение: вешать клавиши на stage. У неё всегда есть фокус.


На счет фокуса ты прав, спасибо, в этом то и была проблема. Да, если вешать клавиши на stage, то все работает, но в игре будет, уйма различных кнопок, а на сколько я помню, как утверждал Volsh на стейдж лучше ничего не размещать. Вот я и думаю, а не лучше ли будет просто изменять фокус, - stage.focus = нужный элемент; или все таки это будет не правильно, или предоставлять какие то проблемы? Вообщем, что лучше?

Старый 19.11.2013, 13:36
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 10  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,599
Записей в блоге: 17
Нет, подписываться на stage – вполне нормальная тема. У тебя есть ссылка на какой-то объект, так почему бы не послушать, что он там вещает?
Плохая затея что-то со stage делать – например, класть туда детей (addChild), или менять не знаю, прозрачность? ) Скорее всего об этом и говорил Wolsh.

По хорошему, вообщем-то, вынести всю клавиатурную логику в отдельное место, в отдельный класс, который будет вещать уже всем желающим о клавиатуре. Клавиатура у пользователя одна, так что вполне уместно сделать класс полностью из статичных полей – и ссылок тянуть не надо.
Почему это по хорошему? Ну, скажем, в будущем обнаружится, что если кнопку давить – то события начинают спамиться о том что кнопку быстро-быстро нажимают. Обычно этот эффект нежелателен, и в случае с отдельным классом вставить фикс придется только в этом одном месте.

Создать новую тему Ответ Часовой пояс GMT +4, время: 01:42.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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