0

[注:すぐに、「MovieClipsにコードがない」という一般的な理論をすでに知っているので、それで返信しないでください(またはそのために反対票を投じてください)。プロジェクトはそれぞれ異なります。答えが必要です。]

Adobe Flash CS5.5、Adobe AIR 3、およびActionScript3のプロジェクトがあります。

ドキュメントクラスがリンクされているプロジェクトのメインタイムラインで、ドキュメントクラス内から関数を呼び出す必要があります。例として、この関数を「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

さて、あなたは昔ながらの忍者のテクニックを使っているように見えるので、単純明快に保つことをお勧めします。

メイン タイムラインにいくつかの関数があるとします。

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 に答える