一个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.mzph.cn/news/610218.shtml

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

相关文章

2024 年 API 管理新趋势预测

本文译自:What Will Be the API Management Trends for 2024? 原文链接:What Will Be the API Management Trends for 2024? - The New Stack 原文作者:Kenn Hussey 预计到 2030 年末,API 管理 市场的规模将增长六倍&…

frp 通过自定义域名访问内网的 Web 服务 --来自官网

通过自定义域名访问内网的 Web 服务 通过简单配置 HTTP 类型的代理,您可以让用户通过自定义域名访问内网的 Web 服务。 HTTP 类型的代理非常适合将内网的 Web 服务通过自定义域名提供给外部用户。相比于 TCP 类型代理,HTTP 代理不仅可以复用端口&#…

压测clickhouse性能相关参数

背景:压测ck性能一直上不去,但是ck负载不大。尝试调整参数,验证是否有性能提升 1、background_common_pool_size Sets the number of threads performing background non-specialized operations like cleaning the filesystem etc. for ta…

为什么是设置512,1024之类的像素大小

选择 (512 \times 512)、(1024 \times 1024) 等像素大小的原因与计算机科学中的一些基本概念有关: 二进制和内存对齐:计算机系统基于二进制运作,因此处理二的幂次方的数值(如 (2^9 512), (2^{10} 1024) 等)时更为高效…

php 的判断语句

目录 1.if 2.else 3.elseif /else if 4.while 5.do-while 6.for 7.foreach 8.break 打断 9.contiun 继续 10.switch 1.if 判断语句为 true 则执行 if 里面的语句&#xff0c;否则不执行&#xff1b; <?php header("Content-Type: text/html; charsetutf-8&…

C++ Primer 第五版 中文版 阅读笔记 + 个人思考

C Primer 第五版 中文版 阅读笔记 个人思考 第 10 章 泛型算法10.1 概述练习10.1练习10.2 第 10 章 泛型算法 泛型的体现&#xff1a;容器类型&#xff08;包括内置数组&#xff09;&#xff0c;元素类型&#xff0c;元素操作方法。 顺序容器定义的操作&#xff1a;insert&a…

Web开发SpringBoot SpringMVC Spring的学习笔记(包含开发常用工具类)

开发框架学习笔记 一.Spring SpringMVC SpringBoot三者的联系SpringMVC工作原理 二.SpringBoot的学习框架学习 2.各个类之间的继承和实现关系3.理解面向对象的思想(其实这个想写在2中的)四.开发常用工具Lombok4.0说在前面(如何快速使用Lombok)4.1了解Lombok4.2Lombok的作用一:减…

搜索二维矩阵【二分】

Problem: 74. 搜索二维矩阵 文章目录 思路 & 解题方法复杂度二分两次二分一次 思路 & 解题方法 可以二分一次&#xff0c;也可以二分两次。 复杂度 时间复杂度: 添加时间复杂度, 示例&#xff1a; O ( l o g n l o g m ) O(logn logm) O(lognlogm) 空间复杂度: 添加…

Clion断点无效(LLDB调试器)

使用Clion时&#xff0c;配置的编译器是Visual Studio&#xff0c;当中的Debugger只有选择LLDB。 项目是CMAKE类型&#xff0c;这里启动调试会发现断点无法命中。 先检查项目的CMakeLists.txt&#xff0c;发现如下配置会影响&#xff1a; set(CMAKE_BUILD_TYPE Debug) set(CM…

云服务器搭建GitLab

经验总结&#xff1a; 1、配置需求&#xff1a;云服务器内存最低4G 2、内存4G的云服务器&#xff0c;在运行容器后&#xff0c;会遇到云服务器操作卡顿问题&#xff0c;这里有解决方案 转载&#xff1a;服务器搭建Gitlab卡顿解决办法-CSDN博客 3、云服务器的操作系统会影响…

R语言【stats】——as.formula():取已包含在其他对象中的公式的方法,额外保存属性

