0

所以我有一个 C++ 类的集合,我现在可以使用 Alchemy 将其转换为 swc 文件,并且可以从我的 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 对象的第一个变量是浮点数,它将是 x 中的值,可以通过 Alchemy 的 MemUser 类 _mrf(从内存中的某个点读取 fload)和 _mrf 读取(pointerAddress),您可以使用 _mrf(pointerAddress + 4) 读取第二个浮点数。

我的问题是,如果您不是 C++ 专家(我),有没有办法获得一个类的定义,如其中所有变量的地址以及它们是什么?所以,对于 b2Vec2 来说,我想它会像 float32 x 0 float34 y 4 ...

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

4

2 回答 2

1

非常普遍的 C++ 答案是否定的。在运行时,您无法发现特定结构的成员变量是什么。

如何向 C++ 应用程序添加反射?

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

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

于 2011-10-07T02:04:04.793 回答
1

实际上,我从 WCK 的家伙 Jesse Sternberg 那里得到了一个足够好的答案。他的大部分 AS3 类与对应的 C++ 类配对,都是在构建过程中在他自己的“probe”文件夹中自动完成的。在那里,有一个 Box2D.c 类,它在顶部定义了一组模板,然后在 main 函数中,探测类的成员变量,并打印出相关的 AS3 代码以从那一侧访问它们。

习惯它有点时髦,但肯定非常方便,比手动操作要好得多!

于 2011-11-04T18:20:01.530 回答