Pygame的基本应用

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm=1001.2014.3001.5501

Pygame有很多模块,每个模块又有很多方法,在此不能够逐一讲解,所以,我们通过一个实例来学习Pygame,然后再分解代码,讲解代码中的模块。

图标 (35)

  实例01  制作一个跳跃的小球游戏

创建一个游戏窗口,然后在窗口内创建一个小球。以一定的速度移动小球,当小球碰到游戏窗口的边缘时,小球弹回,继续移动。按照如下步骤实现该功能:

(1)创建一个游戏窗口,宽和高设置为640*480。代码如下:

import sys                     # 导入sys模块

import pygame                  # 导入pygame模块

pygame.init()                  # 初始化pygame

size = width, height = 640, 480         # 设置窗口

screen = pygame.display.set_mode(size)     # 显示窗口

上述代码中,首先导入pygame模块,然后调用init()方法初始化pygame模块。接下来,设置窗口的宽和高,最后使用display模块显示窗体。display模块的常用方法如表2所示。

表2  display模块的常用方法

方  法  名

功    能

pygame.dispaly.init      

初始化display模块                             

pygame.dispaly.quit      

结束display模块                               

pygame.dispaly.get_init  

如果display模块已经被初始化,则返回True       

pygame.dispaly.set_mode  

初始化一个准备显示的界面                      

pygame.dispaly.get_surface

获取当前的Surface对象                         

pygame.dispaly.flip      

更新整个待显示的Surface对象到屏幕上           

pygame.dispaly.update      

更新部分内容显示到屏幕上,如果没有参数,则与flip功能相同 

(2)运行上述代码,会出现一个一闪而过的黑色窗口,这是因为程序执行完成后,会自动关闭。如果让窗口一直显示,需要使用while True让程序一直执行,此外,还需要设置关闭按钮。具体代码如下:

# -*- coding:utf-8 -*-

import sys                     # 导入sys模块

import pygame                  # 导入pygame模块

pygame.init()                   # 初始化pygame

size = width, height = 640, 480         # 设置窗口

screen = pygame.display.set_mode(size)     # 显示窗口

# 执行死循环,确保窗口一直显示

while True:

    # 检查事件

    for event in pygame.event.get():

        if event.type == pygame.QUIT:     # 如果单击关闭窗口,则退出

            pygame.quit()         # 退出pygame

            sys.exit()

上述代码中,添加了轮询事件检测。pygame.event.get()能够获取事件队列,使用for…in遍历事件,然后根据type属性判断事件类型。这里的事件处理方式与GUI类似,如event.type等于pygame.QUIT表示检测到关闭pygame窗口事件,pygame.KEYDOWN表示键盘按下事件,pygame.MOUSEBUTTONDOWN表示鼠标按下事件等。

(3)在窗口中添加小球。我们先准备好一张ball.png图片,然后加载该图片,最后将图片显示在窗口中,具体代码如下:

# -*- coding:utf-8 -*-

import sys                     # 导入sys模块

import pygame                  # 导入pygame模块

pygame.init()                   # 初始化pygame

size = width, height = 640, 480            # 设置窗口

screen = pygame.display.set_mode(size)    # 显示窗口

color = (0, 0, 0)                 # 设置颜色   

ball = pygame.image.load("ball.png")       # 加载图片

ballrect = ball.get_rect()               # 获取矩形区域

# 执行死循环,确保窗口一直显示

while True:

    # 检查事件

    for event in pygame.event.get():

        if event.type == pygame.QUIT:      # 如果单击关闭窗口,则退出

            pygame.quit()         # 退出pygame

            sys.exit()

    screen.fill(color)            # 填充颜色

    screen.blit(ball, ballrect)         # 将图片画到窗口上

    pygame.display.flip()             # 更新全部显示

上述代码中使用image模块的load()方法加载图片,返回值ball是一个Surface对象。Surface是用来代表图片的pygame对象,可以对一个Surface对象进行涂画、变形、复制等各种操作。事实上,屏幕也只是一个surface,pygame.display.set_mode就返回了一个屏幕Surface对象。如果将ball这个Surface对象画到screen Surface对象,需要使用blit()方法,最后使用display模块的flip()方法更新整个待显示的Surface对象到屏幕上。Surface对象的常用方法如表3所示。

表3  Surface对象的常用方法

方  法  名

功    能

pygame.Surface.blit

将一个图像画到另一个图像上

pygame.Surface.convert      

