Оглавление

Использование скриптовых классов

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

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

Создание экземпляра скриптового класса

Если известно имя класса, тип класса можно легко получить вызовом GetTypeIdByDecl. Также можно получить класс по индексу (GetObjectTypeByIndex) и проверить по интерфейсу (asIObjectType).

Если вы используте сборщик скриптов, используйте asIScriptModule для перечисления зарегестрированных типов.

Как только тип класса известен, вы создаете его экземпляр вызовом фабричной функции, передавая в нее необходимые аргументы, например указатель на класс в приложении, который будет связан с скриптовым классом. Id фабричной функции находится с помощью asIObjectType.

// Получаем объект
asIScriptModule *module = engine->GetModule("MyModule");
asIObjectType *type = engine->GetObjectTypeById(module->GetTypeIdByDecl("MyClass"));

// Получаем id фабрики из объекта
int factoryId = type->GetFactoryIdByDecl("MyClass @MyClass(int)");

Фабричная функция вызывает глобальную функцию и возвращает хэндл на созданный класс.

Вызов метода скриптового класса

Вызов методов скриптового класcа похож на вызов глобальной функции за исключением того, что кроме id метода необходимо предоставить указатель на класс.
// Получаем id метода класса
int> funcId = type->GetMethodIdByDecl("void method()");

// Подготавливаем контекст для вызова
ctx->Prepare(funcId);

// Устанавливаем указатель но объект
ctx->SetObject(obj);

// Запускаем!
ctx->Execute();

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