AS2: функция доступа к классу из onRollOver - PullRequest
0 голосов
/ 31 января 2012

Я работаю над классом для динамического создания выпадающих кнопок.Вот выдержка из моего кода (находится в конструкторе класса):

_button.onRollOver = function()
            {
                this.gotoAndStop("over");
                TweenLite.to(this.options,0.2 * optionCount,{_y:mask._y, ease:Strong.easeOut, onComplete:detectMouse, onCompleteParams:[button]});
                function detectMouse(button:MovieClip)
                {
                    button.options.onMouseMove = function()
                    {
                        for (var option:String in this._parent.children)
                        {
                            if (this._parent.children[option].hitTest(_root._xmouse, _root._ymouse, true))
                            {
                                if (!this._parent.children[option].active) {
                                    this._parent.children[option].clear();
                                    drawOption(this._parent.children[option], "hover");
                                    this._parent.children[option].active = true;
                                }                               
                            }
                        }
                    };
                }
            };

Я пытаюсь вызвать функцию drawOption(), которая находится внутри того же класса и выглядит так:

private function drawOption(option:MovieClip, state:String)
    {
        trace("yo");
        switch (state)
        {
            case "hover" :
                var backgroundColour:Number = _shadow;
                var textColour:Number = 0xffffff;
                break;
            default :
                var backgroundColour:Number = _background;
                var textColour:Number = _shadow;
                break;
        }
        option._x = edgePadding;
        option._y = 1 + edgePadding + (optionPadding * (option.index)) + (optionHeight * option.index);
        option.beginFill(backgroundColour,100);
        option.lineStyle(1,_border,100,true);
        option.moveTo(0,0);
        option.lineTo(_optionWidth,0);
        option.lineTo(_optionWidth,optionHeight);
        option.lineTo(0,optionHeight);
        option.endFill();
        var textfield:TextField = option.createTextField("string", option.getNextHighestDepth(), 20, 2, _optionWidth, optionHeight);
        var format:TextFormat = new TextFormat();
        format.bold = true;
        format.size = fontSize;
        format.font = "Arial";
        format.color = textColour;
        textfield.text = option.string;
        textfield.setTextFormat(format);
    }

Но поскольку я пытаюсь вызвать изнутри onRollOver, кажется, что он не может распознать методы класса.Как бы я мог получить доступ к функции, не делая ее дубликат (очень грязно, не хочу!).

Ответы [ 2 ]

1 голос
/ 31 января 2012

В AS2 я предпочитаю использовать класс Delegate для добавления функций в обработчики событий, сохраняя при этом контроль над областью.

Вы реализуете это так:

import mx.utils.Delegate;

//create method allows you to set the active scope, and a handler function
_button.onRollOver = Delegate.create(this,rollOverHandler);

function rollOverHander() {
    // since the scope has shifted you need to use 
    // the instance name of the button
    _button.gotoAndStop("over");
    TweenLite.to(_button.options,0.2 * optionCount,{_y:mask._y, ease:Strong.easeOut, onComplete:detectMouse, onCompleteParams:[button]});
}
1 голос
/ 31 января 2012

все в onrollover относится к кнопке, которая переворачивается, чтобы получить доступ к внешним функциям, вам придется перейти к внешнему классу перед вызовом функции точно так же, как вы обращаетесь к внешним переменным, например:

, если родительский элемент кнопки содержит функцию:

this._parent.drawOption (....)

КонтейнерМЦ класс:

class ContainerMC extends MovieClip{

    function ContainerMC() {
        // constructor code
        trace("Container => Constructor Called");
    }

    function Init(){
        trace("Container => Init Called");
        this["button_mc"].onRollOver = function(){
            trace(this._parent.SayHello());
        }
    }

    function SayHello():String{
        trace("Container => SayHello Called");
        return "Hellooooo World";
    }
}

Затем у меня есть мувиклип в библиотеке с Class ContainerMC и идентификатором Container_mc, который добавляется на сцену этой строкой в ​​основной временной шкале:

var Container = attachMovie("Container_mc","Container_mc",_root.getNextHighestDepth());
Container.Init();

Редактировать: добавлен рабочий образец

...