转换图像的像素格式                              

pygame.Surface.convert_alpha 

转化图像的像素格式,包含alpha通道的转换    

pygame.Surface.fill 

使用颜色填充Surface    

pygame.Surface.get_rect

获取Surface的矩形区域

运行上述代码,结果如图4所示。

图4  在窗口中添加小球

(4)下面该让小球动起来了。ball.get_rect()方法返回值ballrect是一个Rect对象,该对象有一个move()方法可以用于移动矩形。move(x,y)函数有两个参数,第一个参数是X轴移动的距离,第二个参数是Y轴移动的距离。窗体左上角坐标为(0,0),如果设置move(100,50),小球移动后的坐标位置如图5所示。

图5  移动后的坐标位置

为实现小球不停地移动,将move()函数添加到while循环内,具体代码如下:

# -*- coding:utf-8 -*-

import sys                  # 导入sys模块

import pygame                  # 导入pygame模块

pygame.init()                  # 初始化pygame

size = width, height = 640, 480      # 设置窗口

screen = pygame.display.set_mode(size)    # 显示窗口

color = (0, 0, 0)              # 设置颜色

ball = pygame.image.load("ball.png")      # 加载图片

ballrect = ball.get_rect()          # 获取矩形区域

speed = [5,5]                # 设置移动的X轴、Y轴距离

# 执行死循环,确保窗口一直显示

while True:

    # 检查事件

    for event in pygame.event.get():

        if event.type == pygame.QUIT:    # 如果单击关闭窗口,则退出

            pygame.quit()          # 退出pygame

            sys.exit()

    ballrect = ballrect.move(speed)    # 移动小球

    screen.fill(color)              # 填充颜色

    screen.blit(ball, ballrect)      # 将图片画到窗口上

    pygame.display.flip()          # 更新全部显示

(5)运行上述代码,发现小球在屏幕中一闪而过,此时,小球并没有真正消失,而是移动到窗体之外,此时需要添加碰撞检测的功能。当小球与窗体任一边缘发生碰撞,则更改小球的移动方向。具体代码如下:

# -*- coding:utf-8 -*-

import sys                  # 导入sys模块

import pygame                  # 导入pygame模块

pygame.init()                  # 初始化pygame

size = width, height = 640, 480      # 设置窗口

screen = pygame.display.set_mode(size)    # 显示窗口

color = (0, 0, 0)              # 设置颜色

ball = pygame.image.load("ball.png")      # 加载图片

ballrect = ball.get_rect()          # 获取矩形区域

speed = [5,5]                # 设置移动的X轴、Y轴距离

# 执行死循环,确保窗口一直显示

while True:

    # 检查事件

    for event in pygame.event.get():

        if event.type == pygame.QUIT:    # 如果单击关闭窗口,则退出

            pygame.quit()          # 退出pygame

            sys.exit()

           

    ballrect = ballrect.move(speed)    # 移动小球

    # 碰到左右边缘

    if ballrect.left < 0 or ballrect.right > width:

        speed[0] = -speed[0]

    # 碰到上下边缘

    if ballrect.top < 0 or ballrect.bottom > height:

        speed[1] = -speed[1]

   

    screen.fill(color)              # 填充颜色

    screen.blit(ball, ballrect)      # 将图片画到窗口上

    pygame.display.flip()          # 更新全部显示

上述代码中,添加了碰撞检测功能。如果碰到左右边缘,更改X轴数据为负数,如果碰到上下边缘,更改Y轴数据为负数。运行结果如图6所示。

图6  小球不停地跳跃

(6)运行上述代码发现好像有多个小球在飞快移动,这是因为运行上述代码的时间非常短,导致肉眼观察出现错觉,因此需要添加一个“时钟”来控制程序运行的时间。这时就需要使用Pygame的time模块。使用Pygame时钟之前,必须先创建Clock对象的一个实例,然后在while循环中设置多长时间运行一次。具体代码如下:

# -*- coding:utf-8 -*-

import sys                  # 导入sys模块

import pygame                  # 导入pygame模块

pygame.init()                  # 初始化pygame

size = width, height = 640, 480      # 设置窗口

screen = pygame.display.set_mode(size)    # 显示窗口

color = (0, 0, 0)              # 设置颜色

ball = pygame.image.load("ball.png")      # 加载图片

ballrect = ball.get_rect()          # 获取矩形区域

speed = [5,5]                # 设置移动的X轴、Y轴距离

clock = pygame.time.Clock()         # 设置时钟

