![]() |
|
||||||||||
|
|
|
|||||
|
Регистрация: Jul 2012
Сообщений: 3
|
У меня возникла проблема:
Необходимо взять отдельный класс и портировать его через alchemy во flash, где далее вызывать класс и еще методы. класс должен быть написан на С++. Я не понимаю, как нужно написать класс, и как его портировать, чтобы потом в AS3 спокойно вызывать. файл с С++ кодом содержит только методы и аргументы класса, с его описанием. никаких main() быть не должно. Прошу, поясните, кто этим занимался, как должен выглядеть файл С++? |
|
|||||
|
listener
|
Интересный вопрос.
Я немного занимался алхимией, но вот что выяснил. main играет роль точки входа в модуль, т.е. инициализируются все механизмы, без него никуда. Но это не помеха. Проблема в другом. Если посмотреть AS3.h из SDK и пример AS3lib то можно увидеть как с-функции "передаются" во флеш. Делается это посредством функции AS3_Val AS3_Function(void *data, AS3_ThunkProc proc); proc - это и есть указатель на с-функцию. Вроде бы все просто, но вот указатель на нестатическую функцию-член класса так не "передашь". Можно либо все функции-члены класса делать static, либо использовать обертки для нестатических. У меня заработал вот такой пример (на базе AS3Lib из SDK): // test.c #include "test.h" Test t; // a C thunk for an AS3 function AS3_Val someEntry(void *data, AS3_Val args) { int n = 34, k = 1234; double d = 12.34; char buf[256]; AS3_ArrayValue(args, "IntType, DoubleType, IntType", &n, &d, &k); sprintf(buf, "0x%X %f %d", n, d, k); return AS3_String(buf); } AS3_Val someMethod2(void *data, AS3_Val args) { return t.someMethod2(data, args); } int main() { // regular function AS3_Val someEntryVal = AS3_Function(NULL, someEntry); // class static member thunk AS3_Val someMethodVal = AS3_Function(NULL, &(Test::someMethod)); // class non-static member thunk wrapper AS3_Val someMethod2Val = AS3_Function(NULL, someMethod2); // construct an object that holds refereces to the 3 functions AS3_Val result = AS3_Object("someEntry: AS3ValType, someMethod: AS3ValType, someMethod2: AS3ValType", someEntryVal, someMethodVal, someMethod2Val); AS3_Release(someMethodVal); AS3_Release(someMethod2Val); AS3_Release(someEntryVal); // notify that we initialized -- THIS DOES NOT RETURN! AS3_LibInit(result); // XXX never get here! return 0; } // test+.cpp #include "test.h" AS3_Val Test::someMethod (void *data, AS3_Val args) { int n = 34, k = 1234; double d = 12.34; char buf[256]; AS3_ArrayValue(args, "IntType, DoubleType, IntType", &n, &d, &k); sprintf(buf, "static %d %f %d", n, d, k); return AS3_String(buf); } AS3_Val Test::someMethod2 (void *data, AS3_Val args) { int n = 34, k = 1234; double d = 12.34; char buf[256]; AS3_ArrayValue(args, "IntType, DoubleType, IntType", &n, &d, &k); sprintf(buf, "non static :%d %f %d", n, d, k); return AS3_String(buf); } // test.h #include <stdlib.h> #include <string.h> #include <stdio.h> #include "AS3.h" class Test { public: static AS3_Val someMethod (void *data, AS3_Val args); AS3_Val someMethod2 (void *data, AS3_Val args); }; alc-on;which g++ g++ -c test+.cpp g++ -c test.c g++ -swc -o test.swc test.o test+.o -lm Тест во флеше package { import flash.display.Sprite; import flash.events.Event; import flash.text.TextField; import flash.text.TextFieldAutoSize; import flash.text.TextFieldType; import cmodule.test.CLibInit; public class Main extends Sprite { private var textInp:TextField = new TextField(); public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); // entry point textInp.x = textInp.y = 10; textInp.width = 200; textInp.type = TextFieldType.INPUT; textInp.autoSize = TextFieldAutoSize.LEFT; addChild(textInp); test(); } private function test():void { // create lib initialization object var lib:CLibInit = new CLibInit(); textInp.text = "Initting lib..."; // initialize... var res:* = lib.init(); textInp.text = "Initted lib"; // call someEntry w/ default params textInp.appendText("\n" + res.someEntry()); // call someEntry w/ 1 param textInp.appendText("\n" + res.someEntry(1)); // call someEntry w/ 2 params textInp.appendText("\n" + res.someEntry(1,2)); // call someEntry w/ all params textInp.appendText("\n" + res.someEntry(1, 2, 3)); textInp.appendText("\nsomeMethod\n" + res.someMethod(1,2,3)); textInp.appendText("\nsomeMethod2\n" + res.someMethod2(1,2,3)); textInp.appendText("\n" + "---"); } } } Цитата:
тонкости с указателями на члены класса соблюсти придется. Имхо, разумнее пользовать обертки. Конечно, опыта было немного, но чем богаты). |
|
|||||
|
Регистрация: Jul 2012
Сообщений: 3
|
Я особенно рада этой строке:
AS3_Val result = AS3_Object("someEntry: AS3ValType, someMethod: AS3ValType, someMethod2: AS3ValType", someEntryVal, someMethodVal, someMethod2Val); Спасибо за сообщение, после него остается еще 1 вопрос: А есть ли способ создать элемент класса в C++ из as3. я так понимаю, показанный пример помогает обращаться к просто функциям... а что же делать с элементами класса, их методами и алгоритмами? |
|
|||||
|
listener
|
мм.. так в примере выше вполне себе используется экземпляр с++ класса Test (переменная t). Вызываются его методы, посмотрите внимательнее. Сложность в том, что нельзя сделать так:
и приходится использовать "обертку": Создать его (экземпляр) можно и динамически в одной из оберточных функций, почему нет? AS3_Val someMethod2(void *data, AS3_Val args) { Test t_local; return t_local.someMethod2(data, args); } Цитата:
Самый простой случай - сделать все поля с++ класса статическими, тогад к ним можно будет обращаться "напрямую", как в примере: // class static member thunk AS3_Val someMethodVal = AS3_Function(NULL, &(Test::someMethod)); //someMethodVal по-сути указатель на статический метод класса Test Ну, а здесь мы привязываем указатели к некоему ActionScript-объекту, с которым можно будет работать из флеша. Последний раз редактировалось alexcon314; 08.08.2012 в 18:06. |
|
|||||
|
Регистрация: Jul 2012
Сообщений: 3
|
спасибо. затупила)
ваша информация мне очень пригодится... теперь, вроде как, понятны азы инструментария алхимии) дальше документация мне в помощь) |
![]() |
![]() |
Часовой пояс GMT +4, время: 01:09. |
|
|
« Предыдущая тема | Следующая тема » |
|
|