Форум 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)
-   -   В классе не срабатывает onMouseMove (http://www.flasher.ru/forum/showthread.php?t=74686)

ir73 25.01.2006 22:15

В классе не срабатывает onMouseMove
 
Есть такой класс
Код:

import mx.utils.Delegate;

class Scroller extends MovieClip {
       
        public var slider_mc:MovieClip;
        public var sliderPath_mc:MovieClip;


       
        public function Scroller() {
                this.slider_mc.onPress = Delegate.create(this.slider_mc, onSliderPress);
                this.slider_mc.onRelease = Delegate.create(this.slider_mc, onSliderRelease);
                this.slider_mc.onReleaseOutside = Delegate.create(this.slider_mc, onSliderReleaseOutside);
        }
       
        public function onSliderPress() {
                this.startDrag(false, this._x, 0, this._x , this._parent.sliderPath_mc._height);
                this.onMouseMove = Delegate.create(this, dragProcess);
        }
       
        public function onSliderRelease() {
                this.stopDrag();

        }
       
        public function onSliderReleaseOutside() {
                onSliderRelease();
        }
       
        public function dragProcess() {
                trace("dragProcess");       
        }
       
       
       
}

Этот класс прописан у скроллера в Линкадже. slider_mc это ползунок скроллера. В итоге имеем, что trace("dragProcess"); не срабатывает! Что за дела - не ясно. Бился 5 часов над этим. Единственное, что обнаружил, это если this.onMouseMove = function() { trace("dragProcess"); } то так работает, но я так не хочу :)

Почему мой пример не работает?

ir73 25.01.2006 22:16

добавлю, что startDrag , stopDrag срабатывает на ура

Nox Noctis 25.01.2006 23:19

всё у тебя срабатывает.
только onSliderPress() срабатывает относительно this.slider_mc, где говорится "Delegate.create(this, dragProcess);" и this при этом равно this.slider_mc, где нет никакого dragProcess().

вообще, тут бестолку используется Delegate.

исправленный вариант:
Код:

import mx.utils.Delegate;
class Scroller extends MovieClip
{
        public var slider_mc:MovieClip;
        public var sliderPath_mc:MovieClip;
        public function Scroller()
        {
                this.slider_mc.onPress = onSliderPress;
                this.slider_mc.onRelease = onSliderRelease;
                this.slider_mc.onReleaseOutside = onSliderReleaseOutside;
        }
        public function onSliderPress()
        {
                this.startDrag(false, this._x, 0, this._x, this._parent.sliderPath_mc._height);
                this.onMouseMove = Delegate.create(this._parent, this._parent.dragProcess);
        }
        public function onSliderRelease()
        {
                this.stopDrag();
        }
        public function onSliderReleaseOutside()
        {
                onSliderRelease();
        }
        public function dragProcess()
        {
                trace("dragProcess");
        }
}

но такая реализация с точки зрения ооп АС2 всё равно плоха. для ползунка слайдера "по-правильному" надо сделать отдельный класс, где будет описано его поведение.

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

ir73 25.01.2006 23:41

если палки. спасибо огромное.
Интересная вещь. А мне раньше казалось, что если пусть к методу не указать, то вызывается метод по дейолту в корне класса. Или я с чем спутал?

Antares 26.01.2006 02:29

Метод вызывается для области видимости, указанной первым параметром

ir73 26.01.2006 10:41

это вы про Delegate говорте, а я имел в виду просто метод. напр. SomeFunc()

Nox Noctis 26.01.2006 11:52

если записать ссылку на метод в объект
и вызвать метод по этой ссылке из объекта,
то this на этот объект и будет указывать :)

по-моему вполне логично.
при этом не важно, где изначально находился метод...
к примеру, можно сделать так:

Цитата:

this.createTextField("TF", 0, 0,0,0,0);
TF.autoSize = true;
//
TF.swapDepths = this.swapDepths;
TF.swapDepths(123);
TF.text = TF.getDepth();


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

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