游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4660|回复: 11

《天使》脚本系统使用示例

[复制链接]

2万

主题

2万

帖子

6万

积分

论坛元老

Rank: 8Rank: 8

积分
66489
QQ
发表于 2005-9-25 21:17:00 | 显示全部楼层 |阅读模式
点击这里查看带有排版及语法加色的页面链接

#include<hgl/hgl.h>
#include<hgl/AngelVM.H>
#include<stdio.h>
using namespace hgl;

int value = 0;

int test_func(int a)
{
    return 128+a;
}

char script[]=
{
    "void main()                \n"
    "{                          \n"
    "   int a=256;              \n"
    "   test_value=a+func(15);  \n"
    "}                          \n"
};

void GameMain(char *)
{
    AngelVM vm;                                         //定义虚拟机

    vm.SetGlobalValue("int test_value",&value);         //设定变量映射
    vm.SetGlobalFunc("int func(int a)",test_func);      //设定C函数映射

    vm.AddScript(script);                               //添加脚本,同时做编译处理

    vm.Run("test_value=func(25);");                     //运行指定程序,让脚本调用真实程序中的函数

    printf("value=%d\n",value);                         //输出结果

    vm.Run("main();");                                  //运行指定的程序,调用脚本中的函数

    printf("value=%d\n",value);                         //输出结果
}

运行结果:

value=153
value=399


使用LUA,映射函数test_func的写法:

int test_func(lua_State *lua)
{
int a=luaL_checkint(lua,1);

lua_pushnumber(lua,a+128);

return(0);
}

2万

主题

2万

帖子

6万

积分

论坛元老

Rank: 8Rank: 8

积分
66489
QQ
 楼主| 发表于 2005-9-25 21:18:00 | 显示全部楼层

Re:《天使》脚本系统使用示例

#include<hgl/hgl.h>
#include<hgl/AngelVM.H>
#include<stdio.h>
using namespace hgl;

class TestObject
{
public:

    int result;

public:

    TestObject(){};
    ~TestObject(){};

    void add(int a,int b)
    {
        result=a+b;
    }
};

void CreateObject(TestObject *o)        //对象创建函数
{
    o=new TestObject;
}

void ClearObject(TestObject &o)         //对象删除函数
{
    o.~TestObject();
}

void add(TestObject *o,int a,int b)
{
    o->add(a,b);
}

char script[]=
{
    "void main()                \n"
    "{                          \n"
    "   object o;               \n"
    "   o.add(1,2);             \n"     //此行会映射调用void add(TestObject *o,int a,int b)
    "   test_value=o.result;    \n"
    "}                          \n"
};

void GameMain(char *)
{
    AngelVM vm;                                                                              
    AngelVM::Object *obj;
    int value=0;

    vm.SetGlobalValue("int test_value",&value);                           //设置变量映射

    obj=vm.SetObject(TestObject,"object",CreateObject,ClearObject);       //创建对象
                                                                          //并设置对象创建删除函数
    {
        obj->SetValue("int result",TestObject,result);                    //设置对象成员变量映射
        obj->SetFunc("void add(int,int)",add);                            //设置对象成员函数映射
    }

    vm.AddScript(script);                                                 //添加脚本,同时做编译处理

    vm.Run("main();");                                                    //运行指定的程序,调用脚本中的函数

    printf("value=%d",value);                                             //输出结果
}

运行结果:

value=3

2万

主题

2万

帖子

6万

积分

论坛元老

Rank: 8Rank: 8

积分
66489
QQ
 楼主| 发表于 2005-9-25 21:19:00 | 显示全部楼层

Re:《天使》脚本系统使用示例

/**
* 这段程序演示了如何利用单步运行来实现暂停脚本的运行
* 暂停脚本运行可用于对话框等关键处
*
* 例如: 脚本先调用真实程序中的函数,设置好对话框内容。
*       这个真实程序的函数同时设置变量让脚本虚拟机暂停运行。
*       等待真实程序收到了用户的结果,则设置变量继续运行脚本虚拟机。
*/
#include<hgl/hgl.h>
#include<hgl/AngelVM.H>
#include<stdio.h>
using namespace hgl;

