Оглавление

Компиляция скриптов

После регистрации наступает время скомпилировать скрипты для запуска.

Отладочный калбек

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

Калбек спроектирован таким образом, что вызывается только в случае ошибок и предупреждений.

При желании сообщения об ошибках можно выводить методом движка WriteMessage.

// Простой каллбек
void MessageCallback(const asSMessageInfo *msg, void *param)
{
  const char *type = "ERR ";
  if( msg->type == asMSGTYPE_WARNING ) 
    type = "WARN";
  else if( msg->type == asMSGTYPE_INFORMATION ) 
    type = "INFO";
  printf("%s (%d, %d) : %s : %s\n", msg->section, msg->row, msg->col, type, msg->message);
}

// Устанавливаем калбек и создаем движок
asIScriptEngine *engine = asCreateScriptEngine(ANGELSCRIPT_VERSION);
engine->SetMessageCallback(asFUNCTION(MessageCallback), 0, asCALL_CDECL);

Загрузка и компиляция скриптов

Для сборки скриптового модуля следует сначала получить модуль из движка, добавить скриптовую секцию и затем собрать его. Собранный модуль может сочетать одну или несколько скриптовых секций, так что ваше приложение может хранить секции в разных файлах или генерировать их динамически. Порядок добавления секций в модуль не имеет значения.
// Создаем новый скриптовый модуль
asIScriptModule *mod = engine->GetModule("module", asGM_ALWAYS_CREATE);

// Загружаем и добавляем скриптовые секции в модуль
string script;
LoadScriptFile("script.as", script);
mod->AddScriptSection("script.as", script.c_str());

// Собираем модуль
int r = mod->Build();
if( r < 0 )
{
  // Сборка закончилась ошибкой
}

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

// Загружаем файл в буффер
void LoadScriptFile(const char *fileName, string &script)
{
  // Открываем файл
  FILE *f = fopen("test.as", "rb");
  
  // Вычисляем размер
  fseek(f, 0, SEEK_END);
  int len = ftell(f);
  fseek(f, 0, SEEK_SET);
  
  // Загружаем
  script.resize(len);
  fread(&script[0], len, 1, f);
  
  fclose(f);
} 

Хоть AngelScript сам и не загружает файлы, но в папке с аддонами вы можете найти Сборщик скриптов, который поможет загрузить и корректно обработать файлы со скриптами. Пример:

CScriptBuilder builder;
int r = builder.BuildScriptFromFile(engine, "module", "script.as");
if( r < 0 )
{
  // Сборка закончилась ошибкой
}
Еще:
Подготовленный байткод

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