为使用 Alchemy 转换的C++类创建 AS3 代码(一个 là Box2D)

Creating AS3 code for C++ classes converted with Alchemy (a là Box2D)

本文关键字:一个 代码 Box2D AS3 创建 Alchemy 转换 C++      更新时间:2023-10-16

所以我有一个c++类的集合,我现在已经很好地将炼金术转换为swc文件,并且可以从我的AS3代码中调用暴露的函数。

我真正想做的是重建像Box2D的b2Vec这样的东西。类,

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对象的第一个变量是浮点数,它将是x中的值,可以通过Alchemy的MemUser类_mrf(从内存中的点读取浮点数)用_mrf(pointerAddress)读取,你可以用_mrf(pointerAddress + 4)读取第二个浮点数。

我的问题是,如果你不是一个c++专家(我),有什么方法可以得到一个类的定义,如在所有变量的地址和他们是什么?所以,对于b2Vec2,我想象它是这样的,Float32 x 0Float34 y 4…

我问这个问题的原因是因为其中一个类特别有很多变量,并且要尝试获取每个变量的信息,以便我可以直接从AS3代码访问它,这将是大量的工作,我将假设我将引入大量的人为错误。

一般的c++答案是否定的。在运行时,您无法发现特定结构体的成员变量是什么。

如何在c++应用程序中添加反射?

我不知道炼金术编译代码看起来像什么。您可以构建一些工具/预处理器来从其他表示生成c++类或结构,然后该工具也可以生成您的AS3访问器-这将是消除用户错误和一些工作的一种方式。这可能很棘手,因为计算成员变量的地址并不总是那么简单。

如果你可以在c++类中调用成员函数,为什么不把get/set函数移到那里并调用它们呢?

我从WCK的Jesse Sternberg那里得到了一个足够好的答案。他让他的大多数AS3类与c++类配对,在构建过程中自动在他自己的"探针"文件夹中完成。在这里,有一个box2dc类,它在顶部定义了一组模板,然后在main函数中,探测类的成员变量,并打印出从该端访问它们的相关AS3代码。

这是有点古怪的习惯,但肯定非常方便,比手动做得好得多!

相关文章: