05 апреля 2012

Flash: баг с отключением мышиных сообщений

Встав сегодня утром, я решил добавить логотип спонсора в свою последнюю игру. В голове я прикинул, что на всю работу у меня должно уйти пара часов, затем я планировал написать демку на Delphi+GlScene по анимированным кнопкам. Уже прошло полдня, злость подступает к горлу, а даже основной логотип спонсора в главном меню не реагирует на сообщения мыши. Справиться с такой ситуацией обычно помогаем такой способ: рассказываем в подробностях кому-нибудь о сложившейся проблеме. В это время обычно происходит переклинивание мозга и должно бы придти оригинальное решение бага. Попробую!
Исходные данные: имеется логотип, который лежит на заднем плане
Задача: необходимо отловить нажатие на логотип спонсора и перебросить игрока на определенный портал
Проблема: логотип перекрыт прозрачными частями картинок, из-за чего не реагирует на мышь

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

mouseEnabled = false;
mouseChildren = false;

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



(спустя десять минут)
Ура! Помогло! Потрясающий метод! Работает!
Оказывается, нужно было отключить mouseEnabled у всех родительских объектов. То есть я прошелся по иерархии вверх до разветвления к логотипу спонсора. Сейчас я не могу сказать, почему именно так все это сработало, возможно как-нибудь разберусь точнее и обязательно отпишусь...
Спасибо за помощь всем читателям!

p.s. Пока искал, как побороть эту проблему, наткнулся на еще одну интересную особенность... Если у кнопки создать свечение (Filters->Glow), то хит-область кнопки станет равной области из первого кадра. То есть у меня в кадре Hit кнопки был нарисован большой прямоугольник, но из-за того, что на саму кнопку наложен эффект свечения, данный прямоугольник игнорировался. Вот такой интересный баг удалось найти и пофиксить.

добавил пару картинок из игры... лого в меню и лого в игровом уровне:

Сообщения, схожие по тематике:

7 коммент.:

  1. Есть, еще один метод, но это уже, если ну совсем ничего не помогает. Придумал пока читал))) Создать слушателя MOUSE_CLICK для всей сцены и при нажатии проверять позицию курсора, если в момент нажатия он находился над логотипом спонсора, то выполнять все необходимые действия.

    ОтветитьУдалить
  2. Была похожая проблема.
    Вешал слушателя на сцену, как в предыдущем комментарии, только слушал e.target и смотрел, что мешает.

    ОтветитьУдалить
  3. угу, вешал слушателя и на stage тоже... но в хелпе написано, что e.target может быть любым объектом, содержащим тот, на который кликнули... хотя, возможно я что-то не так понял)) поэтому, когда мне выдавался один из верхних (родительских) объектов, то я не был удивлен... хотя в итоге, у этого объекта также пришлось отключить mouseEnable... то есть иерархия была такая:

    PageManager->BaseMenuPage->fVisual->ButtonsDecoration->BitMap

    перекрывает логотип только BitMap, но отключить mouseEnable пришлось у всех вышепречисленных объектов))

    ОтветитьУдалить
  4. А почему нельзя было:
    а) Переместить лого на самый верх по иерархии
    б) Жестко отследить положение курсора и задать реакцию на ЛКМ в определенной области?

    ОтветитьУдалить
  5. угу, тоже интересно, почему нельзя было поднять логотип на самый верх?

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

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

    p.s. добавил картинки лого в меню и игре... и в журнале стало значительно уютнее))

    ОтветитьУдалить