0

[注意:马上,我已经知道关于“MovieClips 上没有代码”的流行理论,所以请不要回复(或因此而否决)。每个项目都是不同的。我只需要答案。]

我有一个使用 Adob​​e Flash CS5.5、Adobe AIR 3 和 ActionScript 3 的项目。

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

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

4

2 回答 2

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);
于 2012-04-13T06:22:18.710 回答
1

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

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

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
        }   
    }
}

请参阅上面代码中的注释。

于 2012-04-13T15:51:30.333 回答