游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4459|回复: 1

《古月》天使脚本引擎已实现脚本C函数映射真实C++非静

[复制链接]

2万

主题

2万

帖子

6万

积分

论坛元老

Rank: 8Rank: 8

积分
66489
QQ
发表于 2007-2-14 11:53:00 | 显示全部楼层 |阅读模式
Borland C/C++中的__closure关键字,可以让一个函数指针能够指向任意一个,包括未知类的非静态成员函数。

前些日子,我曾经公布了Microsoft C/C++ (Visual C/C++)下的解决办法。

现在,在天使脚本引擎中的这一处理也已实现。

天使脚本引擎中
脚本类成员函数(简称SMF)可以映射为真实C函数(CF)或真实C++类非静态成员函数(CMF)。
而一个普通的脚本C函数(SF)仅能映射真实C函数(CF),不能映射到C++非静态成员函数(CMF)。

而现今的程序设计中大量使用到类,如果脚本引擎中的普通C函数仅能映射C函数,会让编程变得极为麻烦。反之如果可以映射非静态C++类成员函数,那将极大的简化我们的程序设计。

于是,再次动用汇编之力修改天使脚本引擎。支持了这一完全不符合C++标准的设计。
  1. #include<hgl/hgl.h>
  2. #include<hgl/AngelVM.H>
  3. #include<stdio.h>
  4. //
  5. using namespace hgl;
  6. //
  7. int value = 0;
  8. //
  9. int test_func(int a)
  10. {
  11.     return 128+a;
  12. }
  13. //
  14. class TestObject:public _Object
  15. {
  16. public:
  17.     int func(int a)
  18.     {
  19.         return 64+a;
  20.     }
  21. };
  22. //
  23. char script[]=
  24. {
  25.     "void main()                \n"
  26.     "{                          \n"
  27.     "   int a=256;              \n"
  28.     "   test_value=a+func(15);  \n"
  29.     "   test_value+=cpp_func(0);\n"
  30.     "}                          \n"
  31. };
  32. //
  33. void GameMain(wchar_t *)
  34. {
  35.     AngelVM vm;                                         //定义虚拟机
  36.     AngelVM::Module *module;
  37. //
  38.     TestObject *to=new TestObject;
  39. //
  40.     vm.MapProperty("int test_value",&value);                        //设定变量映射
  41.     vm.MapFunc("int func(int)",test_func);                          //设定C函数映射,调用test_func
  42.     [color=#FF0000]vm.MapCppFunc("int cpp_func(int)",to,TestObject::func);         //设定C++函数映射,调用to->func[/color]
  43. //
  44.     module=vm.CreateModule("test");                     //创建模块
  45. //
  46.     module->AddScript("main",script);                   //添加脚本
  47. //                                                        //脚本可多次添加,最在最后再调用Build
  48. //
  49.     module->Build();                                    //编译脚本
  50. //
  51.     module->RunScript("test_value=func(25);");          //运行指定文本,让脚本调用真实程序中的函数
  52. //
  53.     printf("value=%d\n",value);                         //输出结果
  54. //
  55.     module->RunFunc("void main()");                     //运行指定的函数,调用脚本中的函数
  56. //
  57.     printf("value=%d\n",value);                         //输出结果
  58. //
  59.     delete to;
  60. }
复制代码

14

主题

245

帖子

256

积分

中级会员

Rank: 3Rank: 3

积分
256
QQ
发表于 2007-2-15 12:29:00 | 显示全部楼层

Re:《古月》天使脚本引擎已实现脚本C函数映射真实C++非静

borland把函数代理集成到语言里了。但现在这种技术已经很成熟了。。
VC下也早就有解决方案了,看看FastDelegate或是Boost里的东西。。就很不错。。
实现的也很优雅,相反,这不应该是什么神秘的事。

脚本里如果本身不支持函数代理,那你也没办法使用。
除非你改,如果你改动的话,那么你就得注意看看脚本的使用协议。
但是个人认为,脚本不应该太过复杂。因为脚本最重要的是速度和稳定。。
一个脚本如果速度太慢或是稳定性不够高。那其实不如换一个。

个人见解。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-22 19:14

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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