从文档类访问MovieClip上的函数

时间:2012-04-13 05:57:15

标签: actionscript-3 flash air flash-cs5.5 document-class

  

[注意:刚刚开始,我已经知道关于“没有关于MovieClips的代码”的流行理论,所以请不要回复(或者   因为它而投票。每个项目都不同。我只需要答案。]

我在Adobe Flash CS5.5,Adobe AIR 3和ActionScript 3中有一个项目。

我需要在项目的主时间轴上调用一个函数,文档类从文档类内部链接到。为了举例,我们将此函数称为“Ring()”。

如何在文档类中调用此函数“Ring()”?

2 个答案:

答案 0 :(得分:2)

将要调用的函数放入文档类中,并从对象的时间轴调度自定义事件(或任何事件,如果代码可读),并在文档类上侦听该事件。

所以代码细分看起来像这样:

在文档中某个时间轴的框架上(应该在任何对象上工作):

var customEvent:Event = new Event(Event.COMPLETE);
this.dispatchEvent(customEvent);

在您的文档类中:

public function DocumentClass()
{
    // get the reference to the object
    lolcats.objectThatDispatchesEvent.addEventListener(Event.COMPLETE, _customHandler);
}

protected function _customHandler(event:Event):void
{
    // FUNCTION NAMES SHOULD START WITH LOWERCASE! ^_^
    Ring();
}

http://www.adobe.com/devnet/actionscript/articles/event_handling_as3.html

基本上你注册了定义你的事件的任何字符串,Event.COMPLETE评估为"complete",你可以注册你想要的任何东西,例如:

var custEvent = new Event("anyCustomString");
this.dispatchEvent(custEvent);

// catch it with
addEventListener("anyCustomString", _handler);

答案 1 :(得分:1)

好吧,既然你似乎在使用一些oldskool忍者技术,我建议你应该保持简单明了。

假设您在主时间轴上有一些功能:

function Ring1():String
{
    return "Ring1() called!";
}
var Ring2:Function = function () : String
{
    return "Ring2() called!";
};

上述时间表的文档类的场景如下:

package  {
    import flash.display.MovieClip;
    import flash.events.MouseEvent;
    import flash.utils.getQualifiedClassName;
    import flash.utils.describeType;

    public class Test extends MovieClip 
    {
        public function Test() 
        {
            stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
        }
        private function onMouseDown(event:MouseEvent):void
        {
            trace(getQualifiedClassName(this)+".onMouseDown()");
            try {
                var ring1:Function = this["Ring1"] as Function;
                var ring2:Function = this["Ring2"] as Function;
            } catch (error:Error) {         
                // ignore
            }
            if (ring1 != null) {
                trace("\t", "Ring1", "=", ring1);
                trace("\t", ring1());
            } else {
                trace("\t", "Ring1() function not found in "+this+"!");
            }           
            if (ring2 != null) {
                trace("\t", "Ring2", "=", ring2);
                trace("\t", ring2());
            } else {
                trace("\t", "Ring2() function not found in "+this+"!");
            }

            // for your interest:
            var doc:XML = describeType(this);
            var ring1Node:XML = doc.descendants("method").(@name == "Ring1")[0];
            var ring2Node:XML = doc.descendants("variable").(@name == "Ring2")[0];
            trace("declaration of Ring1:", ring1Node.toXMLString());
            trace("declaration of Ring2:", ring2Node.toXMLString());
            // so, you may probably make use of reflection
            // unless you need to reference dynamic members on the main timeline
        }   
    }
}

请参阅上面代码中的评论。