Оглавление

Регистрация типа значения

При регистрации типа значения, необходимо указывать размер типа, чтобы AngelScript знал, сколько места нужно для него. Если тип не содержит указателей или ссылки на другие ресурсы, который необходимо сохранить, то тип может быть зарегистрирован с флагом asOBJ_POD. В этом случае AngelScript не требуется конструктор\деструктор, они будут сгенерированы автоматически.
// Регистрация примитивного типа
r = engine->RegisterObjectType("pod", sizeof(pod), asOBJ_VALUE | asOBJ_POD); assert( r >= 0 );

// Регистрация класса, который должен быть надлежащим образом инициализирован
r = engine->RegisterObjectType("val", sizeof(val), asOBJ_VALUE); assert( r >= 0 );
Рекомендуется:
Строка (STL) в папке с аддонами

Конструктор и деструктор

При необходимости конструктор и деструктор регистрируются следующим образом:
void Constructor(void *memory)
{
  // Создаем объект
  new(memory) Object();
}

void Destructor(void *memory)
{
  // Очищаем память вызовом деструктора
  ((Object*)memory)->~Object();
}

// Регистрируем отношения
r = engine->RegisterObjectBehaviour("val", asBEHAVE_CONSTRUCT, "void f()", asFUNCTION(Constructor), asCALL_CDECL_OBJLAST); assert( r >= 0 );
r = engine->RegisterObjectBehaviour("val", asBEHAVE_DESTRUCT, "void f()", asFUNCTION(Destructor), asCALL_CDECL_OBJLAST); assert( r >= 0 );

Соотношение типов и нативных вызовов

Если тип данных передается в скрипт или в приложение, важно зарегистрировать данный тип в AngelScript. Вот несколько флагов для этого:

asOBJ_APP_CLASS C++ класс\структура
asOBJ_APP_CLASS_CONSTRUCTOR C++ тип имеет уникальный конструктор
asOBJ_APP_CLASS_DESTRUCTOR C++ тип имеет уникальный деструктор
asOBJ_APP_CLASS_ASSIGNMENT C++ тип имеет уникальный оператор присваивания
asOBJ_APP_PRIMITIVE C++ тип примитивный, но не float или double
asOBJ_APP_FLOAT C++ тип float или double

Обратите внимание, что они не представляют как тип будет вести себя в скрипте, а только описывают тип, находящийся в главном приложении. Так что если вы хотите зарегистрировать класс С++, который по вашему желанию должен вести себя как примитивный в скрипте, то вы все равно должны использовать флаг asOBJ_APP_CLASS. То же самое остальных флагов. Эти флаги показывают, что класс имеет соответствующую функцию, а не определяют данную функцию в скрипте.

Для класса есть более короткие флаги для каждой комбинации. Они имеют вид asOBJ_APP_CLASS_CDA, где последние буквы означают Constructor \ Destructor \ Assignment behaviour, то есть данный флаг включает в себя следующие asOBJ_APP_CLASS | asOBJ_APP_CLASS_CONSTRUCTOR | asOBJ_APP_CLASS_DESTRUCTOR | asOBJ_APP_CLASS_ASSIGNMENT.

// Регистрация комплексного типа
r = engine->RegisterObjectType("complex", sizeof(complex), asOBJ_VALUE | asOBJ_APP_CLASS_CDA); assert( r); assert( r >= 0 );

Убедитесь, что вы правильно указали флаги, в противном случае возникнут различные ошибки при выполнении скриптов. Общие проблемы - повреждение стека и обращение к недействительной памяти. В некоторых случаях вы можете столкнуться с менее заметными ошибками, которые трудно будет обнаружить.


Перевод - arroy.one@gmail.com. При копировании материалов указывайте ссылку на источник.