PDA

Просмотр полной версии : Проблема с onMouseOut/onMouseOver.


Spider10k
12.12.2009, 00:11
Здравствуйте.
Пытаюсь сделать замену курсора мыши на пользовательский при наведении мыши на определенный спрайт.
Делаю так (внутри класса, который наследуется от Sprite):

addEventListener(MouseEvent.MOUSE_OVER,
function(e:MouseEvent)
{
Mouse.hide();
addChild(brush);
}
addEventListener(MouseEvent.MOUSE_OUT,
function(e:MouseEvent)
{
Mouse.show();
removeChild(brush);
}
addEventListener(MouseEvent.MOUSE_MOVE,
function(e:MouseEvent)
{
brush.x = e.stageX;
brush.y = e.stageY;
}

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

DarkLight
12.12.2009, 00:18
Скорее всего, это связано с наличием в спрайте вложенных объектов, от которых и всплывают эти события. Попробуйте поставить спрайту mouseChildren = false

P. S. объявлять листенеры inline нехорошо, лучше делать отдельные методы и ссылаться на них

Spider10k
12.12.2009, 00:53
Да, mouseChildren = false решил проблему, спасибо большое.
Извините за оффтоп, а можете в 2-х словах обьяснить чем плохи инлайн листенеры?

gloomyBrain
12.12.2009, 01:02
Инлайн листенеры плохи тем, что отписаться от них не получается.

Spider10k
12.12.2009, 01:24
Спасибо за ответ! И последний вопрос уже по теме :)
А можно ли как-то определить, что отправителем события является именно мой спрайт, а не его вложенные обьекты? А то mouseChildren = false не совсем хорошее решение в моем случае....
Пробовал так:

function(e:MouseEvent)
{
if (e.target != this)
{
return;
}
...
});

но не помогло....

bicubic_bublic
12.12.2009, 02:02
используйте ROLL_OVER, ROLL_OUT!!!!@!!!!

Spider10k
12.12.2009, 02:15
Благодарю! Вопросов больше не имею :)

Wolsh
12.12.2009, 03:47
Как то тоже столкнулся с этой проблемой и пришел в щенячий восторг, когда понял что событие MOUSE_OUT возникает из-за.. того "пользовательского курсора", который ставится конечно же под мышкой и перекрывает "кнопку".. Все что нужно - отключить реакцию на мышь самому курсору и его вложенным элементам.

Spider10k
12.12.2009, 12:02
Хм, действительно :)
Сделал:

brush.mouseEnabled = false;
brush.mouseChildren = false;

И все проблемы отпали. Еще раз благодарю за помощь.