pygame游戏编程库:初始化和显示(01/8)

news2024/11/27 12:58:50

一、说明

        pygame是一个Python库,用于编写2D游戏和多媒体应用程序。它提供了一整套工具,可以帮助开发者创建图像、声音、动画等内容,并与用户进行交互。pygame还可以用于创建交互式教育软件、演示文稿、音乐应用程序等。它基于SDL库(Simple DirectMedia Layer),能够在多个平台上运行,包括Windows、MacOS、Linux和Android等操作系统。

二、Pygame常用模块

模块名功能
pygame.cdrom访问光驱
pygame.cursors加载光标
pygame.display访问显示设备(对象)
pygame.draw绘制形状、线和点
pygame.event管理事件
pygame.font使用字体
pygame.image加载和存储图片
pygame.joystick使用游戏手柄或者 类似的东西
pygame.key读取键盘按键
pygame.mixer声音
pygame.mouse鼠标
pygame.movie播放视频
pygame.music播放音频
pygame.overlay访问高级视频叠加
pygame就是我们在学的这个东西了……
pygame.rect管理矩形区域
pygame.sndarray操作声音数据
pygame.sprite操作移动图像
pygame.surface管理图像和屏幕
pygame.surfarray管理点阵图像数据
pygame.time管理时间和帧信息
pygame.transform缩放和移动图像
pygame.scrap本地剪贴板访问

三、第一个Pygame程序

        Pygame 作为一个入门级的游戏开发库,其实并不难学,只要掌握 Python 编程的相关知识就能很轻松地掌握它。

        Pygame 语法简单、明了,秉持了 Python 语言一贯的风格。同时,它作为一个游戏开发库来说,具有图形编程的基本特点,如果您对于图形编程从未了解过,即使您有 Python 编程基础,也会略感迷茫。因此,在接下来的学习中会详细介绍 Pygame 的常用模块,以及图形编程中的相关概念,帮助您快速掌握 Pygame 的使用。

        下面是一个简单的 Pygame 程序,如下所示:

  1. #导入所需的模块
  2. import sys
  3. import pygame
  4. # 使用pygame之前必须初始化
  5. pygame.init()
  6. # 设置主屏窗口
  7. screen = pygame.display.set_mode((400,400))
  8. # 设置窗口的标题,即游戏名称
  9. pygame.display.set_caption('hello world')
  10. # 引入字体类型
  11. f = pygame.font.Font('C:/Windows/Fonts/simhei.ttf',50)
  12. # 生成文本信息,第一个参数文本内容;第二个参数,字体是否平滑;
  13. # 第三个参数,RGB模式的字体颜色;第四个参数,RGB模式字体背景颜色;
  14. text = f.render("C语言中文网",True,(255,0,0),(0,0,0))
  15. #获得显示对象的rect区域坐标
  16. textRect =text.get_rect()
  17. # 设置显示对象居中
  18. textRect.center = (200,200)
  19. # 将准备好的文本信息,绘制到主屏幕 Screen 上。
  20. screen.blit(text,textRect)
  21. # 固定代码段,实现点击"X"号退出界面的功能,几乎所有的pygame都会使用该段代码
  22. while True:
  23. # 循环获取事件,监听事件状态
  24. for event in pygame.event.get():
  25. # 判断用户是否点了"X"关闭按钮,并执行if代码段
  26. if event.type == pygame.QUIT:
  27. #卸载所有模块
  28. pygame.quit()
  29. #终止程序,确保退出程序
  30. sys.exit()
  31. pygame.display.flip() #更新屏幕内容

运行结果如下所示:
 

pygame程序运行结果


图1:第一个 Pygame 程序
 

        如果您熟悉 Python 编程的基础知识,那么在注释的帮助下,应该能很容易地理解上述代码。假如不能也没有关系,因为接下来,我们会对上述代码进行细致的分析。常言道:“授人以鱼不如授人以渔”,分析代码的逻辑,有助于我们理解和编写 Pygame 程序,而至于代码中涉及的模块、方法等,会在后续内容做详细介绍。

3.1 初始化程序

        在使用 Pygame 编写程序前,要做的第一个步骤是“初始化程序”,代码如下所示:

pygame.init()

        这是整个程序中的第一句代码,它的作用是自动检测 Pygame 软件包是否正常可用,并检查电脑的硬件调用接口、基础功能是否存在问题,比如音频、光驱、声卡驱动等设备。同时,它会完成 Pygame 中所有模块的初始化操作,比如 display(显示模块)、font(字体模块)、mixer(声音控制模块)、cursors(光标控制模块)等。

由此可见,初始化程序的重要性,因此上述代码,在编写程序时候千万不能“漏掉”。

3.2 创建Surface对象

        想要掌握 Pygame 的编程逻辑,首先就要理解 surface 对象的概念,它是 Pygame 中最重要的组成部分。

        Surface 翻译为表面、表层、外观,在 Pygame 中,您可以把 surface 对象理解成一张“白纸”,通过这张纸可以做许多的事情,比如在纸上添加文字、填充颜色、添加图片以及绘制任意形状的图形等。既然是“纸”就有规格尺寸,Pygame 允许您创建任意大小的纸。

        那么我们应该如何创建 Surface 对象呢?Pygame 提供了多种创建 Surface 对象的方法,这里先介绍以下几种方法。

        上述示例,使用如下方式创建了一个 surface 对象:

  • #也叫screen对象,本质上是一个Surface,大小400*400
  • screen = pygame.display.set_mode((400,400))

        screen 的本质上就是一个 Surface 对象,它是游戏的主窗口,也就是整个游戏中尺寸最大的“纸”,任何其他的 Surface 对象都需要附着在这张最大的“纸”上,比如创建一个包含文本的 Surface 对象,通过以下方法将它绘制在主屏幕上:

  • #创建一个包含文字的Surface对象
  • text = f.render("C语言中文网",True,(255,0,0),(0,0,0))
  • #通过blit方法将其绘制在主屏幕上,这里的textRect表示位置坐标
  • screen.blit(text,textRect)

如果想创建一个包含图像的 surface 对象可以使用如下方法:

 
  • surface_image =pygame.image.load("图片路径")

3.3 事件监听

        游戏,在我们日常生活中经常接触到,无论是手游、还是电脑端游戏,已经成了信息社会中,不可或缺的一部分。

        游戏大致来讲是由动画和人机交互的体验两部分构成,其中动画则是由一系列连续静止的图片,经过一定频率的刷新构成的,这个频率被称为 FPS,如果频率值越大则画面越流畅;如果频率值越小则画面会出现卡顿的感,在游戏过程中一般人能接受的最低 FPS 约为 30Hz,如果想要画面流畅则 FPS 要大于 60 Hz。

        FPS 越高,细节越好,体验也越好,但是文件容量也越高

        动画保证了玩家的视觉体验,而人机交互则是操作上的体验。通过移动和点击鼠标、按下键盘上的技能键,或是滑动手机屏幕等操作来实现人机交互,这些与游戏程序交互的操作被称为事件(Event)。

        如果您接触过 JavaScript,那么您对于“事件”这一名词,一定不会陌生。

        Pygame 作为一个游戏开发库,同样具有设置和监听事件的功能。它提供了一个 enevt 事件模块,这个模块中包含了所有常用到游戏事件。下面是退出游戏的代码示例(其他事件类型,后续会做介绍):

  • # 循环获取事件,监听事件状态,使用get()获取事件
  • for event in pygame.event.get():
  • # 判断事件类型,用户是否点了"X"关闭按钮
  • # pygame.QUIT 指点击右上角窗口的"X"号
  • if event.type == pygame.QUIT:
  • #点击后,卸载所有pygame模块
  • pygame.quit()

