一个Pygame的Hello World示例程序

创建一个标题为Hello World的窗口,窗口中间显示有Pygame的Logo的python代码

import sys
import pygamedef main():pygame.init()screen = pygame.display.set_mode((800, 400))pygame.display.set_caption("Hello World")logo = pygame.image.load("pygame.png")logo_rect = logo.get_rect()logo_rect.center = (400, 200)while True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()screen.fill((255, 255, 255))screen.blit(logo, logo_rect)pygame.display.update()if __name__ == "__main__":main()

首先,我们导入了sys和pygame这两个库。sys库用于在程序退出时使用exit()函数,而pygame库是我们使用的游戏开发库。

然后,我们定义了一个名为main()的函数作为程序的主要逻辑。在main()函数中,我们首先调用pygame.init()来初始化Pygame库的相关模块。

接下来,我们使用pygame.display.set_mode((800, 400))函数创建了一个尺寸为800×400像素的游戏窗口,并将返回的窗口对象赋值给screen变量。我们还使用pygame.display.set_caption("Hello World")设置了窗口的标题为"Hello World"。

然后,我们使用pygame.image.load("pygame.png")加载了一个名为"pygame.png"的Logo图片,并将返回的图片对象赋值给logo变量。我们使用logo.get_rect()获取了Logo图片所在的矩形区域,并将返回的矩形对象赋值给logo_rect变量。接着,我们使用logo_rect.center = (400, 200)将Logo图片所在的矩形移动到窗口的中心位置。

在进入游戏循环之前,我们使用while True创建了一个无限循环。在每次循环中,我们使用pygame.event.get()获取消息队列中的所有事件,并使用for循环对每个事件进行处理。在这里,我们判断如果事件类型是pygame.QUIT,即用户关闭了窗口,就调用pygame.quit()和sys.exit()来退出程序。

循环的其余部分用于屏幕的绘制。我们使用screen.fill((255, 255, 255))将屏幕填充为白色,然后使用screen.blit(logo, logo_rect)将Logo图片绘制在屏幕上,绘制的位置是logo_rect所定义的矩形的左上角位置。最后,我们使用pygame.display.update()函数来更新屏幕上的内容,使得所有的绘制操作都能显示在屏幕上。

通过以上代码,我们可以创建一个具有标题为"Hello World"的窗口,窗口中间显示着Pygame的Logo。循环将持续运行,直到用户关闭窗口。

第1~3行:首先引入相关的库,即sys和pygame,引入sys的目的是使用其中的exit()函数。下面分析main()函数中的代码。

第7行:该函数用来初始化Pygame中的所有相关模块,在执行其他操作前,必须调用该函数。

第9行:该函数是Pygame创建游戏窗口的核心函数,虽然其名字并不直观,但其功能确实如此。该函数创建了一个尺寸为800×400像素的游戏窗口,其参数为窗口尺寸,返回值为Surface对象,代表整个游戏窗口所在的显示区域。

第10行:设置窗口标题为Hello World。

第12行:加载pygame.png,即Logo所在的图片,其返回值Logo也是一个Surface对象。在Pygame中,所有与显示相关的区域(包括加载后的图片)都被表示为Surface对象,Surface对象是一块显示区域,也可以把它理解为一张画布。

第13行:调用Surface对象的get_rect()函数获取Logo所在的矩形区域,其返回值logo_rect的类型为Rect对象,其默认值为(0,0,width,height),即左上角坐标为(0,0)、宽和高与Logo图片相同的一个矩形区域。

注意:在Pygame程序中,坐标原点(0,0)位于窗口的左上角。

第14行:由于之前获得的logo_rect,即Logo图片所在的矩形位于(0,0,image_width,image_height),其左上角坐标为(0,0),因此现在需要把该矩形移动到窗口中间。前面解释了logo_rect其实是一个Rect对象,因此它具有许多属性。这里,我们直接把logo_rect的center属性赋值为(400,200)即可,现在Logo图片所在的矩形logo_rect就已经被移动到窗口中间了。

第16~20行:在所有必需要素都初始化完毕后,下面开始实现游戏循环。

熟悉GUI编程的读者想必对此并不陌生,因为几乎所有游戏程序都有类似的死循环,主要用来检测和处理用户输入、更新游戏状态、绘制屏幕等。

上述代码通过while True进入死循环,然后不断读取消息队列中的所有消息,并判断消息类型是否为pygame.QUIT,如果是,则调用pygame.quit()和sys.exit()结束程序。 当窗口关闭时,会收到此QUIT消息,此段代码将被执行。

由于本程序比较简单,因此只简单地设置一个QUIT消息,也可以添加相应代码在此处理其他类型的消息。游戏循环中的后面三行代码均是与屏幕绘制相关的。

第22行:该函数用来把屏幕窗口填充为白色,fill()函数的参数为待填充颜色的RGB值。

第23行:该函数用来把Logo surface绘制到screen surface上,绘制Logo的位置为logo_rect,即从logo_rect左上角的位置开始绘制Logo,其第一个参数代表source surface,第二个参数代表绘制source surface的位置。之所以把这个函数放在循环中调用,是因为在一般情况下source surface rect的位置是不断变化的,即屏幕上的物体是不断移动的,因此每次循环都需要重新绘制,以把其绘制在屏幕上的合适位置。

