Создание кода AS3 для классов C ++, конвертированных с помощью Alchemy (a la Box2D) - PullRequest
0 голосов
/ 07 октября 2011

Итак, у меня есть коллекция классов 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и может быть прочитан через классы MemUser Алхимии _mrf (чтение fload из точки в памяти) с помощью _mrf (pointerAddress), и вы можете читать во втором плавающем файле с помощью _mrf (pointerAddress + 4).

Мой вопрос такой,Если вы не являетесь экспертом в C ++ (я), есть ли способ получить определение класса, как в адресах всех переменных внутри и каковы они?Итак, для b2Vec2 я бы представил, что это будет что-то вроде: float32 x 0 float34 y 4 ...

Причина, по которой я спрашиваю, состоит в том, что один из классов, в частности, имеет множествоПеременные и попытка получить информацию обо всех и каждого, чтобы я мог получить к ней доступ непосредственно из кода AS3, было бы большой работой, и я собираюсь предположить, что внесу в нее множество человеческих ошибок.

Ответы [ 2 ]

1 голос
/ 04 ноября 2011

На самом деле я получил достаточно хороший ответ от парня из WCK, Джесси Штернберга. Он получил большинство своих классов AS3, которые в паре со своими аналогами C ++, выполняются автоматически во время процесса сборки в его собственной папке «probe». Там есть один класс Box2D.c, который определяет загрузку шаблонов вверху, затем в основной функции проверяет классы на переменные-члены и выводит соответствующий код AS3 для доступа к ним с этой стороны.

К этому немного привыкнуть, но, конечно, очень удобно и намного лучше, чем делать это вручную!

1 голос
/ 07 октября 2011

Очень общий ответ C ++ - нет. Во время выполнения вы не можете узнать, какие переменные-члены конкретной структуры.

Как добавить отражение в приложение C ++?

Я не знаю, как выглядит скомпилированный код Alchemy. Вы можете создать некоторый инструмент / препроцессор для генерации классов или структур C ++ из какого-либо другого представления, а затем этот инструмент также может генерировать ваши аксессоры AS3 - это будет способом устранения ошибки пользователя и некоторой работы. Это может быть сложно, поскольку выяснить адрес переменной-члена не всегда так просто.

Если вы можете вызывать функции-члены в классе C ++, почему бы вам не переместить туда свои функции get / set и не вызвать их?

...