[注意:刚刚开始,我已经知道关于“没有关于MovieClips的代码”的流行理论,所以请不要回复(或者 因为它而投票。每个项目都不同。我只需要答案。]
我在Adobe Flash CS5.5,Adobe AIR 3和ActionScript 3中有一个项目。
我需要在项目的主时间轴上调用一个函数,文档类从文档类内部链接到。为了举例,我们将此函数称为“Ring()”。
如何在文档类中调用此函数“Ring()”?
答案 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
}
}
}
请参阅上面代码中的评论。