Форум 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 на разных (не вложенных один в другого) мувиклипах?

LUCKY SHAMROCK 11.05.2009 19:25

http://www.bigiwin.com/
вот она проблема.. потому что кнопка на всю половину частй екрана.. а осталйние две получаютца на той же территории. естй решение или нет етому?

Stargazer 11.05.2009 20:15

1. Сделайте через hitTest и все дела. Это можно сделать за 15 минут (включая чтение справки).

2. Сделайте по аналогии с тем, как посоветовал Жень-Шень автору темы.

LUCKY SHAMROCK 11.05.2009 20:25

да почитал я =) hitTest несрабативает т.к. у меня первая кнопка покривает пол екрана( включая вторую кнопка ) и hitTest не обнаруживает её.. если я не прав подскажите как тогда?

Stargazer 11.05.2009 20:37

Причина не в этом. hitTest не сработал из-за чего-то другого.
В вашем случае через hitTest сделать можно.

LUCKY SHAMROCK 11.05.2009 20:58

Stargazer глянй пожалуйста исходник.. у меня уже терпения не осталосй готов всё переделатй..
http://www.bigiwin.com/checkit.fla

Stargazer 11.05.2009 21:18

"Недостаточно альтруизма для выполнения операции".

У меня сейчас и так солидный проект на флеш (не знаю, куда от него деться). Так что возиться с чужим кодом совершенно нет желания.

LUCKY SHAMROCK 11.05.2009 21:25

я всё понял =) и на етом благодарю

LUCKY SHAMROCK 19.05.2009 20:06

Вообшем разобрался как с ХитТестом работатй и вот что получилосй..
Код AS1/AS2:

this.onMouseMove = function(){
if(side1.btns.lb2.hitTest(_xmouse,_ymouse,true)){
if(!blur1){
        setfx("btn", 0, 100);
side1.wenblur.gotoAndPlay(2);
blur1 = true;
}
} else {
if(blur1){
side1.wenblur.gotoAndPlay(11);
blur1 = false;
}
}
if(side1.btns.lb1.hitTest(_xmouse,_ymouse,true)){
if(!blur2){
        setfx("btn", 0, 100);
side1.wexblur.gotoAndPlay(2);
blur2 = true;
}
} else {
if(blur2){
side1.wexblur.gotoAndPlay(11);
blur2 = false;
}
}
///////////////////////
if(side2.btns.rb2.hitTest(_xmouse,_ymouse,true)){
if(!blur3){
        setfx("btn", 0, 100);
side2.wenblur.gotoAndPlay(2);
blur3 = true;
}
} else {
if(blur3){
side2.wenblur.gotoAndPlay(11);
blur3 = false;
}
}
if(side2.btns.rb1.hitTest(_xmouse,_ymouse,true)){
if(!blur4){
        setfx("btn", 0, 100);
side2.wexblur.gotoAndPlay(2);
blur4 = true;
}
} else {
if(blur4){
side2.wexblur.gotoAndPlay(11);
blur4 = false;
}
}
}

слишком многа кода реалйно ето сжатй какими путями? У меня проверка на 4 кнопки идёт

второй вопрос вот в коде ниже ешё нада 4 проверки если кнопка одна из 4 нажата то на неё соответственний линк стоит.. но тут срабативает толко одна кнопка из 4 как сделатй чтоби onMouseDown срабативал на все кнопки? спасибо!


Код AS1/AS2:

var menURL = "../men/";
var wmenURL = "../women/";
var method = "_self";
var exitURL = "http://wikipedia.com";
this.onMouseDown = function(){
        if(side1.btns.lb1.hitTest(_xmouse,_ymouse,true)){
                getURL(wmenURL, method);
        }
}
this.onMouseDown = function(){
        if(side1.btns.lb2.hitTest(_xmouse,_ymouse,true)){
                getURL(exitURL, method);
        }
}
this.onMouseDown = function(){
        if(side2.btns.rb1.hitTest(_xmouse,_ymouse,true)){
                getURL(menURL, method);
        }
}
this.onMouseDown = function(){
        if(side2.btns.rb2.hitTest(_xmouse,_ymouse,true)){
                getURL(exitURL, method);
        }
}

Добавлено через 23 минуты
покурил сигаретку и сам ответил на второй вопрос else if спасло.. и всё таки может естй кратчайшие коди етим двум проверкам?

Psycho Tiger 19.05.2009 23:41

LUCKY, а что у тебя с запятыми и орфографией?
Можно засунуть проверки в цикл, они однотипны. Да, и код на сколько там... 20? 40? 50? строчек - это кхм... это "не большой код". Класс на 3-4 тысячи строчек - это класс среднего объема, так что =)

mozi 27.05.2009 22:57

спустя некоторое время опять наткнулся на эту тему - так что резюмирую:
пост #7 - вот где истина, а именно ЗАДЕРЖКА перед выполнением СОБСТВЕННОГО подобия функции onRollOver
пост #8 - глупость и непонимание сути проблемы.

понимаю что надо бы выложить исходники чтобы показать как проблема решилась, но будучи частью проекта - код трудночитаем, а переписывать - сил нет :)


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

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