您的位置:首页 > 其它

脚本在游戏中的应用

2016-04-24 22:46 309 查看
有幸在当前的公司接触了这种完全由脚本驱动的游戏开发。项目组的全部是做脚本开发的,两个不同的游戏,换一下脚本和资源,就成了同一个游戏。游戏的不同其实就是脚本和资源的不同。这和大多数游戏开发公司都不一样。

游戏引擎包含了一个Python引擎,渲染引擎,动画模块,网络模块,事件回调模块,资源管理模块。

Python引擎是和Python相关的部分,封装游戏引擎相关接口给脚本,解析脚本,执行脚本。后面这几个模块都要通过这个模块和脚本沟通。比如脚本创建一个渲染对象就需要调用引擎的创建渲染对象的接口,引擎先生成这样的一个C++对象,然后再生成一个相关的CPython对象(即Python对象在C++里面的表示),把二者联系起来并返回给脚本这个CPython对象。脚本执行这个对象方法的时候,引擎会获知这个CPython对象和方法,然后取出CPython对象对应的C++对象,调用相应函数即可。引擎回调Python对象的时候,会根据C++对象找到CPython对象,然后根据函数字符串名字找到这个脚本函数所对应的CPython对象,执行即可。Python对象的导出要做到完备性,脚本所需要的函数都应该导出,比如渲染对象的SetParent函数,把渲染对象挂到渲染树上。而一些不必要的接口也不应该i导出,比如渲染的对象渲染函数,因为具体的渲染应该对脚本逻辑透明。

渲染引擎是最复杂的,但是对脚本来说应该尽可能简单。主要包括1,节点的创建与挂载,至于销毁与卸载其实是不必要的。当Python对象引用计数为0的时候,会触发CPython对象的Dealloc函数,引擎可以在Dealloc函数判断渲染对象的父节点是否存在,然后把渲染对象从父节点移除。2,渲染对象的节点属性设置修改,包括位置颜色光照等等。3,渲染状态的设置,包括需要的shader,shader的参数修改。

动画模块封装了复杂动画操作,但是对脚本也应该尽可能简单。引擎读取动画配置文件,生成一系列对应名称的动画,脚本制定动画对象的动画名称即可。比如一个人物角色,当点击地图的时候,地图对象捕获触摸事件,回调脚本,脚本执行角色行走动画;当走到终点的时候,引擎再次回调脚本,脚本执行站立动画。我们的游戏把动画对象和渲染对象整合到一起了,即动画对象继承了渲染对象。

网络模块负责脚本和服务器的通信。脚本每帧都通过网络模块查看是否有服务器命令,有则执行。比如有人申请入队,脚本收到服务器指令的时候通过ui告知玩家,当玩家通过的时候,脚本再通过网络接口发送命令给服务器。

事件回调模块处理这样的需求,比如玩家要定时执行某些逻辑,可以注册这样一个函数到事件回调模块,引擎会保存这个函数对象和对应的事件周期。引擎然后每帧都会查看是否有需要处理的事件。

资源管理模块主要包括图片资源和动画资源的管理。当图片不在有用并且内存紧张的时候就可以从缓存中删除。这个是不需要告知脚本的

把引擎封装好给脚本,就可以基本完全用脚本做开发。一些设计到效率的功能,比如说地图模块,涉及到寻路比较耗时的操作,可以放到引擎里面。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: