一个Pygame的Hello World示例程序

news2024/11/19 23:18:17

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

import sys
import pygame

def 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.coloradmin.cn/o/1371171.html

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

相关文章

Python解析参数的三种方法

今天我们分享的主要目的就是通过在 Python 中使用命令行和配置文件来提高代码的效率 Let’s go! 我们以机器学习当中的调参过程来进行实践,有三种方式可供选择。第一个选项是使用 argparse,它是一个流行的 Python 模块,专门用于命令行解析&…

【UML】第16篇 活动图

目录 一、什么是活动图 二、应用场景: 三、绘图符号的说明: 四、语法: 五、例图 六、建模的流程 6.1 对业务流程建模时 6.2 对用例进行活动图建模时 一、什么是活动图 活动图(Activity Diagram)是UML中用于描…

python 基础 面向对象

类 class Student:name Nonegender Nonenationality Nonenative_place Noneage Nonedef say_hi(self):print(self.name)def dowork(self,work):print(f"{self.name} {work}") student1 Student() student1.name "xxx" student1.gender "男&qu…

2024年寒假即将来临 如何实现高质量亲子陪伴?

近日,各地陆续公布了寒假放假时间安排,孩子们期待着迎来一个休闲和轻松的假期。然而,对于许多家长来说,他们也意识到寒假不仅是一个放松的时间,更是一个增进亲子关系的宝贵机会,可以为孩子提供有意义的学习陪伴。 自“双减”政策落地后,学生的课业负担减轻许多,拥有了更多的空余…

机器学习顶会ICML 2024今日开放投稿,CCF A类,中稿率27.94%(附ICML23杰出论文+18篇高分论文)

ICML 2024今天开放投稿了!距离截稿还有24天,想冲ICML的同学速度! ICML 全称 International Conference on Machine Learning,由国际机器学习学会(IMLS)举办,与NIPS一同被认为是人工智能、机器学…

【深入理解 ByteBuf 之三 接口类拆解】1. ObjectPool 接口设计剖析

想了一下,我决定还是做更细化的拆解,也看了很多源码剖析的文章1,以及我之前也写过,一个令人难受的点就是通篇的代码解释,通篇没什么头绪,我看着没头绪,感觉写的也没什么头绪,就是在硬…

尺寸公差分析 -DTAS手机装配公差案例-国产-智能

小细节 大麻烦,公差仿真大改造 DTAS尺寸公差分析软件-国产-智能https://www.dtas-china.com/product.html 仿真要求说明:计算长边装配间隙G1-G6 步骤一:首先双面胶②放在一个工装中,外形定位,然后将后盖①放入到工…

elementui dialog 回车时却刷新整个页面

到处都是坑,这个坑填完另一个坑还在等你。。。坑坑相连,坑坑不同。。。 使用el-dialog弹出一个表单,当我无意间敲到回车键时,整个页面被刷新了,又是一脸的懵逼。。。 经过查找文档发现解决方案为上述截图标记。。。 e…

李家的张麻子:ETL工程师的数据库编程之旅,用ChatGPT打破常规!

数据库编程大赛:一条SQL计算扑克牌24点 12月27日,NineData和云数据库技术社区主办,华为云、火山引擎、开源中国、云和恩墨、TDengine、云猿生数据、DORIS、ITPUB等协办单位和媒体,共同举办了本次《数据库编程大赛》。大赛题目「用…

基于SpringBoot的精品在线试题库系统(系统+数据库+文档)

🍅点赞收藏关注 → 私信领取本源代码、数据库🍅 本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目 希望你能有所收获,少走一些弯路。🍅关注我不迷路🍅一、绪论 1. 研究背景 现在大家…

PostgreSQL ZIP版安装完全手册

前言 ZIP免安装版下载地址:社区 DL 页面 (enterprisedb.com) 选择所需的版本下载即可。 安装 将下载的zip安装包(我这里下载的是postgresql-15.5-1-windows-x64-binaries.zip)解压至D盘根路径下,解压后路径:D:/pgsq…

vue+springboot+mybatis-plus实现乡村公共文化服务系统

项目前端:https://gitee.com/anxin-personal-project/rural-public-cultural-services-front 项目后端:https://gitee.com/anxin-personal-project/rural-public-cultural-services-behind 1.系统简介 乡村公共服务文化提供给管理员、商家、村民。管理…

k8s-存储 11

一、configmapu存储 首先,确保集群正常,节点都处于就绪状态 Configmap用于保存配置数据,以键值对形式存储。configMap资源提供了向 Pod 注入配置数据的方法,旨在让镜像和配置文件解耦,以便实现镜像的可移植性和可复用…

ASM磁盘管理:从初始化参数到自动化管理的全面解析

文章目录 一、引言二、ASM初始化参数三、ASM三大系统权限四、ASM实例的启停1.Oracle ASM的启停可以通过两种方式进行2.查看集群中的资源状态3.配置 ASM资源随着系统启动而启动4.配置数据库实例随着ASM启动而启动 五、数据库实例与ASM的交互六、 启动策略详解七、 ASM后台进程八…

汇聚数据库创新力量,打造千行万业数据基石

12月28日,以“汇聚数据库创新力量,打造千行万业数据基石”为主题的openGauss Summit 2023在北京举行。会上,openGauss社区理事会理事长胡正策发表《汇聚数据库创新力量,打造千行万业数据基石》主题演讲,他表示&#xf…

面相圆润是有福气的象征

在中国传统文化中,面相是一个非常重要的概念。相信大家肯定听说过“相由心生”这个成语吧,这就是告诉我们,一个人的面貌其实是可以反映出他内心的状态和气质,也可以反映其性格、健康状况和运势等。而一个圆润的面相,则…

代码混淆:保护您的应用程序

目录 引言 什么是代码混淆? 代码混淆常见手段 代码混淆的作用 代码混淆可能带来的问题 常用的混淆工具 如何使用ipaguard进行混淆 总结 引言 在当今数字化时代,移动应用程序已经成为人们生活和工作中不可或缺的一部分。但是,随着应用…

网络之路28:二层链路聚合

正文共:1666 字 14 图,预估阅读时间:2 分钟 目录 网络之路第一章:Windows系统中的网络 0、序言 1、Windows系统中的网络1.1、桌面中的网卡1.2、命令行中的网卡1.3、路由表1.4、家用路由器 网络之路第二章:认识企业设备…

Multimodal Segmentation of Medical Images with Heavily Missing Data

F是mapping function 吐槽 图3太简单了吧。作者未提供代码

C++实现简单贪吃蛇游戏

文章目录 1 开发历程2 开发思路3 使用介绍4 源文件代码5 游戏截图6 小结 1 开发历程 游戏使用C语言开发,是博主某个下午心血来潮的结果,后面又花了点时间加了计分,记录历史得分的功能。 2 开发思路 其实贪吃蛇主要难在蛇身的移动上&#x…