基于Python的事件精灵组的特点及技术运用研究
2022-04-25杨玄烨
杨玄烨
(重庆城市科技学院,重庆 402160)
0 引言
计算机是现代社会人们生活与工作中不可缺少的重要一部分,在对计算机软件进行使用时,依照不同的需求,产生不同的高级汇编语言,在各种语言的应用中,开发与设计各种软件是工作人员最主要的工作任务[1]。Python是具有跨平台性质的计算机程序设计语言,它的脚本程序设计语言及内置代码库对多种属性都有集成,由于其在持续不断地更新和加入语言新功能,现已广泛应用于图形处理、数学处理、文本处理、数据库编程、网络编程、多媒体应用等场合[2]。面向对象是其最经典的特征属性。Python支持面向对象、命令式和函数式的编程方式,能够进行内存管理,在某些应用中,其开发效率能够比用C语言开发提高十几倍[3]。Python语言在具有高效率的同时也完全面向对象,在面向对象的编程工程中具有相当高的效率,其内置语法简洁并支持动态输入,在应用程序开发中,可以具有优势性的高效处理应对多种模式的字节流,实现较快的开发速度,因而也使其被广泛运用[4]。Python语言在各种编程以及许多操作系统平台中均被作为脚本语言,用于精简应用程序以实现有效开发。本文所研究的是事件精灵组的特点及其技术运用。
1 pygame、精灵组的基本概念
1.1 精灵组
在游戏的制作开发中,通常把显示图像的对象叫作精灵。它包含图像加载、位置变化、绘制图像,这原本需要程序员编写代码进行控制的Sprite精灵需要有两个重要的属性:image(要显示的图像)、rect(图像要显示在屏幕的位置)。精灵默认的update方法,在子类可以重写此方法,它可以在每次刷新屏幕时,更新精灵位置,而精灵组则是多个事件精灵的集合。精灵组对象update方法的调用可以自动对组内每一个精灵的update方法进行调用,除此之外,调用精灵组对象的draw屏幕对象方法可以将组内每一个精灵的image绘制在rect位置。
1.2 Pygame库
Pygame(www.pygame.org)是Python平台下的一款著名的2D游戏开发专用库,该开发库构建在著名的跨平台游戏开发库SDL(simple direct media)之上,其中提供了全面的游戏开发支持模块,从而可以使游戏开发的难度大为降低[5]。它的集成包括joystick、camera、event、gfxdraw等功能模块,它作为基于Python平台而设计出的一款优秀的代码集成库,值得称道的是它的应用不仅适于单一平台,为了应对平台多元化的需求,Pygame库还加入了跨平台的元素。因此,基于Pygame库所开发的游戏可以兼容现存市面上各大主流的操作平台。因它的开发者在开发中注重人机交互的效率,所以它的诞生使得Python使用者对于2D游戏开发的效率和运维更高效,开发者可以便利地、自由地选取库内已经集成的子模块,其只需把目光投入游戏的核心模块,将琐碎的边枝问题通过子模块的调用来解决,这使得开发的质量和速度有了大大的提升。它可以绘制图形,与游戏杆、游戏手柄、追踪球进行交互、处理事件与事件、访问音频采样数据等,而对于精灵组的应用,Python专用库Pygame提供了两个类pygame.sprite.Sprite,用于存储图像数据image和位置rect的对象,而pygame.sprite.Group则是一个组类方法,助益精灵的队列的出列和入列的效率。
2 Python的精灵组特点及技术运用设计
2.1 精灵组的特点
2.1.1 精灵组的功能模块
精灵组是多个精灵的集成,如图1,在Pygame库中有许多便于开发者开发的源代码模块,精灵组的使用需要通过各个固有方法的使用来进行文档信息的传递:add方法可以向组中增加精灵,在精灵生成之后需要通过add方法传入游戏主循环之中;sprites方法可以返回所有精灵列表,这是一个后端操作,它的使用可以便于后端系统读取精灵和操作信息。同时在游戏设计中精灵的设置需预置image和rect属性,通过对于image和rect属性的传入生成相关的精灵,在每个精灵生成后都需要派生精灵子类,image属性可以记录图像数据,rect属性可以记录英雄在屏幕上的位置,精灵组的draw方法可以将组中所有精灵的image,绘制到Surface的rect位置,形成屏幕的动态画像,而update方法可用于对精灵位置的更新,kill方法可以将精灵从所有组删除,即代表精灵的死亡(图2)。精灵组通过各功能模块的调用和数据传递呈现连续的图像变化,这是一个密不可分的系统整体。
图1 精灵组的功能模块及位置
图2 精灵组的功能位置
2.1.2 精灵组的位置
在一个游戏运行过程中,本质上分为游戏初始化和游戏循环,从游戏初始化开始,需要精灵组和精灵在系统内部的自我创建,在其创建之后,精灵组会对游戏的开始界面等设置进行预加载,越大的游戏所需要生成创建的精灵越多,同时对文档读取需求越多,因此需要的时间就越长,为此游戏厂商为了对加载时间进行可视化表达,通常会在屏幕设置一个加载进度条以统计加载时间。
游戏循环:update、draw、pygame.display.update的交替循环,它会对于上一模块所传递的数据流在后台进行新图像的更新、绘写,同时删除旧的图像,毁灭失效的精灵,将新生成的精灵更新到显示设备上。经研究表明,人体所能接受的极限帧率一般为12帧每秒,因此决定了图像的刷新速度的帧率远远大于人体视觉的极限帧率,这样才可以将动态图像反馈至我们视觉。通过这个框架可以形成UI游戏,开发出2D游戏。
2.1.3 精灵组的运用分析
对于精灵组的设计需要构建一个完整的游戏,精灵组本质上是对数据的后端处理,它需要有数据的传入和输出,而对于数据文档的传递是游戏运行的核心。如图3所示,在游戏初始化阶段需要先后构建GUI游戏窗体,再自动调用事先预置Pygame库游戏时钟模块,对游戏运行时间计时。然后是创建精灵、精灵组,用随机函数生成各个精灵组,由于现代计算机CPU强大的计算能力,这些行为的加载,需要的时间几乎可以忽略不计。预加载完毕后,进入游戏的主循环,先是通过读取内部代码预置的刷新率或者是读取文档的相关信息,自我设置刷新帧率,因为对于游戏界面的更新要求具有超视觉速度,所以FPS最低要求大于12帧每秒,然后是建立事件监听模块进行人机交互,具体表现为通过读取系统键盘操作数据,并加与处理以及各个精灵组的生成与死亡,使数据被接受后会继续传入下一个模块。
图3 精灵组的设计
碰撞检测模块将会对用户的操作产生一个碰撞评估,根据评估判断结果,精灵组会进行相应的图像处理和更新,形成各个事件,使之以可视化的形式与用户进行交互,即更新屏幕显示,并且这个过程是持续的、高速的,用户通过对屏幕图像信息的读取在大脑中产生事件认知。
3 实验的设计方法
现今,主流的设计方式具有两种,分别是结构化设计和面向对象化的设计。结构化方法着眼于功能,强调中心模块化,推出模块化、自顶向下、逐步求精的高效设计过程,系统是实现集成化模块功能的函数以及过程,体现出结构清晰、可读性好的特点。面向对象方法则以对象的数据为基础和中心,制定系统框架,因此对于类中的数据,稳定性得到大大提升,对实际物体模型的建立更加全面、深入。在对本实验方式的选择上我选择了更优秀的面向对象化的方式。
3.1 结构化设计
(1)设计思维:结构化编程比较难于封装,复用性上也不如面向对象编程,缺乏扩展性,在进行程序设计的时候只将系统着眼于现有业务功能的实现,没有考虑系统将来的业务变化情况,除此之外,它灵活性差、违反职能均衡原则。
(2)封装性:因为其采用结构化程序分析设计程序时,没有对软件系统的设计和实现进行合理的分工,需要将客观世界模型分解一个一个功能,每个功能按照顺序用以完成一定的数据处理,因此结构化编程封装难度较大。对于私有的方法,较难控制,敏感信息就比较难隐藏。
(3)复用性:在传统的结构化程序设计中,开发应用程序是依据过程的,数据的工程代码与操作代码具有独立性、代码特异性,难以重用,因此在代码量过大时,具有维护数据和代码一致性的困难。
3.2 面向对象化设计
(1)设计思维:从计算机程序工作原理来看,“输入—运算—输出”。面向对象在分析问题时,不同于传统的面向对象过程,它有着自己独特的特点:以对象为单位,考虑它的属性及方法,在分析问题时,面向过程是需要以一个具体的流程(事务过程)为单位,在开发中考虑它的实现。
(2)封装性:面向对象编程的封装,也就是把客观事物进行抽象类封装,使用时可以实列化为多个对象,并且类可以使用protecte、private、public来定义内部数据的属性,protected让可信的类或者对象对数据发出访问,不可信操作无法访问,隐藏内部信息。
(3)复用性:面向对象化设计所拥有的继承性及封装性思想形成重用方法,对程序的容错率有了极大的提升,提高程序运行的效率。
4 结语
综上所述,它已经广泛应用于实际编程工作中,一方面很好地提高了人们生活、工作以及学习的便捷性,另一方面也有效促进了我国社会信息化建设水平的不断提升。从整体看,Python最为突出的特点就是简洁、类库,将其应用到平台开发中可以突显出极大的优势,因此对Python的进一步研究应用势在必行。Python语言的在AI、自动化,程序设计等各方面领域的优势,亦将在元宇宙得到新应用和新扩展,对于基于Python的多元化开发与设计,在未来拥有广阔的前景。