【问题标题】:Accessing Function on MovieClip from Document Class从 Document 类访问 MovieClip 上的函数
【发布时间】:2012-04-13 05:57:14
【问题描述】:

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

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

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

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

【问题讨论】:

  • 如果您尝试在时间轴上编写代码并链接文档类,您不会收到 addframescript 错误吗?
  • 没有。自 12 月开始我的项目以来,我一直在顺利完成它。我使用时间线代码、文档类代码和自定义类的组合。

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


【解决方案1】:

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

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

在您文档中时间线的某个框架上(应该适用于任何对象):

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);

【讨论】:

  • 好吧,我不太确定我在关注你。事件监听器如何知道监听 customEvent?
  • 我更新了我的答案,以更好地解释这一点,我有点抱歉,我没有使用更“自定义”的东西作为我的例子。
  • 是什么激发了您命名成员的灵感......?
  • MartyWallace,哈哈,我也在想同样的事情! Joncys,我还是没听懂,但到了晚上 11:48。我会试试看,早上回复你^^
  • @joncys 这让我很开心;有一个+1
【解决方案2】:

好吧,既然你似乎在使用一些 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
        }   
    }
}

见上面代码中的 cmets。

【讨论】:

  • 我最终自己找到了另一种方法,但由于这更接近我的要求,我会接受它以将其从未回答的问题列表中删除。抱歉耽搁了,谢谢。
猜你喜欢
  • 2012-01-20
  • 1970-01-01
  • 1970-01-01
  • 2010-11-23
  • 1970-01-01
  • 2011-11-23
  • 2018-10-14
  • 2012-06-14
  • 2011-05-12
相关资源
最近更新 更多