|
#include<hgl/hgl.h>
#include<hgl/AngelVM.H>
#include<stdio.h>
using namespace hgl;
class TestObject:public _Object //此类必须从_Object派生,否则成员函数无法映射
{
public:
int result;
public:
void Construct()
{
printf("TestObject()\n");
};
void Destruct()
{
printf("~TestObject()\n");
};
void add(int a,int b,int c)
{
result=(a+b)*c;
}
};
class OutputInfo
{
public:
void OutputText(AngelVM *,const char *text)
{
printf(text);
}
};
void CreateObject(TestObject *o) //对象创建函数
{
//由于对象是由虚拟机创建的,所以无法调用构造函数和析构函数,
//需要使用CreateObject/ClearObject来初始化对象和清除对象
o->Construct();
}
void ClearObject(TestObject *o)
{
o->Destruct();
}
char script[]=
{
"int div(int val) \n"
"{ \n"
" return val/2; \n"
"} \n"
" \n"
"void main() \n"
"{ \n"
" object o; \n"
" o.add(3,5,7); \n"
" test_value=div(o.result); \n"
"} \n"
};
void GameMain(wchar_t *)
{
AngelVM vm; //定义虚拟机
AngelVM::Object *obj; //定义对象
AngelVM::Module *module; //定义模块
OutputInfo oi;
vm.OnInfoOut=oi.OutputText; //设置虚拟机信息输出事件函数,注:这个不是必需设置的
int value=0;
bool result=false; //result仅是为调试本段代码添加
result=vm.MapProperty("int test_value",&value); //设置变量映射
obj=vm.MapObject("object",TestObject,CreateObject,ClearObject); //创建对象,并设置对象创建函数
if(obj)
{
result=obj->MapObjectProperty("int result",TestObject,result); //设置对象成员变量映射
result=obj->MapObjectFunc("void add(int,int,int)",TestObject,add); //设置对象成员函数映射
}
else
return;
module=vm.CreateModule("test_object"); //创建模块
if(module)
{
result=module->AddScript("main",script); //添加脚本,同时做编译处理
result=module->Build(); //编译
module->RunFunc("void main()"); //运行指定的程序,调用脚本中的函数
printf("value=%d",value); //输出结果
}
}
|
|