AngelVM vm;                                                 //定义虚拟机
int value=0;
bool pause=false;

char script[]=
{
    "void main()                    \n"
    "{                              \n"
    "   test_value=2;               \n"
    "   func();                     \n"
    "   test_value=3;               \n"
    "}"
};

void test_func()
{
    pause=true;     //设置变量,暂停虚拟机运行
}

void GameMain(char *)
{
    vm.SetGlobalValue("int test_value",&value);             //设定变量映射
    vm.SetGlobalFunc("void func()",test_func);              //设定C函数映射

    vm.AddScript(script);                                   //添加脚本,同时做编译处理

    vm.Start("main");                                       //从main处开始单步执行
                                                            //注意不能写“main()”或是“void main()”

    while(true)
    {
        if(vm.Step()==0)break;                              //如果运行结束了就退出循环

        if(pause)                                           //如果暂停被触发了
        {
            printf("value=%d\n",value);                     //输出结果

            pause=false;                                    //恢复运行
        }
    }

    printf("value=%d\n",value);                             //输出结果
}

运行结果:

value=2
value=3

69

主题

450

帖子

473

积分

中级会员

战魂缔造者

Rank: 3Rank: 3

积分
473
QQ
发表于 2005-9-26 09:37:00 | 显示全部楼层

Re:《天使》脚本系统使用示例

AngleScript就是比LUA舒服

2万

主题

2万

帖子

6万

积分

论坛元老

Rank: 8Rank: 8

积分
66489
QQ
 楼主| 发表于 2005-9-26 11:14:00 | 显示全部楼层

Re:《天使》脚本系统使用示例

这个示例映射了标准C函数sin

#include<hgl/angelvm.h>
#include<math.h>
#include<stdio.h>

char script[]=  "void main()\n"
                "{\n"
                " test_value=sin(2);\n"
                "}";

using namespace hgl;
void GameMain(char *)
{
    AngelVM vm;                                         //定义虚拟机
    float value;                                        //定义变量

    vm.SetGlobalValue("float test_value",&value);       //设定变量映射
    vm.SetGlobalFunc("double sin(double)",sin);         //设定函数映射,注意sin是标准C函数

    vm.AddScript(script);                               //添加脚本并编译

    vm.Run();                                           //运行脚本

    printf("value=%f",value);                           //输出结果
}

运行结果:

value=0.909297

29

主题

205

帖子

215

积分

中级会员

Rank: 3Rank: 3

积分
215
发表于 2005-9-27 14:01:00 | 显示全部楼层

Re:《天使》脚本系统使用示例

AngleScript?是不是它专用的脚本虚拟程序?怎么都没听说过?

2万

主题

2万

帖子

6万

积分

论坛元老

Rank: 8Rank: 8

积分
66489
QQ
 楼主| 发表于 2005-9-27 15:38:00 | 显示全部楼层

Re:《天使》脚本系统使用示例

不是专用的!没听说过只是因为你没有去找。

LUA号称也是出来有很多年头了,为什么最近游戏界才光大它?

13

主题

101

帖子

101

积分

注册会员

Rank: 2

积分
101
发表于 2005-9-27 16:24:00 | 显示全部楼层

Re:《天使》脚本系统使用示例

问个小问题:游戏开发中脚本系统有什么用? 是不是为了方便测试?

2万

主题

2万

帖子

6万

积分

论坛元老

Rank: 8Rank: 8

积分
66489
QQ
 楼主| 发表于 2005-9-27 18:58:00 | 显示全部楼层

Re:《天使》脚本系统使用示例

很多地方都可以用!

一般在剧情这种变化较大的地方,其它地方诸如粒子系统、GUI上面。

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
发表于 2005-9-27 19:11:00 | 显示全部楼层

Re:《天使》脚本系统使用示例

请问,古月的原码有没有公布?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-27 23:44

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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