基于Python的网络游戏脚本系统的设计与实现
摘要:传统的网络游戏开发采用c/c++实现游戏的逻辑功能,随着游戏内容越来越丰富以及快速变化的市场需要,c/c ++已经不能满足开发者对于语言灵活性、易用性、动态编译的需求。为此文中提出了一种基于python的游戏脚本系统,通过将游戏内容与游戏引擎相分离、避免硬编码,提高了游戏的开发效率和稳定性。
关键词:python;网络游戏;脚本;集成
中图分类号:tp391.9 文献标识码:a 文章编号:1009-3044201309-2109-03
1 概述
网络游戏发展至今,市场竞争相当激烈,这就促使开发者必须快速、高效的响应玩家需求才能站得一席之地。传统的游戏开发中大量使用c/c++技术,虽然c/c++有着明显的性能优势,但很多时候我们关心的不是程序的运行效率,而是程序的开发效率、维护效率、可移植性等[1]。在游戏中使用python脚本,就正好能满足这些目标,小到一些计算公式,大到游戏的控制流程都可以通过脚本完成,且python支持运行时动态修改,能做到代码热更新。因此,构建基于pyth
on的网络游戏脚本系统是非常具有应用价值的。
2 python动态脚本语言简介
python是一门优雅、简约、健壮的开源解释性语言。它诞生于1989年,由guido van rossum开发设计。python最初源自于某个研究项目,为了提高工作效率而创造的一种通用程序设计语言。经过十来年的发展,python已经逐渐完善,由于其强大的扩展性和丰富的库支持,很多领域都出现了它的身影,譬如youtube、豆瓣等就是使用python技术的成功案例。python的主要特点有[2]
1)进入门槛低 python语法相当的简洁,编写出的程序通常短小精悍,且类似于自然语言,符合开发者的使用常识和直觉,再加上设计精巧的数据结构和内存管理,使得它成为一门容易学习的编程语言。
2)面向对象 python中面向对象的实现是通过使用自定义的类和对象来完成的,这种特性是在其设计之初就被赋予的。
3)内存管理功能 python解释器接管了内存管理,这使得开发人员可以更关注于程序本身逻
辑的实现,而不必像c/c++程序员那样常常分心于内存事务的处理。正因为如此,python开发的程序周期更短、错误更少。
4)可方便地嵌入宿主语言并与其通讯 通常一些特别强调性能的地方,可以用c来编写,然后在python中调用这些扩展模块以达到性能提升的目的。反之c/c++中也可以嵌入python解释器,这样就可以替代动态连接库形式的接口,使得程序开发更灵活。
5)丰富的库 python的标准库包含有数百个模块,其功能涵盖与操作系统、解释器、internet等的交互,所有这些模块都已经充分测试,可以直接在开发中使用。
3 脚本系统架构设计
脚本在游戏开发中扮演着粘合剂的角,如何高效、快捷的使用和管理脚本,使之服务于游戏逻辑的开发并驱动整个游戏进程就是我们需要解决的问题。脚本和宿主代码通常是以事件为中心进行相互交互[3],具体在游戏中与脚本交互的就是我们的游戏引擎。从图1中我们可以得知脚本系统的基本框架,即脚本语言本身和脚本接口模块。脚本系统设计的关键在于接口模块的实现,为了提供一个通用的脚本系统设计方案,我们将脚本接口模块集成到引擎中。
脚本接口模块主要作用是方便python脚本的扩展和嵌入,为python脚本与游戏引擎之间提供一个数据交互的通道,从而将游戏的逻辑和具体实现分离开来[4]
3.1 脚本接口模块的总体设计
脚本接口模块的总体设计如图2所示,它由游戏世界接口、脚本对象管理器、脚本包装器、逻辑脚本、消息处理器脚本几个部分组成。其作用主要包括以下一些方面:
1)提供python脚本能够实现游戏具体功能的接口,具体包括脚本可以创建游戏对象、修改游戏中角对象属性、设置定时器、打印调试日志等功能,这是由游戏世界接口管理完成的。
2)便于引擎管理脚本文件,使得引擎能够根据逻辑灵活的调用相关脚本。这是通过脚本包装器将脚本文件由一个独立的管理类模块管理实现的,脚本包装器由逻辑脚本对象、消息处理器对象组成。其中消息处理器对象维护着一个消息到逻辑处理的映射关系表。
3)通过修改消息处理器对象维护的映射关系表,引擎内核可以动态的加载、修改、删除脚本对象,从而实现游戏逻辑的热更新。
通过脚本接口模块这个抽象层使得引擎与python脚本可以相互交互,pythonc++的交互是建立在pythonc的基础上的,主要是数据格式的转换和对异常的处理。
3.2 python调用引擎函数
本系统需要使用python语言来实现引擎的逻辑部分,因此引擎必须为python语言提供访问内部实体的接口,提供一个接口需要以下一些步骤:
1)引擎中创建具体的扩展模块代码。
2)脚本接口系统中编写一个单独的c源文件,并利用样板来包装代码。
包含python.h头文件,它包含了我们所需要的所有声明。
为每一个函数都增加pyobject *module_func()的包装函数,用于将python参数转换成c程序格式类型,处理完再转换为python对象传回给python解释器。期间如果有错误出现,即设置模块的异常处理对象并返回null
增加pymethoddef modulemethods[]的数组,用于将函数名与函数实现联系起来。
增加模块初始化函数initmethod()。
此外,还可以通过一些自动化工具来完成上述过程,譬如使用swig工具,它是一种简化脚本语言与c/c++接口的开发工具,通过包装和编译c程序达到与脚本通讯的目的[5]
3.3 引擎调用python函数
python被用作实现引擎中的逻辑和消息处理器,然后在需要的时候从c++中调用脚本中的函数。主要步骤如下:
1)设置编译环境,即设置python头文件和库文件目录。
python可以做什么游戏2)初始化python解释器,py_initialize()。
3)调用python脚本逻辑,并处理异常。
4)释放资源,py_finalize()。
4 应用案例
该脚本系统结构清晰,易于实现,利用该系统在游戏中的寻路和城战模块中使用python脚本来完成逻辑,如图3所示,实践证明使用该脚本系统能够带来较高的开发效率,且能动态的修复线上bug,快速的响应了玩家的需求。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。