Package stats version 4.2.0 Description 泛型函数 formula 及其特定方法提供了一种提取包含在其他对象中的公式的方法。 as.formula 几乎相同&#xff0c;另外当对象已经继承了 “formula” 时&#xff0c;保留了属性。 Usage formula(x, ...) DF2formula(x, env parent.f…

第二证券:如何判断主力是在洗盘还是出货?

怎样判别主力是在洗盘仍是出货&#xff1f; 1、依据股票成交量判别 在洗盘时&#xff0c;个股的成交量与前几个生意相比较&#xff0c;呈现缩量的状况&#xff0c;而出货其成交量与前几个生意日相比较呈现放量的走势。 2、依据股票筹码分布判别 洗盘首要是将一些散户起浮筹…

使用 LLVM clang C/C++ 编译器编译 boost 基础框架类库

1、下载 boost 1.84 库的源代码放到待编译目录 2、解压并接入 boost 1.84 库源码的根目录 搜索默认的 clang 版本&#xff0c;WSL 2.0/Ubuntu 18.04 LTS 为 clang 6.x 执行命令&#xff1a; ./bootstrap.sh --with-toolsetclang ./b2 toolsetclang 另外一个方法比较麻烦需要…

20240109适配selinux让移远的4G模块EC20在Firefly的AIO-3399J开发板的Android11下跑通

20240109适配selinux让移远的4G模块EC20在Firefly的AIO-3399J开发板的Android11下跑通 2024/1/9 10:46 缘起&#xff1a;使用友善之臂的Android11可以让EC20上网&#xff0c;但是同样的修改步骤&#xff0c;Toybrick的Android11不能让EC20上网。 最后确认是selinux的问题&#…

ES6规范

一、简介 js由三部分组成&#xff1a;ESDOM&#xff08;文档对象模型&#xff09; BOM&#xff08;浏览器对象模型&#xff09; ES作为核心&#xff0c;是一套标准&#xff0c;规范了语言的组成部分&#xff1a;语法、类型、语句、关键字、保留字。定义了数据结构和语法&…

BlogPark测试报告

目录 一&#xff0c;项目背景 二&#xff0c;项目功能 三&#xff0c;测试计划 3.1 测试用例的设计 3.2 功能测试 1.正常登录 2.正常写博客测试 &#xff08;输入完整的标题和内容&#xff09; 3.发布博客之后跳转到详情页观察是否有刚发布的博客 4.删除博客观察列表的…

漫漫数学之旅004

文章目录 经典格言数学习题古今评注根号的故事数学家小传(一)乔治波利亚(二) 克里斯托弗鲁登道夫经典格言 数学包括用最迂回曲折的方式证明最显而易见的事实。——乔治波利亚(Gorge Polya) 乔治波利亚(George Polya)的这句名言揭示了数学证明的本质和魅力。在数学中,…

非工程师指南: 训练 LLaMA 2 聊天机器人

引言 本教程将向你展示在不编写一行代码的情况下&#xff0c;如何构建自己的开源 ChatGPT&#xff0c;这样人人都能构建自己的聊天模型。我们将以 LLaMA 2 基础模型为例&#xff0c;在开源指令数据集上针对聊天场景对其进行微调&#xff0c;并将微调后的模型部署到一个可分享的…

华为 1+X《网络系统建设与运维(高级)》认证模拟实验上机试题

华为 1X《网络系统建设与运维&#xff08;高级&#xff09;》认证模拟实验上机试题 一、考试背景二、考试说明2.1考试分数说明2.2考试要求2.3考试环境介绍2.4启动考试环境2.5保存答案(非常重要) 三、考试正文3.1注意事项3.2校区内&#xff08;LAN&#xff09;3.2.1任务 1&#…

上门洗衣洗鞋小程序多门店管理模式是怎么样的

做干洗店和洗鞋店的老板们很多都不止一个门店&#xff0c;多门店的管理模式下&#xff0c;去做一个上门洗衣洗鞋小程序&#xff0c;需要有哪些必要的功能才能让不同的门店管理起来不乱呢。首先需要先确定一下不同门店的管理都会面临哪些经营场景和需求。 第一&#xff0c;加盟店…