0

そのため、Alchemy で適切に swc ファイルに変換できる C++ クラスのコレクションがあり、AS3 コードから公開された関数を正常に呼び出すことができます。

私が本当にやりたいのは、Box2D の b2Vec.as クラスのようなものを再作成することです。

public class b2Vec2 extends b2Base {

    public function b2Vec2(p:int) {
        _ptr = p;
    }

    public function get v2():V2 {
        return new V2(x, y);
    }

    public function set v2(v:V2):void {
        x = v.x;
        y = v.y;
    }

    public function get x():Number { return mem._mrf(_ptr + 0); }
    public function set x(v:Number):void { mem._mwf(_ptr + 0, v); }
    public function get y():Number { return mem._mrf(_ptr + 4); }
    public function set y(v:Number):void { mem._mwf(_ptr + 4, v); }

}

これは簡単な例ですが、私がやりたいことを示しています。C 側では、b2Vec2 は構造体です。

/// A 2D column vector.
struct b2Vec2
{
    /// Default constructor does nothing (for performance).
    b2Vec2() {}

    ....

    float32 x, y;
};

したがって、この構造体の場合、b2Vec2 オブジェクトの最初の変数が float であると簡単に計算できます。これは x の値になり、Alchemy の MemUser クラス _mrf (メモリ内のポイントから fload を読み取る) を介して読み取ることができます。 (pointerAddress) であり、_mrf(pointerAddress + 4) で 2 番目の float を読み取ることができます。

私の質問は、あなたが C++ の専門家 (私) でない場合、クラス内のすべての変数のアドレスとそれらが何であるかなど、クラスの定義を取得する方法はありますか? したがって、b2Vec2 の場合は、float32 x 0 float34 y 4 ... のようなイメージになると思います。

私が質問している理由は、特にクラスの 1 つに多数の変数があり、AS3 コードから直接アクセスできるように、それぞれの情報を取得しようとするのは大変な作業になるためです。人的ミスをたくさん紹介します。

4

2 に答える 2

1

非常に一般的な C++ の答えはノーです。実行時に、特定の構造体のメンバー変数が何であるかを発見することはできません。

C++ アプリケーションにリフレクションを追加するにはどうすればよいですか?

ただし、Alchemy でコンパイルされたコードがどのように見えるかはわかりません。ツール/プリプロセッサを構築して、他の表現から C++ クラスまたは構造体を生成し、そのツールで AS3 アクセサも生成できます。これは、ユーザー エラーと作業の一部を排除する方法です。メンバー変数のアドレスを把握することは必ずしも簡単ではないため、注意が必要な場合があります。

C++ クラスでメンバー関数を呼び出すことができる場合、get/set 関数をそこに移動してそれらを呼び出してみませんか?

于 2011-10-07T02:04:04.793 に答える
1

実際、WCK の担当者である Jesse Sternberg から十分な回答を得ました。彼は、対応する C++ クラスとペアになっている AS3 クラスのほとんどを、彼自身の「プローブ」フォルダー内のビルド プロセス中に自動的に作成しました。そこには、上部にテンプレートのロードを定義する 1 つの Box2D.c クラスがあり、メイン関数では、メンバー変数のクラスをプローブし、その側からそれらにアクセスするための関連する AS3 コードを出力します。

慣れるまでは少し面倒ですが、非常に便利で、手動で行うよりもはるかに優れています。

于 2011-11-04T18:20:01.530 に答える