Python脚本解决在游戏开发中的困难

新客网 XKER.COM 时间:2010-03-11  点击: 次

Python脚本是一种广泛应用于玩游戏开发的通信语言,在实际应用的过程中还是有不少的问题困扰着开发人员,下面是Python脚本在实际应用中的具体问题解决方案。希望读完下面的文章对其有所帮助。

在早期的一些游戏中,大部分的游戏逻辑都直接写入游戏代码,例如计算公式、游戏流程等。但随着游戏产业的不断发展,游戏开发本身也变得越来越复杂,游戏企划需要更多的时间来对游戏进行调整,如果游戏逻辑还写在代码中,则企划对游戏的每次修改都要通过程序进行,而且还需要重新编译以及重启程序,这样工作效率就大大降低了。

在游戏中使用Python脚本,就正好能解决上述问题,小到一些计算公式,大到游戏的控制流程都可以通过Python脚本完成,而且目前的脚本系统大多是解释执行的,因此都可以支持运行时动态修改,这样一来可以立即看到修改结果,非常方便。

如何使用脚本

脚本主要有两种方式。一种方式是主程序使用一门高级语言,比如C++进行编写,然后对其嵌入一个脚本解释器,在运行时动态执行一些脚本函数;另一种方式则是整个程序全部使用脚本编写,例如一些泥巴游戏就是直接用LPC脚本编写的。

本文主要研究嵌入式Python脚本使用方法,因为目前大部分的脚本都不能提供如VC++那样方便的调试环境,如果程序全部用脚本编写,当脚本多达几万行甚至十几万行的时候,调试会成为一件非常痛苦的事。而且嵌入式使用时可以将一些非常耗时的代码用C++编写,以保持较好的运行效率。

序从C++的main( )函数开始启动,然后进入主循环,在一些C++函数中会直接调用脚本函数,在脚本函数的运行过程中,又可能调用C++的扩展函数。C++扩展函数的主要功能有两个:一是用来增加Python脚本无法直接编写的功能,二是用来替换脚本中运行速度过慢的函数。

上述过程的关键点就在于C++和脚本如何相互调用函数,以及如何传递参数与结果。一般的解决方法是在程序启动时利用脚本的API向脚本注册C++的扩展函数,将函数指针传递给脚本系统以便将来调用,调用脚本函数则使用脚本系统的API将调用参数压进栈,取得运行结果也要通过API进行。

Python 脚本简介

目前有许多第三方脚本语言可供直接使用,例如Tcl、Lua等等,本文要介绍的是Python脚本。Python已经有超过十年的历史,是一种解释性的、面向对象的脚本语言。Python的解释器在大部分的操作系统上都可以运行,如Windows、Linux、Solaris、Mac 等。

1. 安装与配置

安装完成后在开始菜单中会有Python的图形化编辑器(IDLE,但目前版本不支持中文字符),Python的命令行解释器以及用户手册

为了在C++程序中调用Python的API函数,需要将头文件与lib路径添加到VC++的搜索目录中,头文件路径是本地Python安装目录下的include目录,lib路径是本地Python安装目录下的libs目录。这里需要注意的是安装包只提供了release版本的lib与dll,如果需要调试运行,则必须自己下载Python的源代码以编译debug版本的lib与dll.

2. 语法简介

详细的语法说明请参考Python安装包自带的文档,这里我只介绍一些常用的关键字与注意事项。

Python脚本没有C++中的 { 和 } ,它使用缩进来代替。变量不需要单独声明,但不能引用未经赋值的变量。

Python脚本中引入了模块的概念,类似C++中Lipary的概念。模块可以包含函数、变量、类。一个脚本文件就是一个模块,模块在使用前需要导入。

Python中没有switch,使用if判断代替。

   
  1. if ( num==1 ):
  2. print "1"
  3. elif ( num==2 ):
  4. print "2"
  5. else:
  6. print "unknown

"while 是Python的一个循环语句。在while循环内可以使用continue跳到下个循环,使用peak可以跳出整个循环

   
  1. cnt = 5
  2. while ( cnt > 0 ):
  3. print cnt
  4. cnt -= 1
  5. for 循环:
  6. list = ["test1", "test2", "test3"]
  7. for str in list:
  8. print str

词典是Python脚本的一种映射数据类型,它能从一个键值(key)映射到实际内容(value):

   
  1. accounts = {'tom':'123456', 'mike':'654321'}
  2. print accounts['tom']
  3. print accounts['mike']

3.API 介绍

