Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Class, MovieClip, SimpleButton. Не срабатывает обработчик MouseEvent.CLICK (http://www.flasher.ru/forum/showthread.php?t=171727)

AHKHOBA 23.11.2011 00:51

Class, MovieClip, SimpleButton. Не срабатывает обработчик MouseEvent.CLICK
 
Присоединяю к классу клип, в котором 2 кадра. В кадрах - кнопки. В зависимости от значения некой переменной frame, происходит выбор кадра:

Код AS3:

addChild(dialBox);
dialBox.gotoAndStop(frame);

И в первом кадре, и во втором есть кнопка cancel_btn. Разница во внешнем виде только. Но по совершенно непонятной мне причине, кнопка не реагирует на событие нажатия мыши.

Код AS3:

dialBox.cancel_btn.addEventListener(MouseEvent.CLICK, onCancelHandler);

Как будто бы оно не происходит. Спрашиваю обработчик: что такое dialBox.cancel_btn? Отвечает: simpleButton. То есть, кнопка точно видна скрипту.

Уже голова почти разбита об стену - не понимаю, отчего это может быть. Перепробовала все вариации: называла кнопки в разных кадрах по-разному, добавляла стоп-кадры, даже удаляла кнопку из первого кадра, оставив только во втором... Ничто не помогло. Единственное, что понятно: если кадр один, тогда все отлично работает. Итого получается, что проблема в gotoAndStop(). Но какая может быть проблема в этом элементарном действии?..

Еще такой момент: кроме кнопки cancel_btn в этих кадрах есть и ok_btn. С этой кнопкой все в порядке. Разница между ok и cancel кнопками в том, что кнопка ok_btn в обоих кадрах одна и та же. По идее, этот факт должен исключить влияние на проблему метода gotoAndStop(), который сейчас главный подозреваемый... но какая проблема может быть другая?

Кто-нибудь, по возможности, просветите меня в этом вопросе. Буду весьма-весьма признательна.

Ookami 23.11.2011 00:55

может быть событие срабатывает не на этой кнопке, а на другом объекте клипа? Попробуйте
Код AS3:

dialBox.addEventListener(MouseEvent.CLICK, onCancelHandler);

А в onCancelHandler через отладчик посмотрите на event.target

Psycho Tiger 23.11.2011 01:04

Скорее всего тут дело вот в чем: Flash IDE генерирует поля класса, которые ссылаются на объекты дисплей-листа: это сделано для удобства. И вот поменяв кадр у клипа поле класса не затронется никак: и оно будет продолжать ссылаться на клип в первом кадре. Нужно доставать содержимое методами, для доставания контента.
Попробуйте вот так:
Код AS3:

addChild(dialBox);
dialBox.gotoAndStop(2);
(dialBox.getChildByName("cancel_btn") as SimpleButton).addEventListener(MouseEvent.CLICK, onClick);


Ookami 23.11.2011 01:11

Цитата:

Спрашиваю обработчик: что такое dialBox.cancel_btn? Отвечает: simpleButton
Цитата:

Код AS3:

dialBox.getChildByName("cancel_btn") as SimpleButton


Какой смысл?

Psycho Tiger 23.11.2011 01:20

Обращаясь вот так: clip.cancel_btn мы будем ссылаться на некоторое поле cancel_btn, которое будет указывать всегда в одно место. Если мы вызовем gotoAndStop, скорее всего, это поле значения не изменит и будет до сих пор ссылаться в прошлый первый кадр.

fish_r 23.11.2011 01:26

может проще сделать?

поменять
Код AS3:

      dialBox.cancel_btn.addEventListener(MouseEvent.CLICK, onCancelHandler);

на

Код AS3:

      dialBox.addEventListener(MouseEvent.CLICK, onCancelHandler);


Ookami 23.11.2011 01:41

Ну собственно да, я это и предложил - даже если не поможет, то хоть можно будет увидеть на каком объекте срабатывает клик.

Тигра - я имел ввиду зачем надо "as SimpleButton", если ИДЕ итак знает что это кнопка (судя по словам топикстартера)

fish_r 23.11.2011 01:45

и ещё: во втором кадре экземпляр кнопки имеет тоже имя "cancel_bnt" (instance name)? это так - на всякий случай

AHKHOBA 23.11.2011 02:12

Код AS3:

dialBox.addEventListener(MouseEvent.CLICK, onCancelHandler);

Клик срабатывает куда не кликни, event.target возвращает правильный объект.

А логичный и обнадеживающий код:
Код AS3:

(dialBox.getChildByName("cancel_btn") as SimpleButton).addEventListener(MouseEvent.CLICK, onClick);

сообщает об ошибке:
Код:

Error #1009: Cannot access a property or method of a null object reference.
Эта ошибка и раньше иногда вылетала. Мол, вы пытаетесь присвоить метод несуществующему объекту. А иногда не вылетала - объект SimpleButton чудесным образом находился. Но почему-то вот не реагировал на нажатие мыши.

Печаль сплошная :) Это же, кажется, такая элементарщина - передвинуться на заданный кадр!
Думаю, ребята, если еще какая-нибудь идея на эту тему блеснет, скорее всего она будет рабочей :)

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

и ещё: во втором кадре экземпляр кнопки имеет тоже имя "cancel_bnt"
Да, имя кнопки в обоих кадрах - cancel_btn. Но варианты с разными именами уже испробованы.

Wolsh 23.11.2011 02:28

Цитата:

Это же, кажется, такая элементарщина - передвинуться на заданный кадр!
А у Вас что-то не передвигается?
Мне одному кажется, что программировать в кадрах перестали 6 лет назад?


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

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