# 执行死循环,确保窗口一直显示

while True:

    clock.tick(60)              # 每秒执行60次

    # 检查事件

    for event in pygame.event.get():

        if event.type == pygame.QUIT:    # 如果单击关闭窗口,则退出

            pygame.quit()                  # 退出pygame

            sys.exit()

           

    ballrect = ballrect.move(speed)    # 移动小球

    # 碰到左右边缘

    if ballrect.left < 0 or ballrect.right > width:

        speed[0] = -speed[0]

    # 碰到上下边缘

    if ballrect.top < 0 or ballrect.bottom > height:

        speed[1] = -speed[1]

   

    screen.fill(color)              # 填充颜色

    screen.blit(ball, ballrect)      # 将图片画到窗口上

    pygame.display.flip()          # 更新全部显示

至此,我们完成了小球的跳跃游戏。

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

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

相关文章

异界传说-如何应对甲方提出的不合理需求

在科技仙域中&#xff0c;有个灵犀宗的宗派&#xff0c;弟子们以精湛的技艺和卓越的智慧&#xff0c;为修仙者们提供各种神奇的软件。然而&#xff0c;在项目开发过程中&#xff0c;他们常常会遇到用户提出的不合理需求。面对这些需求&#xff0c;灵犀宗的弟子们总能凭借智慧和…

学习分享-Callable 和 Runnable 任务

前言 顺带回顾学习一下Callable 或 Runnable 任务 Callable 和 Runnable 任务 Callable 和 Runnable 是 Java 中用于定义任务的接口&#xff0c;它们主要用于并发编程&#xff0c;允许任务在独立的线程中运行。 Runnable 任务 Runnable 是一个函数式接口&#xff0c;只包含…

NumPy 舍入小数、对数、求和和乘积运算详解

舍入小数 在 NumPy 中&#xff0c;主要有五种方法来舍入小数&#xff1a; 截断 去除小数部分&#xff0c;并返回最接近零的浮点数。使用 trunc() 和 fix() 函数。 示例&#xff1a; import numpy as nparr np.trunc([-3.1666, 3.6667])print(arr)相同的示例&#xff0c;使…

SpringBoot接入RS-232串口通讯实现数据交互

目录 一、什么是RS-232&#xff1f; 先看看硬件通讯接口长啥样 RS-232 二、方案一 1.前期准备 a.配置 RXTX 1&#xff09;下载 RXTX 包并解压 2&#xff09;拷贝动态库到对应的jdk目录下 Windows平台 Linux平台 3&#xff09;在工程根目录下创建 lib 文件夹&#x…

Whisper语音识别 -- 自回归解码分析

前言 Whisper 是由 OpenAI 开发的一种先进语音识别系统。它采用深度学习技术&#xff0c;能够高效、准确地将语音转换为文本。Whisper 支持多种语言和口音&#xff0c;并且在处理背景噪音和语音变异方面表现出色。其广泛应用于语音助手、翻译服务、字幕生成等领域&#xff0c;为…

树莓派 linux ARM 如何更新libc库

在进行嵌入是开发的时候,如果碰到 应用程序报告以下错误, 那么说明,你的嵌入式的系统 LIBC库版本过低。 这时候该怎么解决呢? 我再进行live555 开发的过程中就碰到了。 这时候,你可能需要选择比较低版本的交叉编译器,或者要选择低版本的开源库。 但是除了以上方法之…

unidbg讲解V1

前言 unidbg是什么? unidbg是一个Java项目,可以帮助我们去模拟一个安卓或IOS设备,用于去执行so文件中的算法,从而不需要再去逆向他内部的算法。最终会产出一个jar包,可以被python进行调用。 如何使用unidbg? 下载github上开源的项目:https://github.com/zhkl0228/un…

HTML的a标签如何做返回顶部的功能

在HTML中&#xff0c;<a> 标签通常用于创建超链接。要实现返回顶部的功能&#xff0c;你可以使用 <a> 标签结合JavaScript的 scrollTo() 方法&#xff08;尽管在大多数情况下&#xff0c;我们更常用 window.scrollTo(0, 0) 或 window.scroll(0, 0)&#xff09;&…

【因果推断python】32_合成控制2

目录 合成控制作为线性回归的一种实现​编辑 合成控制作为线性回归的一种实现 为了估计综合控制的治疗效果&#xff0c;我们将尝试构建一个类似于干预期之前的治疗单元的“假单元”。然后&#xff0c;我们将看到这个“假单位”在干预后的表现。合成控制和它所模仿的单位之间的…