Pyhon脚本提供了大量的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脚本解决在游戏开发中的困难相关推荐

  1. 游戏开发- Python语言在游戏开发中的潜力

    PYTHON 是一种面向对象的通用高级编程语言,由 GUIDO VAN ROSSUM 于 1991 年开发.自发展以来,PYTHON 已成为世界上最流行的编程语言之一.它经常在流行度调查中排名靠前-- ...

  2. 机器学习将在游戏开发中的6种应用

    机器学习正在改变几乎每个行业,从农业中的作物规划到医疗保健中的癌症诊断.这些主题通常会得到更广泛的讨论,因为它们已经产生了切实的,对人类有益的影响.对于游戏行业而言,不幸的是,游戏开发中的机器学习仍处 ...

  3. [命令模式]在游戏开发中的应用

    设计模式中的每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心.这样,你就能一次又一次地使用该方案而不必做重复劳动. 一个设计模式,它的服务对象是高层模块,在设计模式中称为客 ...

  4. 游戏开发中的物理之运动角色(2D)

    游戏开发中的物理之运动角色(2D) 介绍 物理过程 场景设定 运动学特征 介绍 是的,这个名字听起来很奇怪."运动角色".那是什么?该名称的原因是,当物理引擎问世时,它们被称为&q ...

  5. 反射在游戏开发中的应用

    文/宋忆疆 上一期专栏, 我曾提到. N E T提供了一个特性叫做反射(Reflection),其实反射并不是.NET所独有的.在这一期专栏,我想和大家讨论一下反射这个特性,在游戏开发中的应用,以及发 ...

  6. Unity 3D - 游戏开发中的Lua

    Unity 3D - 游戏开发中的Lua : 本文作者:秦元培, 本文出处:http://blog.csdn.net/qinyuanpei/article/details/39826323 前言 : ...

  7. python读取日志统计ip_使用python脚本实现统计日志文件中的ip访问次数

    使用python脚本实现统计日志文件中的ip访问次数,注意此脚本只适用ip在每行开头的日志文件,需要的朋友可以参考下 适用的日志格式: 106.45.185.214 - - [06/Aug/2014: ...

  8. 手机游戏开发中如何选择适合的纹理格式

    手机游戏开发中如何选择适合的纹理格式 为毛要写这个 本来觉得像这样的问题,是无法归类的,因为不同的项目有不同的需求,但今天因为quick论坛中的一个技术疑问贴,钩起了我整理这篇文章的兴趣 http:/ ...

  9. Java ME游戏开发中,碰撞检测算法在Java?ME中的实现(

    2019独角兽企业重金招聘Python工程师标准>>> 在Java ME游戏开发中,碰撞检测算法在Java?ME中的实现(百搜技术) 在Java ME游戏开发中,经常需要进行碰撞检测 ...

最新文章

  1. asp vb 插入,更新,删除数据库操作。
  2. 为什么 Kubernetes 变得如此流行(2020版)
  3. 石墨烯区块链(2)核心功能
  4. Java黑皮书课后题第2章:2.11(人口统计)重写编程练习题1.11,提示用户输入年数,然后显示这个年数之后的人口值,将1.11中的提示用于这个程序
  5. GIS数据格式:Geodatabase
  6. 猜数字游戏python程序_python经典小程序:猜数字游戏
  7. 关于NFS服务器的原理总结和mount挂载
  8. qt 将int型数据显示在文本框_Qt编写Online judge爬虫
  9. 企业实战(Jenkins+GitLab+SonarQube)_01_Jenkins下载
  10. vba校对统计不同工作薄(2)
  11. LinuxKit for ARM64 - on packet.net
  12. COMSOL纳米光学仿真
  13. 如何在SendWS做到WhatsApp客服系统,WhatsApp云控客服系统有作用?为什么选择WhatsApp做海外营销推广?
  14. Failed to parse time specification
  15. Android静默拍照(无感知拍照)
  16. OpenCV - 分水岭算法图像分割(Python实现)
  17. 计算机中分页符号是什么,2013年职称计算机操Word2003精选知识点:分页符号
  18. 【原创】HSV和YCrCb色彩空间介绍
  19. centos 7.6 —— Nginx 配置网页防盗链FPM参数优化
  20. html+css静态页面还原 拼多多网页

热门文章

  1. CSS---复合选择器
  2. 【BZOJ1116】[POI2008]CLO【BFS】
  3. proto报错 --- panic: proto: file “proto/service.proto“ has a name conflict over DESC
  4. 向世界问好--用python写第一个属于自己的代码
  5. 如何让你的 JS 写得更漂亮
  6. 供应商管理解决方案实战指南:打造高效供应链
  7. gerrit配置教程
  8. 利用PHP从淘宝采集评论和成交数据
  9. NG-ZORRO中的image组件
  10. 码蹄集 - MT2011 · 硬币塔