Класс, помогающий загружать и подготавливать скрипты, с препроцессором, поддерживающим дефайны, инклюды и метаданные.
Если вы хотите отключить обработку метаданных - объявите AS_PROCESS_METADATA 0 в заголовочном файле.
class CScriptBuilder { public: // Load and build a script file from disk int BuildScriptFromFile(asIScriptEngine *engine, const char *module, const char *filename); // Build a script file from a memory buffer int BuildScriptFromMemory(asIScriptEngine *engine, const char *module, const char *script, const char *sectionname = ""); // Add a pre-processor define for conditional compilation void DefineWord(const char *word); // Get metadata declared for class types and interfaces const char *GetMetadataStringForType(int typeId); // Get metadata declared for functions const char *GetMetadataStringForFunc(int funcId); // Get metadata declared for global variables const char *GetMetadataStringForVar(int varIdx); };
#include "commonfuncs.as"
void main()
{
// Call a function from the included file
CommonFunc();
}
Это особенно полезно когда один скрипт используется несколькими приложениями, например клиент\сервером, или существует несколько целевых платформ.
Пример скрипта:
class CObject
{
void Process()
{
#if SERVER
// Do some server specific processing
#endif
#if CLIENT
// Do some client specific processing
#endif
// Do some common processing
}
}
Метаданные должны быть в скобках []. После сборки скрипта приложение может получить метаданные в виде строки и интерпретировать их по своему усмотрению.
Пример скрипта с метаданными:
[factory func = CreateOgre, editable: myPosition, editable: myStrength [10, 100]]
class COgre
{
vector3 myPosition;
int myStrength;
}
[factory]
COgre @CreateOgre()
{
return @COgre();
}
Пример использования:
CScriptBuilder builder; // Находим глобальную переменную, которая была помечена как изменяемая asIScriptModule *mod = engine->GetModule("my module"); int count = mod->GetGlobalVarCount(); for( int n = 0; n < count; n++ ) { string metadata = builder.GetMetadataStringForVar(n); if( metadata == "editable" ) { // Показываем глобальную переменную ... } } }