noslopforever [天堂里的死神]

我浴血奋战,只为了神圣永久不变的传言

李巍ID:noslopforever
71490次访问,排名1384好友4人,关注者9
3D、图形学、游戏、哲学、历史、音乐,一个都不能少。
noslopforever的文章
原创 83 篇
翻译 2 篇
转载 4 篇
评论 202 篇
noslopforever(天堂里的死神)的公告

-欢迎大家来到我的空间。这里关注游戏相关学科的问题。
-自我介绍:男,25岁,程序员,喜欢战争、历史和哲学题材游戏。作为一位普通的初学者,希望众位前辈们能多多包涵和帮助。
-欢迎大家拍砖。本Blog原创的文章,如要转载,请注明出处和姓名。本Blog放置的代码,大部分是伪码,不保证能够运行。
*留言本1:没有CSDN帐号的网友留言请点击此链接
*留言本2:CSDN网友请在个人空间留言 ^_^




烽火过千年,往事如烟。争斗一生归何处?黄土青山。 繁华总易逝,回首不堪。敢叫天地换新颜,铁马连天。 ——《无题》 李巍于2008年6月9日

-最近在做:做好自己的项目,安排自己的时间。

-有些栏目的文章是不放在主页显示的,如果有感兴趣的可以到相应栏目查询。杂项和Just As Gamer栏目的,仅作为个人喜好,恕不回复。

最近评论
blue:您好,这篇文章很好,能不能给我发一个例子,谢谢
夫妻肺片:尽管历史不能“如果”,但历史的教训可以汲取。汲取的目的只是在下一次的偶然中把握住必然的东西。
新浪网友:这是对西方文明的绝好讽刺!谢谢博主让我们看到这封信.
夫妻肺片:其实世界上只有三种关系:人与自然,人与社会,人与自己。其中人与自然那是环保局的事,人与社会那是老板的事,而人与自己才是自己的事。
夫妻肺片:“变是唯一的不变”。
文章分类
收藏
相册
misc杂项
朝圣者的路途
文档所需图片册
我的书单
我的照片
!飞龙在天!
cproom前辈的Blog
eXtreme 3D —— Dreams的Blog(RSS)
flymemory的Blog
johnson的Blog——我的老师和第一个上司 ^_^
nhsoft——野猪大大的Blog
Nightmare of Design/Dev(RSS)
游戏编程实践——我的老师的Blog
马肝前辈的Blog
!虎狼成群!
亮——同学、引擎程序员
江自流——另一位同学兼才思敏捷的策划
游戏王——同学,一位才思敏捷的策划
推荐网页
Boost——C++准标准库
Boost中文站
GameDev.net
OGRE3D中文站
OGRE3D——开源的3D图形引擎
Sourceforge
有关WOW格式的Wiki
涂鸦软件——一个很牛的国产游戏引擎
喜欢的站点
《闪电战》杂志讨论区
帝国之鹰
德军总部
英雄世界
存档
软件项目交易
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes

原创 方便的boost_python收藏

新一篇: DXUT库,CDXUTDialogResourceManager的一个不太好发现的问题 | 旧一篇: 资源系统的管理(估计全世界也只有我不知道了)

去年没发现这档子事情,自己做了个编译器玩玩,耗费了数月时间不说,实际上取得的成果也仅仅是好好复习了一遍C++。

最近数日闲来无事,突然发现去年觉得如虎狼的Boost Python居然如此简单,遂引用之做一脚本系统,不日而成,大喜!

Boost Python本身的例子大家就可以看到其方便之处,可以导出函数,这很SOSO,一句话就可导出一个函数,根本不用去管什么返回值、参数等等。此外,也可以导出类,这就很不简单了,我见过有些人写的Python导出库,怎么说呢,只能导出函数,类是根本都导出不了的。虽说游戏脚本用类的很少,但这起码是一种功能上的缺憾,类是一种有效的数据和算法组织方式,有了总是好的。

众看官少安毋躁,听我先说两个名词解释:

导出,地球人都知道,把C++程序里的某些函数 导出 ,以使得Python能使用它们,这个动作叫导出。

导入,即是相反的过程,在C++程序里运行Python脚本,这是游戏脚本一个很重要的方面。在做控制台、GUI脚本、逻辑控制的时候,导入都很重要。一般说来,Python的导入都是通过Py_RunXXX来实现的。

关键点要来了~

Boost Python默认情况下,仅会将函数导出作为Python IDLE的插件,供Python IDLE使用。而在我们游戏中,一般如下:

游戏的开始,将所有函数全部导出到各个模块中,并在Python中注册这些模块。游戏运行时调用Python语句。

导出好做,导入也好做,中间这一环,在Python中注册,就不好办了。Boost的解法是:将导出函数打包成一个DLL,将这个DLL放到Python的几个插件Dir中去,然后就可以在任何地方访问这些导出的功能了。

但是我们游戏不需要这样,一般都是游戏运行一次,注册一堆导出函数,运行完毕后,这些导出功能也就没了意义了,干嘛让他们死皮赖脸地守在插件Dir里面呢?还有,插件Dir是Python自己的特性,难道说要让每一个游戏客户端都必须安装Python吗?那也太垃圾了。

今天突然来了个念头,Python如何从Dll中找到相应的导出函数呢?一定是Dll中有相应的DllExport,于是根据这个想法顺藤摸瓜,果然,INIT_MODULE(p)宏其实本身就是一个DllExport函数,函数名就是init+p(其实没有这个加号,例如一个名叫HAHA的Module,这个函数名应该是initHAHA)。

好,剩下的问题就很简单了,我们不要Python来装载注册插件Dll了,我们自己来装载这些功能!方法就是在游戏的开头,导出完所有的导出函数和Module后,由我们自己来调用initHAHA,手动通知Python来注册相应的功能。

代码大约如下:(伪代码,请参考BoostPython例子进行修改)

INIT_MODULE(HAHA)

{

......

}

 

void main()

{

 Py_Initialize();

  initHAHA();      // 其实就这一行就可以完成注册!

 // Have Fun

 // End

 Py_Finalize();

}

由于东西是在公司写的,所以家里没有源码,凭记忆写下一些函数,名称上可能有出入,因此请参考BoostPython本身的例子来看,对不起!

发表于 @ 2006年03月07日 00:53:00|评论(loading...)|编辑

新一篇: DXUT库,CDXUTDialogResourceManager的一个不太好发现的问题 | 旧一篇: 资源系统的管理(估计全世界也只有我不知道了)

评论:没有评论。

发表评论  


登录
Csdn Blog version 3.1a
Copyright © noslopforever(天堂里的死神)