Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   кнопка в кнопке без hitTest (http://www.flasher.ru/forum/showthread.php?t=123908)

mozi 15.04.2009 15:59

кнопка в кнопке без hitTest
 
задача:
1. есть два мувиклипа: clip_1_mc, clip_2_mc
2. clip_1_mc - больше, clip_2_mc - меньше, располагается поверх clip_1_mc

что надо получить:
1. при наведении на clip_1_mc происходит некоторая реакция (например this._alpha = 50), при "уведении" - обратная (например this._alpha = 100)
2. для clip_2_mc все абсолютно аналогично. реакция на наведение\уведение
3. при наведении на маленький клип clip_2_mc, большой clip_1_mc остается "наведенным".

Вроде бы все просто: использовать hitTest для clip_1_mc. Да вот проблема: высота flash-ролика совпадает с высотой clip_1_mc, поэтому hitTest будет работать некорректно, а именно не будет отрабатывать событие "уведения", т.к. последнее отслеженное значение _ymouse всегда будет еще над роликом, а соответсвенно и над clip_1_mc.

Фактически тут соединены две задачи: "кнопка в кнопке" и "курсор над роликом".

Сталкивался ли кто-то с подобной проблемой в рамках AS1-2, и было ли найдено решение?

Жень Шень 15.04.2009 17:11

Привет!
Может не все понял, но я бы просто написал так:
Код AS1/AS2:

small_btn.onRollOver = function() {
        this._alpha = 50
        this._parent.big_btn.onRollOver();
};
small_btn.onRollOut = function() {
        this._alpha = 100
};
 
big_btn.onRollOver  = function() {
        this._alpha = 50
};
big_btn.onRollOut = function() {
        this._alpha = 100
};


mozi 15.04.2009 18:29

to Жень Шень:
В ситуации движения курсора по пути "за пределами swf > бОльший клип > меньший клип > бОльший клип > за пределами swf" то что ты написал будет работать так :

big_btn.onRollOver
big_btn.onRollOut
small_btn.onRollOver
big_btn.onRollOver(твой искуственный вызов)
small_btn.onRollOut
big_btn.onRollOver
big_btn.onRollOut

а требуется чтоб было так:

big_btn.onRollOver
small_btn.onRollOver
small_btn.onRollOut
big_btn.onRollOut

Gaen 15.04.2009 18:35

Уход курсора за пределы ролика отслеживается яваскриптом.

mozi 15.04.2009 18:55

согласен, как последний неизбежный вариант - да. Хотя честно скажу - не хочется связываться с JS. Мне надо отслеживать и "заход" и "уход" - это же не проблема?

Stargazer 15.04.2009 20:08

Цитата:

Сообщение от mozi (Сообщение 813013)
to Жень Шень:
В ситуации движения курсора по пути "за пределами swf > бОльший клип > меньший клип > бОльший клип > за пределами swf" то что ты написал будет работать так...

...а требуется чтоб было так:

big_btn.onRollOver
small_btn.onRollOver
small_btn.onRollOut
big_btn.onRollOut

Мне кажется, Жень Шень предложил вполне неплохой вариант решения проблемы малыми затратами.

Попробуйте переписать содержимое big_btn.onRollOver так, чтобы он не реагировал на связку onRollOut + onRollOver , если она выполняется в пределах одного кадра.

Например, отложите выполнение функций onRollOver и onRollOut на 1 кадр каким-нибудь этаким способом:
Код AS1/AS2:

funcDelayed= function(){
    delete this.onEnterFrame;
    this.activeMouseHandler();
}
 
big_btn.onRollOver= function(){
    this.activeMouseHandler= _my_onRollOver;
    this.onEnterFrame= funcDelayed;
}
 
big_btn.onRollOut= function(){
    this.activeMouseHandler= _my_onRollOut;
    this.onEnterFrame= funcDelayed;
}

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

mozi 15.04.2009 20:44

to Stargazer:
суть предложения полностью понятна. возможно это позвоит решить проблему. Только с
Цитата:

не реагировал на связку onRollOut + onRollOver
это никак не связано - таких парных событий, в которых надо не выполнять то событие, которое идет раньше - нет (см. пост #3). Зато по такому же принципу можно при переходе с big_btn на small_btn - исключить выполнение big_btn.onRollOver
Код:

big_btn.onRollOver = function() {
this.next_action = my_roll_over;  // собственно действие
}

big_btn.onEnterFrame = function() {
this.next_action();  // выполнится на следующий кадр
}

small_btn.onRollOver = function() {
big_btn.next_action = null;
}

Завтра попробую.

Жень Шень 16.04.2009 11:03

Вложений: 1
Имеем:
1. Есть два мувиклипа: big_mc, small_mc
2. big_mc - больше, small_mc - меньше, располагается поверх big_mc
Получили
1. При наведении на big _mc происходит big _mc._alpha = 50, при "уведении" - big _mc._alpha = 100. Условие выполнено!
2. Для small_mc все абсолютно аналогично. Условие выполнено!
3. При наведении на маленький клип small _mc, большой big _mc остается "наведенным" – то есть полупрозрачным. Условие выполнено!
Смотрим исходник.
Так что не так?

LUCKY SHAMROCK 11.05.2009 16:45

Я извиняюсй но хотелосй би поднятй етy темy ешё раз и добитй до конца если никто не против? Тут ситуация више напиасана вами понятно.. если нажимаеш на small_mc то добовляете функцию для болйшой onRollOver всё работает заемчателйно не спорю, но а если у етой big_mc не просто будет _alpha =50 а к примеру gotoAndPlay().. то при на водке на small_mc болйшая кнопка продолжит игратй что не нужно.. какие варианти предложите я уже мучаюсй третий денй.. нигде точного решения не нашол
одним словом питаюсй добитца onRollOver в самом onRollOver

Stargazer 11.05.2009 19:14

Цитата:

Сообщение от LUCKY SHAMROCK (Сообщение 818981)
при на водке на small_mc болйшая кнопка продолжит игратй что не нужно.. какие варианти предложите я уже мучаюсй третий денй.. нигде точного решения не нашол
одним словом питаюсй добитца onRollOver в самом onRollOver

Похоже, что невнимательно смотрите.
Автору было как раз нужно
Цитата:

что надо получить:
...
3. при наведении на маленький клип clip_2_mc, большой clip_1_mc остается "наведенным".
Почему вы не хотите просто разместить onRollOver на разных (не вложенных один в другого) мувиклипах?


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

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