python 脚本引用目录-shell 引用另一个脚本
为什么在游戏中使用脚本
在一些早期的游戏中,大部分游戏逻辑都是直接写进游戏代码的,比如计算公式、游戏流程等。但随着游戏行业的不断发展,游戏开发本身也越来越复杂,游戏策划需要更多的时间来调整游戏,如果游戏逻辑还是写在代码里,那么游戏的每一次修改都必须通过程序进行,还需要重新编译重启程序, 所以工作效率大大降低。
在游戏中使用脚本正好可以解决上述问题,小到一些计算公式,大到游戏的控制过程可以通过脚本完成,而且目前大多数脚本系统都是解释和执行的,因此它们可以支持运行时的动态修改,从而可以立即看到修改结果, 这非常方便。
如何使用脚本
在游戏中使用脚本有两种主要方法。一种方法是用高级语言(如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 的主页在,最新版本是 2.3.2,本文使用 2.2.2,可以在其首页下载安装包。运行安装程序后,它将在您的计算机上安装 Python 解释器、文档、扩展等。
安装完成后,开始菜单中会有 Python 的图形编辑器(IDLE,但当前版本不支持汉字)、Python 命令行解释器和用户手册。
为了在C++程序中调用 Python 的 API 函数,需要在 VC++ 搜索目录中添加头文件和 lib 路径,头文件路径是本地 Python 安装目录下的包含目录,lib 路径是本地 Python 安装目录下的 libs 目录。这里需要注意的是,安装包只提供 lib 和 dll 的发布版本,如果需要调试运行,必须下载 Python 源码编译 lib 和 dll 的调试版本,源码可以在这里下载。
2. 语法概论
详细的语法说明请参考 Python 安装包自带的文档,这里我只介绍一些常用的关键字和注意事项。
Python 在C++中没有 { 和 },而是使用缩进。变量不需要单独声明,但它们不能引用未赋值的变量。
模块的概念是在Python中引入的,类似于C++中的库概念。模块可以包含函数、变量、类。脚本文件是一个模块,使用前需要导入模块。
Python 中没有开关,请使用 if 判断:
如果 ( 数字==1 ):
打印“1”
埃利夫 ( 数字==2 ):
打印“2”
还:
打印“未知”
而 是 Python 中的一个循环语句。您可以使用继续跳转到 while 循环内的下一个循环,并使用 break 跳出整个循环:
碳纳米 = 5
而 ( CNT > 0 ):
打印碳纳米管
碳纳米管 -= 1
对于循环:列表 = [“测试1”, “测试
2”, “测试3”]
对于列表中的 str:
打印 str
字典是 Python 中的映射数据类型,它从键映射到实际值:
帐户 = {'汤姆':'123456', '迈克':'654321'}
打印帐户['汤姆']
打印帐户[“迈克”]
3. 接口简介
蟒
提供了大量的 C API,C++通过这些 API 与 Python 进行交互。以下是一些更重要的 API 函数:
无效 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 的 printfpython 脚本引用目录,但格式不同。常用的格式是 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 指定的模块。在使用PyImport_Import加载之前,可以使用PyString_FromString将模块名称转换为 Python 对象。
无效 Py_Finalize()
关闭 Python 系统,一般在程序退出时调用此函数。
【花絮】
更多关于蟒蛇
Python使用优雅的编程语法,非常接近自然语言,这使得它非常可读。
Python是一种灵活的编程语言,程序易于运行。这使其成为原型设计和特殊编程任务的理想语言;使用P y t h o n进行编程,您甚至可以少考虑程序的可维护性差。
Python 是一种面向对象的编程,支持类和多重继承。
Python 代码可以打包为模板和包。
Python 支持异常处理跟踪,可以列出清晰详细的错误消息。
Python 包括高级编程功能,如代码生成器和解释器。自动垃圾回收将您从内存管理之战中解放出来。
Python 庞大的标准库支持许多常规编程任务,例如与 Web 服务器连接、正则表达式和文件操作。
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”
“打印 100+200/N”);
这是最简单的应用程序
如果要执行保存在文件中的脚本,请调用
int PyRun_SimpleFile( FILE* fp , const char* 文件名)
这是最简单的调用。
函数调用终于可以返回几天前 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();
初始化记录器();
pOs = PyImport_ImportModule(“os.path”);
PyObject_CallMethod(pO, “join”, “(s)”, ScriptPath.c_str());
pCall = PyImport_ImportModule(“BOMandXY”);
pResult = PyObject_CallMethod(pCall, “ReadBOM”, “(s)”, FileName.c_str());
ShowMessage(PyString_AsString(pResult));
Py_Finalize();