Помощь · Поиск · Пользователи · Календарь
Полная версия этой страницы: Обработчики событий и глюки
Flash Zone Forum > Macromedia Flash > ActionScript
SunShadow
Столкнулся с такой проблемой. Объекту назначено три обработчика событий. Первый клик кнопкой на запуск перемещения, второй на движение мыши, и третий на отпускание кнопки для прекращения переноса. Когда делаешь все неспеша вроде все нормально, но как только отдал на тест то сразу столкнулись с проблемой, иногда по непонятной причине объект отказывается сбрасываться. Долго разбирал код на десять раз буквально, все трейсил, все перепроверял, ошибки не нашел. Закралась такая мысль, что когда заканчивается перемещение я назначаю объекту
MyObject.OnMouseMove = null;
Таки образом удаляю обработчик на перемещение. Когда запускаю перемещение устанавливаю его по новой. Вот я и думаю, ежели у меня одновременно идут два процесса движения и сбрасывания, позволит ли объект функции которая сбрасывает объект обнулить обработчик движения если он в данный момент выполняется????
Я пробовал двигать и сбрасывать объект одновременно, вроде как раз при таких случаях происходит сбой в алгоритме. Как с этим бороться?
tiHo
Код
clip.onPress = function()
{
    this.startDrag();
};
clip.onRelease = function()
{
    this.stopDrag();
};


незнаю зачем нужно onmousemove
MerliX
Попробуй кроме onRelease сделать обработчик на onReleaseOutside или как-то там было. Суть в том, что если мышь отпустить можно между кадрами, и теоретически вылезти за кнопку. Наверно.
SunShadow
Цитата(tiHo @ 16.01.2007 - 18:16) *
Код
clip.onPress = function()
{
    this.startDrag();
};
clip.onRelease = function()
{
    this.stopDrag();
};


незнаю зачем нужно onmousemove


Было бы все так просто, и проблем бы не было) Реализую игру пазлы. Каждый кусок мозаики является наследником класса с реакцией на действия пользователя. В общих чертах так и выглядит (кода чуть больше и вместо startDrag и stopDrag использую свои функции), а onmousemove требуется чтобы сделать плавное перемещение и обеспечить ограничения и мультпликацию. Кроме всего прочего на объект при активации назначается реакция на нажатие клавиш клавиатуры, чтобы реализовать некоторые доп возможности вроде поворота или подсказки. Соответственно при отсановки перемещения, все эти фичи с текущего объекта снимаются.

Цитата
Попробуй кроме onRelease сделать обработчик на onReleaseOutside или как-то там было. Суть в том, что если мышь отпустить можно между кадрами, и теоретически вылезти за кнопку. Наверно.


Может быть я и попадаю между кадрами, только объект ведь не теряется, и движется дальше с мышью. При следующих нажатиях клавиши над ним по идее должно срабатывать сброс куска, а он что странно игнорирует OnRelease хотя в коде он нигде не сбрасывается и на всех кусках мозаики по умолчанию является событием для сброса куска. Объект просто двигается за курсором, и можно носить другие куски а этот хоть и находиться под курсором как бы перестает быть наследником класса, и просто не реагирует на назначенные ему события.
tiHo
а ты пробывал вместо
Код
MyObject.OnMouseMove = null;


написать
Код
delete MyObject.OnMouseMove;


или просто
Код
return;


или я просто не понимаю smile.gif

PS> почему у тебя OnMouseMove с большой буквы? ето твоя функция? или ты просто так написал, и ето не имеет значения?
SunShadow
Цитата(tiHo @ 17.01.2007 - 15:21) *
а ты пробывал вместо
Код
MyObject.OnMouseMove = null;


написать
Код
delete MyObject.OnMouseMove;

Попробовал, эффект тот же(
Цитата(tiHo @ 17.01.2007 - 15:21) *
или просто
Код
return;


или я просто не понимаю smile.gif

PS> почему у тебя OnMouseMove с большой буквы? ето твоя функция? или ты просто так написал, и ето не имеет значения?

Куда запихивать return внутри класса не представляю, а OnMouseMove - это я от руки просто здесь набирал, конечно правильно this.onMouseMove.
Нет у меня такое чувство что механизм ломается. Потому что когда сбой происходит курсор перестает быть рукой, объект как бы становится просто клипом который движется за мышью, а не наследником класса пазлы, от которого он работает. И соответсвенно все действия на которые он должен был реагировать куда то исчезают
SunShadow
Цитата(MerliX @ 16.01.2007 - 19:21) *
Попробуй кроме onRelease сделать обработчик на onReleaseOutside или как-то там было. Суть в том, что если мышь отпустить можно между кадрами, и теоретически вылезти за кнопку. Наверно.

Попробовал сделать остановку движения на onReleaseOutside, эффект тот же. Поставил трассировку на метод движения, когда кнопку мыши отпускаю движение продолжается и this.onMouseMove остается равным типа функции, хотя при трасировке в методе this.onRelease показывает что был удален и имеет статус undefined.
tiHo
кидай сюда полный код класса
SunShadow
Спасибо всем кто принял участие в обсуждении. Особенно MerliX, потому что именно его мысль натолкнула меня на правильное решение. Да действительно, событие onRelease срабатывает, но возможны ситуации когда мышь отжата за пределами объекта или даже экрана. Все решилось очень просто, сменил на onMouseUp и все стало работать как положено.
Еще раз спасибо)
Русская версия IP.Board © 2001-2009 IPS, Inc.