游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3156|回复: 0

新版虚拟机代码示例

[复制链接]

2万

主题

2万

帖子

6万

积分

论坛元老

Rank: 8Rank: 8

积分
66489
QQ
发表于 2006-10-13 17:34:00 | 显示全部楼层 |阅读模式
#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);                                                                   //输出结果
    }
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2024-11-24 13:04

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表