3.4 游戏循环

        当打我们游戏时可能会触发游戏中的各种事件,比如鼠标事件、键盘按键事件、摄像拍照事件等等,因此游戏程序需要一直循环监听玩家的操作,只有当用户点击了游戏“关闭”按钮时,监听才会结束。如果想要达到“循环监听”目的,此时就需要设置一个游戏循环(Game Loop)也称为游戏的主循环,这样才能保证人机交互的体验感。代码示例如下:

  • #游戏主循环(游戏循环)
  • while True:
  • # 循环获取事件,监听事件
  • for event in pygame.event.get():
  • # 判断用户是否点了关闭按钮
  • if event.type == pygame.QUIT:
  • # 当用户关闭游戏窗口时执行以下操作
  • # 这里必须调用quit()方法,退出游戏
  • pygame.quit()
  • #终止系统
  • sys.exit()
  • #更新并绘制屏幕内容
  • pygame.display.flip()

游戏主循环是每个 Pygame 游戏程序中必不可少的一部分,它主要承担着以下三个重要任务:

  • 处理游戏事件
  • 更新游戏状态
  • 把更新后的游戏状态绘制到屏幕上

pygame程序


图2:主循环示意图


        游戏画面和游戏操作状态会因为动画效果和玩家的操作而改变,因此需要以循环的方式实时地更新主屏幕(screen)的显示内容。把下列代码放入游戏主循环中即可实现实时更新和绘制屏幕内容,如下所示:

  • #刷新界面显示
  • pygame.display.flip()

除了上述方法外,Pygame 还提供了另一个方法。如下所示:

 
  • pygame.display.update()

这两个方法的主要区别是:后者可以根据选定的区域来更新部分内容,而前者则是更新整个待显示的内容。如果后者没有提供区域位置参数时,其作用和 display.flip() 相同。

通过上述学习,我们对 Pygame 程序有了基本的认识。下面对 Pygame 模块中的方法、属性做更加细致的讲解。

关注公众号「站长严长生」,在手机上阅读所有教程,随时随地都能学习。内含一款搜索神器,免费下载全网书籍和视频。

四、Pygame Display显示模块详解

Pygame 使用pygame.display显示模块中的方法创建游戏的主窗口:

screen = pygame.display.set_mode(size=(),flags=0)

上述函数有两个参数常用参数:

  • size:元组参数,用来设置主窗口的大小
  • flags:功能标志位,表示创建的主窗口样式,比如创建全屏窗口、无边框窗口等,flags 参数值见下表。

标志位功能
pygame.FULLSCREEN创建一个全屏窗口。
pygame.HWSURFACE创建一个硬件加速窗口,必须和 FULLSCREEN 同时使用。
pygame.OPENGL创建一个 OPENGL 渲染窗口。
pygame.RESIZABLE创建一个可以改变大小的窗口。
pygame.DOUBLEBUF创建一个双缓冲区窗口,建议在 HWSURFACE 或者 OPENGL 时使用。
pygame.NOFRAME创建一个没有边框的窗口。


体验过电脑游戏的朋友们都知道,当运行程序后会在电脑桌面上出现一个游戏的主窗口,这个主窗口的本质是一个 surface 对象,把理解为画布、画板、白纸在合适不过了,它相当于一个载体,用于承载一切游戏所用到的元素。假如您需要将一段文本方放置到主窗口中,那么您需要先创建一个包含文本的 surface 对象,之后再将它附加到主窗口上。简单的理解,就是将一张图 A 粘贴到另一张图 B 上。

主窗口(screen)相当于游戏程序中尺寸最大的 Surface 对象,在这个最大的“画布”中,我们还可以添加其他“小”的 Surface 对象,这些对象以矩形的形式存在于主窗口中,它们共同组成了一个游戏程序。通过下列方法可以将一个 Surface 对象粘贴至主窗口上:

scrren.blit(source, dest, area=None, special_flags = 0)

下面对上述参数做简单的介绍:

  • source:表示要粘贴的 Surface 对象。
  • dest:主窗口中的一个标识的坐标位置,可以接受一个 (x,y) 元组,或者 (x,y,width,height) 元组,也可以是一个 Rect 对象;
  • area:接受一个 Rect 对象,默认为 None,如果提供该参数则相当于抠图操作,即在屏幕的指定区域显示想要的内容;
  • special_flags:可选参数,它是 Pygame.1.8 版本新增的功能,用于指定对应位置颜色的混合方式,参数值有 BLEND_RGBA_ADD、BLEND_SUB 等。如果不提供该参数的情况下,默认使用 source 的颜色覆盖 screen 的颜色。


