Форум 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)
-   -   Мышь покидает рабочее поле (http://www.flasher.ru/forum/showthread.php?t=58296)

juice 18.05.2004 13:51

Мышь покидает рабочее поле
 
Как узнать когда мышь покидает пределы рабочего поля ролика? Эт в принципе очень важно ...
Можно конечно обходными путями, реализуя внешнюю связь с JavaScript, но это плохое решение. Есть что-то "стандартное" для решения этой проблемки?

dimarik 18.05.2004 14:58

Код:

someListener = new Object();
someListener.onMouseMove = function () {
    if(_xmouse <= 0 || _xmouse >= Stage.width){
        // Mыша убежала по координате x за пределы экрана флешки
    }
};
Mouse.addListener(someListener);

Может поможет?

Nox Noctis 18.05.2004 15:08

не поможет.

флэш-плагин следит за мышью только в пределах видимой бласти ролика.

а при резком убирании курсора из области флэш-плагина, флэш не успевает засечь положение мышки, и залипают координаты курсора где-то непонятно где посередине ролика. последние, которые успели определиться.

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

juice 18.05.2004 23:59

2Nox Noctis
Можно подробнее? Даже представить себе не могу чем кнопка может быть полезна в данном случае ...

sergwizard 19.05.2004 02:20

Вложений: 1
Да..., я согласен: кнопка это очень полезная вещь.

Штрек 19.05.2004 03:07

Цитата:

Оригинал написал(а) juice
2Nox Noctis
Можно подробнее? Даже представить себе не могу чем кнопка может быть полезна в данном случае ...

Ну поверх стола кнопку и ... будет праздник. :p

sergwizard 19.05.2004 03:51

Цитата:

Ну поверх стола кнопку и ... будет праздник.
Праздника ему захотелось... Иди ото дом достраивай. :D
А что ты будешь делать с остальными кнопками на столе? Ты же им уши затыкаешь....

Штрек 19.05.2004 04:40

Цитата:

Оригинал написал(а) sergwizard

А что ты будешь делать с остальными кнопками на столе? Ты же им уши затыкаешь....

Так под низ её, под низ. :p

sergwizard 19.05.2004 10:47

Так если ты ее "по низ", то тогда лежащие НАД ней объекты будут перекрывать ее. И, при попадании мыши на эти объекты, у тебя будет отрабатываться выход мышки за пределы ролика.
Так что Nox прав, говоря, что "придётся возиться с событиями кнопок". Вот посмотри мой примерчик.

Штрек 20.05.2004 02:05

Не хрена кнопки плодить.
Скромнее надо быть. :D

juice 20.05.2004 15:03

2 sergwizard: спасибо за абсолютно рабочий код, (только в конце там непонятно зачем инкрементируются высоты кнопок). Если можно, черканите пару строк-обьяснений:
1) Св-во Mouse.inner мы обьявляем сами ?
2) Mouse.watch - этого метода я нигде не встречал.
3) Что делает метод addProperty, тоже не знаю о нем ничего

sergwizard 20.05.2004 22:35

Вложений: 1
Цитата:

1) Св-во Mouse.inner мы обьявляем сами ?
2) Mouse.watch - этого метода я нигде не встречал.
3) Что делает метод addProperty, тоже не знаю о нем ничего

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


Код:

state_btn.useHandCursor = false;
Создаем неопределенный объект (в прошлом исходнике я использовал для этого объект "Mouse").
obj={};
Пишем методы, которые позднее будут наследовать все объекты класса "Button"
Код:

Button.prototype.privateOnRollOut = function(){
        obj.inner = false;
}
Button.prototype.privateOnRollOver = function(){
        obj.inner = true;
}

Добавляем классу "Button" новые проперти: "onRollOut" и "onRollOver" . Чё говорите? У кнопок уже есть такие проперти? Ну и что, а я хочу добавить еще свои личные… И теперь, при событиях onRollOver и onRollOut, кнопки будут вызывать функции "privateOnRollOut" и " privateOnRollOver ", при этом меняя свойства "inner" у объекта "obj".
Код:

Button.prototype.addProperty("onRollOut",
        function(){
                  this.privateOnRollOut();
        }, null
)

Button.prototype.addProperty("onRollOver",
        function(){
                  this.privateOnRollOver();
        }, null
)

Заставляем объект "obj" следить за изменением значения "inner", и при изменении этого значения вызывать соответствующие функции (менять текс в текстовом поле и менять значение некоторой переменной "k").
Код:

obj.watch("inner",
        function(){
                txt = arguments[2] ? "inside" : "outside";
                k = arguments[2] ? true : false;
        }
)

Теперь, чтобы не пропадали зря вновь приобретенные свойства кнопок, используем их для вызова любых функций, которые нам нужны. Я, для примера нарисовал такую:
Код:

MovieClip.prototype.rotIt = function(){
        col = new Color(this);
        this.onEnterFrame = function(){
                if(click){
                k ? this._rotation+=5 : this._rotation-=5;
                k ? col.setRGB(0xFF0000) : col.setRGB(0x0000FF);
        }
        }
}
mc.rotIt();
b1_btn.onRelease = function(){
        click = (click+1)%2;
}

Вот, вроде, и все.

