`
xiaoer_1982
  • 浏览: 1882183 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

python脚本语言

阅读更多

为什么在游戏中使用脚本
在早期的一些游戏中,大部分的游戏逻辑都直接写入游戏代码,例如计算公式、游戏流程等。但随着游戏产业的不断发展,游戏开发本身也变得越来越复杂,游戏企划需要更多的时间来对游戏进行调整,如果游戏逻辑还写在代码中,则企划对游戏的每次修改都要通过程序进行,而且还需要重新编译以及重启程序,这样工作效率就大大降低了。
在游戏中使用脚本,就正好能解决上述问题,小到一些计算公式,大到游戏的控制流程都可以通过脚本完成,而且目前的脚本系统大多是解释执行的,因此都可以支持运行时动态修改,这样一来可以立即看到修改结果,非常方便。
如何使用脚本
在游戏中使用脚本主要有两种方式。一种方式是主程序使用一门高级语言,比如C++进行编写,然后对其嵌入一个脚本解释器,在运行时动态执行一些脚本函数;另一种方式则是整个程序全部使用脚本编写,例如一些泥巴游戏就是直接用LPC脚本编写的。
本文主要研究嵌入式脚本使用方法,因为目前大部分的脚本都不能提供如VC++那样方便的调试环境,如果程序全部用脚本编写,当脚本多达几万行甚至十几万行的时候,调试会成为一件非常痛苦的事。而且嵌入式使用时可以将一些非常耗时的代码用C++编写,以保持较好的运行效率。
程序从C++的main( )函数开始启动,然后进入主循环,在一些C++函数中会直接调用脚本函数,在脚本函数的运行过程中,又可能调用C++的扩展函数。C++扩展函数的主要功能有两个:一是用来增加脚本无法直接编写的功能,二是用来替换脚本中运行速度过慢的函数。
上述过程的关键点就在于C++和脚本如何相互调用函数,以及如何传递参数与结果。一般的解决方法是在程序启动时利用脚本的API向脚本注册C++的扩展函数,将函数指针传递给脚本系统以便将来调用,调用脚本函数则使用脚本系统的API将调用参数压进栈,取得运行结果也要通过API进行。
Python 脚本简介
目前有许多第三方脚本语言可供直接使用,例如Tcl、Lua等等,本文要介绍的是Python脚本。Python已经有超过十年的历史,是一种解释性的、面向对象的脚本语言。Python的解释器在大部分的操作系统上都可以运行,如Windows、Linux、Solaris、Mac 等。
1. 安装与配置
Python的主页在http://www.python.org,目前最新版是2.3.2,本文采用2.2.2,你可以在其主页上下载安装包http://www.python.org/ftp/python/2.2.2/Python-2.2.2.exe。运行安装程序后,它会将Python解释器、文档、扩展模块等安装到你的计算机上。
安装完成后在开始菜单中会有Python的图形化编辑器(IDLE,但目前版本不支持中文字符),Python的命令行解释器以及用户手册。
为了在C++程序中调用Python的API函数,需要将头文件与lib路径添加到VC++的搜索目录中,头文件路径是本地Python安装目录下的include目录,lib路径是本地Python安装目录下的libs目录。这里需要注意的是安装包只提供了release版本的lib与dll,如果需要调试运行,则必须自己下载Python的源代码以编译debug版本的lib与dll,源码可在这里下载http://www.python.org/ftp/python/2.2.2/Python-2.2.2.tgz
2. 语法简介
详细的语法说明请参考Python安装包自带的文档,这里我只介绍一些常用的关键字与注意事项。
Python没有C++中的 { 和 } ,它使用缩进来代替。变量不需要单独声明,但不能引用未经赋值的变量。
Python中引入了模块的概念,类似C++中Library的概念。模块可以包含函数、变量、类。一个脚本文件就是一个模块,模块在使用前需要导入。
Python中没有switch,使用if判断代替:
if ( num==1 ):
print "1"
elif ( num==2 ):
print "2"
else:
print "unknown"
while 是Python的一个循环语句。在while循环内可以使用continue跳到下个循环,使用break可以跳出整个循环:
cnt = 5
while ( cnt > 0 ):
print cnt
cnt -= 1
for 循环:
list = ["test1", "test2", "test3"]
for str in list:
print str
词典是Python的一种映射数据类型,它能从一个键值(key)映射到实际内容(value):
accounts = {'tom':'123456', 'mike':'654321'}
print accounts['tom']
print accounts['mike']
3.API 介绍
Python提供了大量的C API,C++与Python的交互都是通过这些API进行。下面介绍几个比较重要的API函数:
void Py_Initialize( )
在使用Python系统前,必须使用Py_Initialize对其进行初始化。它会载入Python的内建模块并添加系统路径到模块搜索路径中。这个函数没有返回值,检查系统是否初始化成功需要使用Py_IsInitialized。
int PyRun_SimpleString(char *command)
把输入的字符串作为Python代码直接运行,返回0表示成功,-1表示有错。大多时候错误都是因为字符串中有语法错误。
PyObject* Py_BuildValue(char *format, ...)
把C++的变量转换成一个Python对象。当需要从C++传递变量到Python时,就会使用这个函数。此函数有点类似C的printf,但格式不同。常用的格式有s表示字符串,i表示整型变量,f表示浮点数,O表示一个Python对象。
PyObject* PyObject_CallObject(PyObject*callable_object, PyObject *args)
调用一个callable_object指向的Python函数,args为调用参数。在使用此函数前可以用PyCallable_Check来检测callable_object是否为一个可被调用的Python对象。
PyObject* PyImport_Import(PyObject *name)
载入一个n a m e 指定的模块。可以先使用PyString_FromString将模块名转换为Python对象,再使用PyImport_Import载入。
void Py_Finalize()
关闭Python系统,一般在程序退出时调用此函数。


【小知识】
更多Python 简介
Python 使用一种优雅的程序设计语法,它非常接近自然语言,这使得它具有很好的可读性。
Python 是一种灵活的程序设计语言,程序易于运行。这使得它成为进行原型开发和特殊程序设计任务的理想化语言;用P y t h o n 做程序设计,你甚至可以不太考虑你的程序的可维护性很差。
Python 是支持类和多继承的面向对象程序设计。
Python 代码可以被打包为模板和包。
Python 支持异常处理追踪并能够列出比较清晰、详细的错误提示。
Python 包含了一些高级的程序设计特性,例如代码生成器和解释器。自动垃圾收集功能使你从内存管理的争战中解脱出来。
Python 庞大的标准库支持很多一般的程序设计任务,如与网络服务器连接,正则表达式,文件操作。
Python 的交互式模式使得调试小段的程序非常便捷;另外,处理大型程序时,它还具备一个捆绑式的开发环境—— IDLE。
Python 编译器很容易扩展,可以将C 或者C++ 编译后的模板作为新的模板加入到其中。
Python 编译器可以被嵌入到另外一个应用程序中以提供一个可编程的界面。
Python 可以在很多不同种类的计算机和操作系统上运行:比如Windows,Mac OS,OS/2,Unix,Linux 等。
Python 语言的编译器是开源项目,拥有版权但可以免费使用和免费发布,甚至可以应用在商业项目中。

在C++中使用python最简单的方式就是高级应用
在使用时要初始化python语言的解释器
Py_Initialize();
在使用完成时要中止python的语言解释器
Py_Finalize();
这种应用最简单的就是直接执行一断脚本
PyRun_SimpleString("import sys\n"
"print 100+200\n");
这就是最简单的应用了
如果想执行一段保存在文件中的脚本那就调用
int PyRun_SimpleFile( FILE* fp , const char* filename)
这种方式的调用是最简单的一种调用了。


函数调用终于可以返回值了前几天的BCB调用Python,没有直接在C++里面调用Python函数,只是简单的使用了PyRun_SimpleString()这个函数进行指定字符串的执行。这种调用,对于没有输出结果,或者是输出结果在文件之类时还是可以使用的,但是通常情况下,我们调用函数是需要返回一个结果给被调用者的。针对这种情况,使用解释字串方式可行性不大了(可以实现,使用输出流重定向,但是处理起来复杂),只能是调用函数,然后接受函数的返回值。

这种调用也是比较简单的(因为我只要求返回字串就可以了:)),首先使用PyImport_ImportModule初始化你要调用的模块(一般指文件名),然后使用PyObject_CallMethod调用你的Python函数,当然了,调用函数的参数是需要设置的。

参考代码:
-----------------------------------
AnsiString ScriptPath = ExtractFilePath(Application->ExeName)+"script";
AnsiString PyStr;
PyObject *pName, *pOs, *pArg, *pResult, *pCall;

Py_Initialize();
InitLogger();

pOs = PyImport_ImportModule("os.path");
PyObject_CallMethod(pOs, "join", "(s)", ScriptPath.c_str());

pCall = PyImport_ImportModule("BOMandXY");
pResult = PyObject_CallMethod(pCall, "ReadBOM", "(s)", FileName.c_str());
ShowMessage(PyString_AsString(pResult));

Py_Finalize();

分享到:
评论

相关推荐

    Python脚本语言编译器

    总的来说,Python脚本语言编译器是学习Python编程的基石,它不仅涉及到语言的编译过程,还包括了Python的语法、数据结构、函数、面向对象编程等核心概念。通过深入研究,初学者不仅可以编写出有效的Python代码,还能...

    python脚本语言例子

    这是本人在房地局项目中写的python脚本语言代码,其中包括遍历的方法等等,需要的朋友可以下下来看看奥

    基于PyCharm 使用python脚本语言开发一款Serial2MQTT工具

    在PyCharm集成开发环境中,利用Python脚本语言开发一款Serial2MQTT的工具。这款工具的核心功能是连接MQTT broker,以此作为中介,巧妙地实现了串口设备与MQTT客户端之间的数据自由流通。借助这一桥梁,Serial2MQTT...

    Python脚本语言基础学习

    "Python脚本语言基础学习"这个主题涵盖了Python编程的一些核心概念,通过一系列实例来帮助初学者理解和掌握。 首先,`2 字符串和数字.py`文件可能会介绍Python中的基本数据类型,包括字符串(str)和数字(int、...

    Python脚本语言

    【Python脚本语言】是广泛应用于ARCGIS开发的初学者友好型编程语言。Python以其简洁易读的语法和强大的库支持,成为了地理信息系统(GIS)领域的首选脚本工具。 【前言】 Python作为一门高级编程语言,以其丰富的库...

    python 脚本语言的简单例子

    在解决arcgis数据问题时,用到的python脚本处理方法,这是一个简单的例子,发给大家共享下,有需要的再联系我奥。

    trnsystor:TRNSYS的python脚本语言

    TRNSYS的python脚本语言。 在面向对象的python结构中从stratch创建.dck文件。 添加组件,指定参数,将组件连接在一起以及更多的python代码。 安装 pip install trnsystor 用法 从TRNSYS 18开始,类型形式可以导出...

    文卷调查python语言脚本

    文卷调查python语言脚本文卷调查python语言脚本文卷调查python语言脚本文卷调查python语言脚本文卷调查python语言脚本文卷调查python语言脚本文卷调查python语言脚本文卷调查python语言脚本文卷调查python语言脚本文...

    0-SecureCRT运行Python脚本.pdf

    本文主要介绍了SecureCRT这款软件如何运行Python脚本来测试IoT-WiFi模块,涉及的主题包括SecureCRT的基本使用、Python脚本的执行、以及SecureCRT中实现的Python脚本的常用方法。 首先,文章的前言部分提到,对于...

    面向Arcgis的python脚本编程

    本文将深入探讨面向ArcGIS的Python脚本编程,涉及的主要知识点包括Python基础、arcpy模块、ArcGIS API使用以及实际应用示例。 1. Python基础:Python是用于编写脚本的首选语言之一,其简洁明了的语法和丰富的库支持...

    C++调用PYthon脚本(例程)

    本资源“C++调用Python脚本(例程)”提供了一个完整的工程实例,演示了如何在C++程序中动态地调用Python脚本,使得C++能够利用Python的灵活性和便利性。 在C++中调用Python脚本主要有两种方法:一种是通过Python的...

    基于Python脚本的智能家居自动化测试脚本设计及实现.pdf

    本文所讨论的即是基于Python脚本语言设计并实现智能家居自动化测试平台的过程和方法。 首先,文章对智能家居自动化测试平台的测试原理进行了阐述。智能家居系统通常采用三层结构模型,其中包括应用层和传感层。应用...

    ArcGIS_Python脚本开发

    该培训详细介绍了Python脚本语言的基础,ArcPy——ArcGIS的Python应用程序接口(API),以及如何利用Python开发并应用地理处理工具(GP工具),包括批处理脚本的编写、新建ArcGIS脚本工具以及通过GP服务在线调用等...

    金蝶云星空、金蝶云苍穹调试python脚本环境搭建IronPython

    关于标签,"python"代表了我们讨论的是Python编程语言,"金蝶云"强调了应用场景,而"调试"则说明了主题的核心——如何在金蝶云环境中对Python脚本进行问题排查和性能优化。 在压缩包文件名称列表中,"IronPytho

    Python游戏脚本语言(精讲)

    Python游戏脚本语言精讲 Python 是一种优秀的游戏脚本语言,因其强大、易于嵌入、可与 C/C++ 代码无缝集成、拥有多种高级特性且可用于自动化生产过程。游戏开发中,使用脚本语言可以快速开发游戏行为,而不需要陷入...

    京东抢茅台Python脚本

    【京东抢茅台Python脚本】是一个利用Python编程语言编写的自动化工具,主要用于在京东平台上自动参与茅台酒的抢购活动。这个脚本的目的是通过自动化的方式提高抢购成功率,节省用户手动操作的时间,并且根据描述,它...

    C++调用Python脚本

    在IT领域,有时候我们需要在不同的编程语言之间进行交互,例如在C++中调用Python脚本,以便利用Python丰富的库和便利性。本篇将详细解释如何在C++环境中使用Qt框架来调用Python脚本,并提供一些关键知识点。 首先,...

    Python脚本使用详解.doc

    **Python脚本使用详解** **一、Python语言基础** Python是一种高级编程语言,以其简洁、易读的语法而闻名,适合初学者入门。在Python语言基础部分,我们首先要了解以下几个关键概念: 1. **数学运算符**:Python...

    面向Arcgis的python脚本编程_李明巨编著_Arcgispython李明巨_python_

    《面向ArcGIS的Python脚本编程》一书由李明巨编著,是关于使用Python进行GIS(地理信息系统)开发的教程。这本书深入探讨了如何利用Python语言与Esri公司的ArcGIS平台进行交互,实现地图数据处理、空间分析以及自动...

    个人编写python脚本

    在"个人编写python脚本"这个主题下,我们可以深入探讨Python脚本的编写过程、常用库和工具,以及如何利用Python进行实际问题的解决。 首先,Python脚本的基本结构包括注释、变量定义、函数和类的声明。注释用于解释...

Global site tag (gtag.js) - Google Analytics