OpenGauss常操作

OpenGauss官网已经有很详细的说明了,但是对于新手而言还有一些需要注意的地方; 安装 yum一键安装; yum -y install libaio-devel yum -y install readline-devel yum -y install libnsl 单独创建用户和组; groupadd dbgroup useradd -g dbgroup omm passwd omm 取消打开文…

关于学习Token、JWT、Cookie等验证授权方式的总结

目录 一、为什么Cookie无法防止CSRF攻击&#xff0c;而Token可以&#xff1f; 二、为什么无论采用Cookie-session的方式&#xff0c;还是Token&#xff08;JWT&#xff09;的方式&#xff0c;在一个浏览器里&#xff0c;同一个网站只能保证一个用户处于登录状态&#xff1f; …

韩顺平0基础学java——第22天

p441-459 异常exception 选中代码块&#xff0c;快捷键ctraltt6&#xff0c;即trt-catch 如果进行了异常处理&#xff0c;那么即使出现了异常&#xff0c;但是会继续执行 程序过程中发生的异常事件分为两大类&#xff1a; 异常体系图※ 常见的运行异常&#xff1a;类型转换…

vs2019 c++20规范 STL 库中头文件 <atomic> 源码注释及探讨几个知识点

&#xff08;1 探讨一&#xff09; 模板类 atomic 的继承关系与数据结构如下&#xff1a; (2 探讨二 ) 可见 atomic 的 fetch_xx 函数&#xff0c;返回的都是 atomic 中存储的旧值。测试如下&#xff1a; 谢谢

【MySQL】mysql中常见的内置函数(日期、字符串、数学函数)

文章目录 案例表日期函数字符串函数数学函数其他函数 案例表 emp students 表 exam_result 表 日期函数 注意current_time和now的区别 案例一&#xff1a; 创建一张表用来记录生日&#xff0c;表结构如下 添加日期&#xff1a; insert tmp (birthday) values (2003-01-3…

永磁同步电机滞环电流控制(PI双闭环)matlab仿真模型

微♥“电击小子程高兴的MATLAB小屋”获取模型 1.滞环电流控制的原理 将给定的电流信号与反馈的电流信号进行比较&#xff0c;然后控制它俩之间的差值稳定在一个滞环范围内&#xff0c;若超出范围&#xff0c;则进行相应的调节操作。 操作如下叙述&#xff1a;假设以三相中的A相…

【Android面试八股文】Thread.sleep()方法被调用之后可以被中断吗?

面试官:你能告诉我 Thread.sleep() 方法是否是可中断的吗?如果是,能解释一下如何中断它吗? 候选人:是的,Thread.sleep() 方法是可中断的。当一个线程正在调用 sleep() 方法时,如果另一个线程调用了这个睡眠线程的 interrupt() 方法,那么正在睡眠的线程会抛出 Interrup…

unDraw —— 免费且可定制的插画库,为您的设计注入灵魂

&#x1f3a8; unDraw —— 免费且可定制的插画库&#xff0c;为您的设计注入灵魂 在寻找能够完美融入您品牌风格的插画吗&#xff1f;unDraw&#xff0c;一个提供大量免费插画资源的网站&#xff0c;可能是您的理想选择&#xff01; &#x1f310; 网站特色 免费且开源 unDraw…

站易WordPress

站易WordPress是一家专业提供网站建设和运营服务的公司。他们提供的服务包括企业官方网站建设、网站运营维护、网站托管、网站优化、跨境独立站建站、外贸网站建设以及海外多语言网站建设等。 此外&#xff0c;站易还提供使用现成的WordPress模板&#xff0c;这样可以快速且低…

项目太大导致报错:JavaScript堆内存已满

1.问题 启动一个Vue项目的时候遇到了如下的报错 Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory 无效的标记压缩导致接近了堆上限&#xff0c;分配失败 - JavaScript内存不足 2.解决方法 我查阅了网上的资料&#xff0c;似乎…

udp协议下的socket函数

目录 1.网络协议 2.网络字节序 3.socket编译接口 4.sockaddr结构体 5.模拟实现 1.socket函数 2.bind函数&#xff08;绑定&#xff09; 1.讲解 1.如何快速的将 整数ip<->字符串 2.ip地址的注意事项 3.端口号的注意事项 3.recvfrom函数 4.sendto函数 5.代码呈…