Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > Flash Приложения: AIR, Zinc и тд.

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 07.08.2012, 15:19
Henrietta89 вне форума Посмотреть профиль Отправить личное сообщение для Henrietta89 Найти все сообщения от Henrietta89
  № 1  
Ответить с цитированием
Henrietta89

Регистрация: Jul 2012
Сообщений: 3
По умолчанию Alchemy & C++

У меня возникла проблема:
Необходимо взять отдельный класс и портировать его через alchemy во flash, где далее вызывать класс и еще методы.
класс должен быть написан на С++.

Я не понимаю, как нужно написать класс, и как его портировать, чтобы потом в AS3 спокойно вызывать.
файл с С++ кодом содержит только методы и аргументы класса, с его описанием. никаких main() быть не должно.

Прошу, поясните, кто этим занимался, как должен выглядеть файл С++?

Старый 08.08.2012, 12:12
alexcon314 вне форума Посмотреть профиль Отправить личное сообщение для alexcon314 Найти все сообщения от alexcon314
  № 2  
Ответить с цитированием
alexcon314
listener

модератор форума
Регистрация: Jun 2006
Сообщений: 3,260
Записей в блоге: 28
Отправить сообщение для alexcon314 с помощью ICQ
Интересный вопрос.
Я немного занимался алхимией, но вот что выяснил.
main играет роль точки входа в модуль, т.е. инициализируются все механизмы, без него никуда.
Но это не помеха. Проблема в другом.
Если посмотреть AS3.h из SDK и пример AS3lib то можно увидеть как с-функции "передаются" во флеш.
Делается это посредством функции
AS3_Val AS3_Function(void *data, AS3_ThunkProc proc); proc - это и есть указатель на с-функцию.
Вроде бы все просто, но вот указатель на нестатическую функцию-член класса так не "передашь".
Можно либо все функции-члены класса делать static, либо использовать обертки для нестатических.
У меня заработал вот такой пример (на базе AS3Lib из SDK):
Код AS3:
// 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;
}
Код AS3:
// 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);
}
Код AS3:
// 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);
};
Компиляция из cyqwin:
alc-on;which g++
g++ -c test+.cpp
g++ -c test.c
g++ -swc -o test.swc test.o test+.o -lm
Тест во флеше
Код AS3:
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" + "---");
			}
	}	
}
Output:
Цитата:
Initted lib
0x22 12.340000 1234
0x1 12.340000 1234
0x1 2.000000 1234
0x1 2.000000 3
someMethod
static 1 2.000000 3
someMethod2
non static :1 2.000000 3
---
т.е. сам по себе с++ класс как есть вы не сможете закинуть в алхимию, нужен инициализатор модуля main, ну и
тонкости с указателями на члены класса соблюсти придется. Имхо, разумнее пользовать обертки.
Конечно, опыта было немного, но чем богаты).

Старый 08.08.2012, 16:36
Henrietta89 вне форума Посмотреть профиль Отправить личное сообщение для Henrietta89 Найти все сообщения от Henrietta89
  № 3  
Ответить с цитированием
Henrietta89

Регистрация: Jul 2012
Сообщений: 3
Я особенно рада этой строке:
Код AS3:
AS3_Val result = AS3_Object("someEntry: AS3ValType, someMethod: AS3ValType, someMethod2: AS3ValType",  someEntryVal, someMethodVal, someMethod2Val);
не могла понять, как несколько функций определить.

Спасибо за сообщение, после него остается еще 1 вопрос:
А есть ли способ создать элемент класса в C++ из as3. я так понимаю, показанный пример помогает обращаться к просто функциям...
а что же делать с элементами класса, их методами и алгоритмами?

Старый 08.08.2012, 17:52
alexcon314 вне форума Посмотреть профиль Отправить личное сообщение для alexcon314 Найти все сообщения от alexcon314
  № 4  
Ответить с цитированием
alexcon314
listener

модератор форума
Регистрация: Jun 2006
Сообщений: 3,260
Записей в блоге: 28
Отправить сообщение для alexcon314 с помощью ICQ
мм.. так в примере выше вполне себе используется экземпляр с++ класса Test (переменная t). Вызываются его методы, посмотрите внимательнее. Сложность в том, что нельзя сделать так:
Код:
AS3_Val someMethod2Val = AS3_Function(NULL, t.someMethod2);// ошибка компиляции
и приходится использовать "обертку":
Код AS3:
AS3_Val someMethod2(void *data, AS3_Val args)
{  
  return t.someMethod2(data, args);
}
Создать его (экземпляр) можно и динамически в одной из оберточных функций, почему нет?
Код AS3:
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-объекту, с которым можно будет работать из флеша.
Код:
S3_Val result = AS3_Object("someEntry: AS3ValType, someMethod: AS3ValType, someMethod2: AS3ValType",  someEntryVal, someMethodVal, someMethod2Val);


Последний раз редактировалось alexcon314; 08.08.2012 в 18:06.
Старый 09.08.2012, 09:29
Henrietta89 вне форума Посмотреть профиль Отправить личное сообщение для Henrietta89 Найти все сообщения от Henrietta89
  № 5  
Ответить с цитированием
Henrietta89

Регистрация: Jul 2012
Сообщений: 3
спасибо. затупила)

ваша информация мне очень пригодится... теперь, вроде как, понятны азы инструментария алхимии) дальше документация мне в помощь)

Создать новую тему Ответ Часовой пояс GMT +4, время: 01:09.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 01:09.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.