Функция, создающая обьект и передающая его в скрипт выглядит так:
// Зарегистрировано как "obj@ CreateObject()" obj *CreateObject() { // Конструктор инициалицирует счетчик ссылок значением 1 return new obj(); }
Функция, получающая хендл из скрипта и сохраняющая его в глобальной переменной выглядит так:
// Зарегистрировано как "void StoreObject(obj@)" obj *o = 0; void StoreObject(obj *newO) { // удаляет указатель на старый объект if( o ) o->Release(); // создает указатель на новый o = newO; }
Функция, получающая заранее сохраненный обьект выглядит так:
// Зарегистрирована как "obj@ RetrieveObject()" obj *RetrieveObject() { // Увеличиваем счетчик ссылок для возвращаемого обьекта if( o ) o->AddRef(); // Возвращаем null если хендл не валидный return o; }
Функция, получающая хендл в качестве параметра, но не сохраняющая его выглядит следующим образом:
// Зарегистрирована как "void DoSomething(obj@)" void DoSomething(obj *o) { // Когда закончим, обьет необходимо удалить if( o ) o->Release(); }
// Зарегистрирована как "obj@+ ChooseObj(obj@+, obj@+)" obj *ChooseObj(obj *a, obj *b) { // С автохендлами AngelScript автоматически управляет счетчиком ссылок return some_condition ? a : b; }
Однако, при использовании автохендлов движку необходимо обработать все хендлы, что влечет за собой больше ресурсов при вызове зарегистрированной функции.