游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4010|回复: 3

《古月》开发中脚本系统示例程序

[复制链接]

2万

主题

2万

帖子

6万

积分

论坛元老

Rank: 8Rank: 8

积分
66489
QQ
发表于 2005-9-22 14:16:00 | 显示全部楼层 |阅读模式
脚本方面,使用《天使》脚本系统!脚本语法和C/C++几乎一致,和真实程序中的C函数可实现完美互相调用。

#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.SetGloalValue("int test_value",&value);          //设定变量映射
    vm.SetGloalFunc("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-22 14:16: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.SetGloalValue("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-22 19:37: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.SetGloalValue("int test_value",&value);              //设定变量映射
    vm.SetGloalFunc("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

8

主题

239

帖子

239

积分

中级会员

Rank: 3Rank: 3

积分
239
发表于 2005-9-23 13:41:00 | 显示全部楼层

Re:《古月》开发中脚本系统示例程序

这个好,是免费的吗?那有下载?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-1-31 10:11

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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