1

コードで MovieClip ベースのクラスを許可し、コンストラクターを呼び出すヘルパー メソッドを作成しました。残念ながら、MovieClip コールバックonLoad()が呼び出されないため、ソリューションは完全ではありません。

(メソッドを作成したFlashdevelop スレッドへのリンク。)

コンストラクターonLoad()の両方が適切に呼び出されるように、次の関数をどのように変更できますか。

    //------------------------------------------------------------------------
    //  - Helper to create a strongly typed class that subclasses MovieClip.
    //  - You do not use "new" when calling as it is done internally.
    //  - The syntax requires the caller to cast to the specific type since 
    //    the return type is an object. (See example below).
    //
    //  classRef, Class to create 
    //  id,       Instance name
    //  ...,      (optional) Arguments to pass to MovieClip constructor
    //  RETURNS   Reference to the created object 
    //  
    //  e.g., var f:Foo = Foo( newClassMC(Foo, "foo1") );
    //
    public function newClassMC( classRef:Function, id:String ):Object 
    {
      var mc:MovieClip = this.createEmptyMovieClip(id, this.getNextHighestDepth()); 
      mc.__proto__ = classRef.prototype; 

      if (arguments.length > 2) 
      {
        // Duplicate only the arguments to be passed to the constructor of
        // the movie clip we are constructing.
        var a:Array = new Array(arguments.length - 2);
        for (var i:Number = 2; i < arguments.length; i++)
          a[Number(i) - 2] = arguments[Number(i)];

        classRef.apply(mc, a);
      }
      else
      {
        classRef.apply(mc);
      }

      return mc; 
    }

作成したいクラスの例:

class Foo extends MovieClip

そして、現在コードでクラスを作成する方法のいくつかの例:

// The way I most commonly create one:
var f:Foo = Foo( newClassMC(Foo, "foo1") );

// Another example...
var obj:Object  = newClassMC(Foo, "foo2") );
var myFoo:Foo   = Foo( obj );
4

2 に答える 2

3

ライブラリで空のクリップ シンボルを定義せずに、クラス ビヘイビアがアタッチされた空のムービー クリップのインスタンスを作成したいということを正しく理解していますか?

その場合は、パッケージのトリックを使用する必要があります。これは、何年にもわたって何百ものプロジェクトで使用してきた私の基本クラス (View と呼ばれます) です。

import mx.events.EventDispatcher;

class com.tequila.common.View extends MovieClip
{
    private static var _symbolClass : Function = View;
    private static var _symbolPackage : String = "__Packages.com.tequila.common.View";

    public var dispatchEvent : Function;
    public var addEventListener : Function;
    public var removeEventListener : Function;

    private function View()
    {
        super();

        EventDispatcher.initialize( this );

        onEnterFrame = __$_init;
    }

    private function onInitialize() : Void
    {
            // called on the first frame. Event dispatchers are
            // ready and initialized at this point.
    }

    private function __$_init() : Void
    {
        delete onEnterFrame;

        onInitialize();
    }

    private static function createInstance(symbolClass, parent : View, instance : String, depth : Number, init : Object) : MovieClip
    {
        if( symbolClass._symbolPackage.indexOf("__Packages") >= 0 )
        {
            Object.registerClass(symbolClass._symbolPackage, symbolClass);
        }

        if( depth == undefined )
        {
            depth = parent.getNextHighestDepth();
        }

        if( instance == undefined )
        {
            instance = "__$_" + depth;
        }

        return( parent.attachMovie(symbolClass._symbolPackage, instance, depth, init) );
    }

    public static function create(parent : View, instance : String, depth : Number, init : Object) : View
    {
        return( View( createInstance(_symbolClass, parent, instance, depth, init) ) );
    }
}

したがって、このクラスを使用するために必要なのは、サブクラス化することだけです。

class Foo extends View
{
    private static var _symbolClass : Function = Foo;
    private static var _symbolPackage : String = "__Packages.Foo";

    private function Foo()
    {
       // constructor private
    }

    private function onInitialize() : Void
    {
            // implement this to add listeners etc.
    }

    public static function create(parent : View, instance : String, depth : Number, init : Object) : Foo
    {
        return( Foo( createInstance(_symbolClass, parent, instance, depth, init) ) );
    }
}

次のように Foo のインスタンスを作成できるようになりました。

var foo : Foo = Foo.create( this );

「これ」がある種のムービークリップまたはビューであると仮定します。

これをライブラリ シンボルで使用する必要がある場合は、_symbolPackage メンバーの __Packages プレフィックスを省略します。

お役に立てれば...

于 2008-10-02T22:42:42.947 に答える
2

追加のパラメーターを使用して Foo クラスのインスタンスを作成する場合は、create メソッドを拡張できます。私の実装では、objectIds を使用してノードを作成しています。

var node : Node = Node.create(1,_root );

Node クラスは次のようになります。

class Node extends View {

private static var _symbolClass : Function = Node;
private static var _symbolPackage : String = "Node";

private var objectId : Number;


private function Node() {
   // constructor private
   trace("node created ");
}

private function onInitialize() : Void {
    //add listeners
}

public static function create(id_:Number, parent : MovieClip,  instance : String, depth : Number, init : Object) : Node {
    var node :Node = Node( createInstance(_symbolClass, parent, instance, depth, init) )
    node.setObjectId(id_);
    return(node);
}   

//=========================== GETTERS / SETTERS
function setObjectId(id_:Number) : Void {
    objectId = id_;
}
function getObjectId() : Number {
    return objectId;
}}

objectId はプライベート コンストラクタ Node() では定義されていませんが、onInitialize() では定義されていることに注意してください。

于 2011-05-29T20:56:14.703 に答える