除了创建游戏的主窗口之外,display 模块还提供了许多的和“显示”相关的方法,比如设置游戏窗口的名称,如下表所示

 
  1. import sys
  2. import pygame
  3. #使用pygame之前必须初始化
  4. pygame.init()
  5. #设置主屏窗口
  6. screen = pygame.display.set_mode((400,400))
  7. #填充主窗口的背景颜色,参数值RGB(颜色元组)
  8. screen.fill((156,156,156))
  9. #设置窗口标题
  10. pygame.display.set_caption('c语言中文网')
  11. # 如果没有下列主循环代码,运行结果会一闪而过
  12. while True:
  13.     # 循环获取事件,监听事件
  14.     for event in pygame.event.get():
  15.         # 判断用户是否点了关闭按钮
  16.         if event.type == pygame.QUIT:
  17.             #卸载所有模块
  18.             pygame.quit()
  19.             #终止程序
  20.             sys.exit()
  21. #更新屏幕内容
  22.     pygame.display.flip()

程序的运行结果如下所示:
 

pygame程序运行结果


图1:Pygame程序运行结果


pygame.display 模块还提供了一些和“显示”相关的其他方法,如下表所示:
 

方法名称说明
pygame.display.get_surface()获取当前显示的 Surface 对象。
pygame.display.flip()更新整个待显示的 Surface 对象到屏幕上。
pygame.display.update()更新部分软件界面显示。
pygame.display.Info()产生一个 VideoInfo 对象,包含了显示界面的相关信息。
pygame.display.set_icon()设置左上角的游戏图标,图标尺寸大小为 32*32。
pygame.display.iconify()将显示的主窗口即 Surface 对象最小化,或者隐藏。
pygame.display.get_active()当前显示界面显示在屏幕上时返回 True,如果窗口被隐藏和最小化则返回 False。

(未完待续)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1170312.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

线程锁、进程锁、分布式锁_Linux网络编程

线程锁 1、互斥锁:互斥锁首先是一个睡眠锁,如下图当线程C没有获取到资源时,线程锁会结束线程B切换到线程C。 2、自旋锁:而自旋锁在未获取到资源时线程C循环等待,尝试获取锁,一直占用核心。 3、读写锁:若一…

css基础之实现轮播图

原理介绍 图片轮播的原理是通过控制显示和隐藏不同的图片来实现图像的切换,从而创建连续播放的效果。用到的知识点有定位和定时器。 实现步骤: HTML 结构: 首先,需要在HTML中创建一个包含轮播图片的容器,通常使用 &l…

采用springboot、avue框架开发的:大型医院绩效考核系统成品源码

医院绩效考核系统全套源码(演示自主版权医院应用案例) 医院绩效考核系统,建立以医院发展目标为导向,以医务人员劳动价值、工作量为评价基础,统筹效率、质量、成本的绩效管理和绩效工资分配体系。系统支持RBRVS&#xf…

0003Java安卓程序设计-springboot基于Android的学习生活交流APP

文章目录 **摘** **要**目 录系统设计开发环境 编程技术交流、源码分享、模板分享、网课教程 🐧裙:776871563 摘 要 网络的广泛应用给生活带来了十分的便利。所以把学习生活交流管理与现在网络相结合,利用java技术建设学习生活交流APP&…

python机器学习——实现Kmeans算法

K-means算法 关于K-means算法,它是一种无监督学习算法,用于将数据集分成预定数量的簇(clusters)。 K-means算法比较适合用来做聚类分析,而不是用来预测,换句话来说,K-means算法不擅长预测 K-…

基于SSM的搬家预约系统

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

数据结构之堆的实现(图解➕源代码)

一、堆的定义 首先明确堆是一种特殊的完全二叉树,分为大根堆和小根堆,接下来我们就分别介绍一下这两种不同的堆。 1.1 大根堆(简称:大堆) 在大堆里面:父节点的值 ≥ 孩子节点的值 我们的兄弟节点没有限制&…

“利用Lazada API揭秘电商数据:一键获取海量商品评论列表!“