ЗЫ. В предыдущем исходнике я инкрементировал не высоты кнопок, а изменял их положение по _y. Это я сделал, чтобы показать, что кнопки не мешают друг другу, и RollOver на вышележащую кнопку, не мешают нижележащей отслеживать это же событие.

juice 20.05.2004 22:52

Все поняттно :cool:

Nox Noctis 21.05.2004 14:29

надо обязательно добавить onDragOut/Over - а то легко заглючить всё это.

и есть проблема - селектабельные текстовые поля :)

надо патчить..

Nox Noctis 21.05.2004 14:57

ах да. и еще. прочитал наконец код :))

не особо в тему, но
Код:

Button.prototype.addProperty("onRollOut", function () {
        trace("onRollOut of "+this+" called");
}, function (f) {
        if (typeof (f) == "function") {
                this.myOnRollOut = f;
        }
});
Button.prototype.addProperty("onRollOver", function () {
        trace("onRollOver of "+this+" called");
}, function (f) {
        trace("onRollOut of "+this+" called");
});
// 'btn' -- some button
trace(btn.onRollOver+" : "+typeof btn.onRollOver);
trace(btn.onRollOut+" : "+typeof btn.onRollOut);
//

sergwizard, тебя здесь ничего не смущает? :))

и к тому же можно мувиклипу задать кнопочные события...

sergwizard 21.05.2004 20:30

Цитата:

надо обязательно добавить onDragOut/Over - а то легко заглючить всё это.
и есть проблема - селектабельные текстовые поля :)
надо патчить..
Патчить надо все, что сделано на колене и на скорую руку. :) Добавить onDragOut/Over – не проблема. А вот с селектабельными TF я пока не вижу способа. То есть я вижу как поправить на setFocus, но этого –явно – недостаточно.
Повторяю, я наскоро переделывал это из старого моего исходника, в котором тако-о-ое наворочено.
Цитата:

sergwizard, тебя здесь ничего не смущает? :))
Ха, меня много что смущает. Например, такое:
Код:

Button.prototype.myOnRollOut = function(){trace("myOnRollOver of "+this+" called");};
Button.prototype.myOnRollOver = function(){trace("myOnRollOut of "+this+" called");};
Button.prototype.addProperty("onRollOut", function () {
        this.myOnRollOut();
}, null
);
Button.prototype.addProperty("onRollOver", function () {
        this.myOnRollOver();
}, null
);
// 'btn' -- some button
btn.myOnRollOver = function(){ //Попробуй то же самое с btn.onRollOver
        //for(a in btn){
        //        trace(a + ":"+ typeof(a));
//}
if(typeof (this.myOnRollOver) == "function")
//Затем попробуй написать вместо "function" - "string"
trace("this is a : "+ typeof this.myOnRollOver)
}

Тут явно надо привлекать ASSetPropFlags. Будет нужда – займусь. А пока процитирую Штрека:
Не хрена кнопки и (селектабельные поля) плодить.
Скромнее надо быть. :D
Но, любым твоим замечаниям и советам буду рад.

sergwizard 23.05.2004 02:19

Самое простое, что смог придумать для селектабл TF, - вот это:
Код:

this.onMouseMove = function(){
        if(TextField._xmouse>=0 && TextField._xmouse<=TextField._width&&TextField._ymouse>=0&&TextField._ymouse<=TextField._height){
                obj.inner = true;
        }
}

Придумывать что-сложнее - овчинка выделки не стоит.
Хотя буду рад, если кто-нибудь предложит более красивый и действенный способ.

treety01 06.07.2004 11:16

...возможноли в место этого большого буттона (на фоне)
использовать мувиклип?...как? (я с портотипами не работал)

ethereal999 18.02.2006 05:24

небольшое дополнение к проблеме (я думаю, будет полезно новичкам, вроде меня, гуру не кидайтесь помидорами... :))
В случае таскания объекта (и утаскивания за границы клипа) вместо onRelease можно воспользоваться onMouseUp.
Например, так:

Код:

myMc.onMouseUp = function(){
  if (cursor._x > Stage.width || cursor._x < 0 || cursor._y > Stage.height || cursor._y < 0){
      if (Math.abs (this._x - this.old_x) > 3 || Math.abs (this._y - this.old_y) > 3){
        this.onReleaseFunc();
      }
  }
}


meiciuc 18.02.2006 12:19

>>В случае таскания объекта (и утаскивания за границы клипа) вместо >>onRelease можно воспользоваться onMouseUp.

уже есть придуманный onReleaseOutside();

ethereal999 18.02.2006 12:32

meiciuc
блин... :)

=============

впрочем то, да не то...

использовал onReleaseOutside, утащил объект за край мувика, естественно, при этом объект залип где-то по дороге (ближе к пересеченному краю), а когда отпустил, то скрипт снял значения мыши там, где я ее отпустил (ну например, -500 -400). И там же появился мой объект, а так как была задействована динамика (пружина), то его движение назад выглядело неправдоподобно. С onMouseUp такого не происходит.
Хотя это может я так криво написал...

meiciuc 18.02.2006 12:43

ethereal999

демонстрация вагона знаний :)

meiciuc 18.02.2006 12:47

ethereal999

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


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

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