不过本程序比较简单,Logo图片时刻保持静止,因此并没有体现出这一点。

基于此,也可以理解把上面的fill()函数放入循环的原因是每次在因物体移动而重绘时,都需要把之前屏幕上的内容擦除,否则就会出现物体的“重影”现象。因此,每次在绘制物体前,都需要把屏幕填充为白色、Logo图片会被白色背景覆盖住。

第24行:该函数用来更新屏幕上的内容,使所有绘制到screen surface上的内容都显示在屏幕上。

注意:如果希望屏幕正确显示,则该函数是必需的,必须在每次循环的所有绘制操作完成后调用该函数,否则屏幕将一片漆黑,什么都不显示。而把该函数放在循环中调用执行的原因是屏幕上的内容是不断变化的,因此需要不断更新屏幕。

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SWM341系列之SWM34SRET6介绍

SWM341系列的介绍 本文介绍了华芯微特SWM341系列主要性能,和其系列之一的SWM34SRET6-50驱动4.3寸800*480 TFTLCD显示的例程应用。 SWM341系列性能 SWM341是一款基于ARM Cortex-M33的32位微控制器,片上包含精度为 1%以内的 20MHz/40MHz 时钟,最…

DataFrame详解

清洗相关的API 清洗相关的API: 1.去重API: dropDupilcates 2.删除缺失值API: dropna 3.替换缺失值API: fillna 去重API: dropDupilcates dropDuplicates(subset):删除重复数据 1.用来删除重复数据,如果没有指定参数subset,比对行中所有字段内容,如果全部相同,则认为是重复数据,…

uniapp 在ios中u-input password显示密码 不生效

u-input组件的password属性在uniapp上多端开发,在小程序,H5上都没有问题,在App端有效,就是在ios中无效 找到u-input文件 修改源码 将原本的:password"password || type password || undefined加上||false即可

KEAZ128中MSCAN的同步时钟初始化失败已解决

文章目录 运行环境:MSCAN初始化成功代码初始化流程图初始化失败分析初始化异常原因 运行环境: MSCAN初始化代码(采用24MHz总线时钟当时不行,于是直接采用了外部晶振时钟16MHz) MSCAN初始化成功代码 void CAN_Init(uint_8 mode,uint_8 open…

java开发中如何使用定时任务

定时任务概述: 任务调度: 是指系统为了自动完成特定任务,在约定的特定时刻执行任务的过程。有了任务调度,即可解放更多的人力,而是由系统自动去执行任务。 常用业务场景案例: 某电商系统需要在每天上午10点…

CHS_03.1.3.3+系统调用

CHS_03.1.3.3系统调用 系统调用什么是系统调用,有何作用?系统调用又和普通的库函数的调用又有一定的区别为什么系统调用是必须的系统调用 按功能分类 可以分为这样的一些系统调用系统调用过程 这个小节的全部内容 系统调用 相关的知识 我们会为大家介绍什…

vulhub中的Apache HTTPD 多后缀解析漏洞详解

Apache HTTPD 多后缀解析漏洞 1.查看python版本 这里python版本很重要,因为版本过低可能会导致后面的结果运行不成功 这里我就遇到了因为版本过低而执行不了docker-compose up -d的情况 查看python版本 cd /usr/bin ls -al python* 当版本过低时安装高版本的 …

STM32-04-STM32时钟树

STM32时钟树 什么是时钟? 时钟是具有周期性的脉冲信号,最常用的是占空比50%的方波。(时钟是单片机的脉搏,搞懂时钟走向及关系,对单片机使用至关重要)。 时钟树 时钟源 2个外部时钟源 高速外部振荡器(HSE…

简单几个步骤几行代码一步一步掌握NLP自然语言处理通过Transformers模型实现包括情感分析,垃圾邮件检测,语法纠错,文本推理等

简单几个步骤几行代码一步一步掌握NLP自然语言处理通过Transformers模型实现包括情感分析,垃圾邮件检测,语法纠错,文本推理等。 垃圾邮件是广告、欺诈或其他不相关信息的电子邮件,给我们的日常工作和生活带来了困扰。为了有效过滤和阻止垃圾邮件的到达,我们需要使用各种判断…

安卓(雷电)模拟器清除屏幕密码

1、设置磁盘可写 启动模拟器,然后在模拟器的设置界面,设置磁盘共享为可写入,重启模拟器,如下图: 2、找到模拟器目录 返回桌面,右键模拟器图标,打开文件所在目录,如下图&#xff1a…

Spring MVC组件及RequestMapping注解

springmvc组件 DispatcherServlet前端控制器 用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet 是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet 的存在降低了组件之间的耦合性。 Ha…

四、Java中SpringBoot组件集成接入【Knife4j接口文档(swagger增强)】

四、Java中SpringBoot组件集成接入【Knife4j接口文档(swagger增强)】 1.Knife4j介绍2.maven依赖3.配置类4.常用注解使用1.实体类及属性(ApiModel和ApiModelProperty)2.控制类及方法(Api、ApiOperation、ApiImplicitPar…