要使用Lazada API获取Lazada商品评论列表,您需要先注册Lazada开发者账号并获取授权码和密钥。然后,通过调用Lazada API的item_comments接口,传入商品ID和国家域名后缀,即可获取到商品的评论列表。 以下是使用Lazada API获取Lazad…

4+1视图的理解和使用

软件架构 原文: Architectural Blueprints—The “41” View Model of Software Architecture 老外的原文还是很值得一看的,互联网上的很多文章理解得都比较粗浅 什么是软件架构?面试的时候很多面试官可能会问你最近在做的项目的架构。其实这…

uniapp原生插件之安卓TCP原生插件

插件介绍 安卓TCP插件支持自定义心跳数据,自定义心跳时间,断开连接时返回自定义数据等 插件地址 安卓TCP原生插件 - DCloud 插件市场 超级福利 uniapp 插件购买超级福利 详细使用文档 uniapp 安卓TCP原生插件使用文档 用法 在需要使用插件…

Nginx反向代理(入门)

前言 反向代理 --> 服务器 Nginx反向代理是一种服务器架构模式,通过将客户端的请求转发给后端服务器来分担服务器的负载压力,同时提高了系统的可用性和灵活性。它是一种常用的应用程序负载均衡技术,通常被用来处理大量同时连接的Web请求…

【GEE】2、探索数据集

1简介 在本单元中,我们将讨论以下概念: Google 地球引擎中可用的潜在数据来源。 通过生态示例显示的数据集采样用例。 如何使用 Google 地球引擎访问重要的元数据。 2背景 要将遥感集成到您的研究和分析中,学习如何解析 Google 地球引擎上…

【Linux编译器】:gcc/g++的使用

朋友们、伙计们,我们又见面了,本期来给大家解读一下有关Linux编译器gcc/g的使用,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:从入门到精…

“01”滴答“摩尔斯电码”加密解密单个字符

“01”替换滴嗒“.-”“摩尔斯电码”字符,加密解密键盘输入的单个字符。 (本笔记适合熟悉循环和列表的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《 python 完全自学教程》&a…

Windows 时间服务配置和配置工具

文章目录 Windows 时间服务保留Portw32tm 命令配置 Windows 时间服务配置客户端使用两个时间服务器配置客户端自动从域源同步时间检查客户端时间配置使用本地组策略编辑器配置Windows 时间注册表参考推荐阅读 Windows 时间服务 (W32Time) 为 Active Directory 域服务 (AD DS) 管…

【ReentrantLock源码分析】非公平锁的加锁和解锁

一、AbstractQueuedSynchronized 的三个核心成员变量 阐述一下 AQS 中的三个核心成员变量,后面源码分析流程的时候很多地方有。 state:表示锁的状态,0表示锁未被锁定,大于0的话表示重入锁的次数。state 成员变量被 volatile 修饰…

消息投递:如何保证消息不丢失?

目录 前言 一、消息为什么会丢失? 二、在消息生产的过程中丢失消息 三、在消息队列中丢失消息 四、在消费的过程中存在消息丢失的可能 前言 在电商系统中,我们经常有这样的场景,在用户下单购买完商品后,需要给用户发送红包来…

互联网医院|湖南互联网医院|智慧医疗改善就医服务

互联网医院系统,是指利用互联网技术和远程医疗技术,提供在线就诊、咨询、诊断和治疗等医疗服务的一种医疗模式。互联网医院系统实际上与医院的HIS系统很相似,是侧重服务于线上问诊的专业HIS,包含传统HIS的基本模块,如挂…

【数据结构】— —查找(折半查找,二叉排序树)

🎃个人专栏: 🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客 🐳Java基础:Java基础_IT闫的博客-CSDN博客 🐋c语言:c语言_IT闫的博客-CSDN博客 🐟MySQL&#xff1a…

数据结构-二叉树·堆(顺序结构的实现)

🎉个人名片: 🐼作者简介:一名乐于分享在学习道路上收获的大二在校生 🐻‍❄个人主页🎉:GOTXX 🐼个人WeChat:ILXOXVJE🐼本文由GOTXX原创,首发CSDN&…