Python学习笔记31:进阶篇(二十)pygame的使用之图形绘制

前言

基础模块的知识通过这么长时间的学习已经有所了解,更加深入的话需要通过完成各种项目,在这个过程中逐渐学习,成长。

我们的下一步目标是完成python crash course中的外星人入侵项目,这是一个2D游戏项目。在这之前,我们先简单学习一下pygame模块。

私信我发送消息python资料,领取python crash course中文版PDF。

Pygame

Pygame是一个开源的Python多媒体开发库,专门用于开发2D游戏。它是Python编程语言的一个扩展,基于 SDL (Simple DirectMedia Layer) 库,提供了丰富的功能来处理图形、声音、事件处理等游戏开发所需的基本要素,使得创建游戏变得更加简单直接。

图形绘制

主要使用pygame.draw模块进行基本图形的绘制,包括矩形,圆形,多边形等。

Surface

Surface 是一个非常核心的概念。Surface 对象可以被理解为一个二维的矩形画布,它有自己的像素格式和尺寸。这个对象允许你在其上绘制图像、图形、文本等内容,并且可以与其他 Surface 对象进行组合或层叠,以构建复杂的游戏画面。

图形绘制的操作,都需要在这个对象上进行。

Surface 对象具有以下特性:

  • 像素访问:你可以直接访问 Surface 上的每一个像素,进行读取或修改。
  • 绘制功能:Surface 提供了多种方法来在上面绘制图形,如 draw.rect(), draw.circle(), draw.line() 等。
  • 转换:你可以使用 convert() 或 convert_alpha() 方法来改变 Surface 的像素格式,以优化性能或支持透明度。
  • 混合:Surface 支持像素级别的混合操作,可以将一个 Surface 的颜色与另一个 Surface 的颜色混合。
  • 复制和剪切:你可以从一个 Surface 复制部分区域到另一个 Surface 上,或者剪切并粘贴。
  • 位图操作:Surface 支持位图操作,如翻转(flip())和旋转(rotate())。
  • blit:这是 Surface 最常用的方法之一,用于将一个 Surface 的内容绘制到另一个 Surface 上。
  • 透明度:Surface 可以设置全局的 alpha 透明度,也可以在绘制时指定局部的透明度。

在 Pygame 中,最常见的 Surface 类型是 Display Surface,它是游戏主窗口的 Surface。你可以使用 pygame.display.set_mode() 来创建一个 Display Surface。此外,你还可以使用 pygame.Surface() 构造函数来创建任意大小和格式的 Surface 对象。

我们的图形绘制,可以简单理解为在主窗口的Surface基础上堆叠自己定义的子Surface

下面我们通过简单的一个示例,执行了解一下。

import pygame# 初始化 Pygame
pygame.init()# 创建一个 Display Surface, 也就是我们说的主窗口
screen = pygame.display.set_mode((800, 600))# 创建一个额外的 Surface,这个就是我们堆叠在主窗口中的子画布对象
extra_surface = pygame.Surface((200, 100))# 在 extra_surface 上绘制一个矩形,这些参数在图形绘制里面会讲,这里主要理解Surface堆叠
pygame.draw.rect(extra_surface, (255, 0, 0), (0, 0, 100, 50))# 将 extra_surface 绘制到 screen (主窗口) 上
screen.blit(extra_surface, (300, 200))# 更新屏幕显示
pygame.display.flip()# 点击关闭退出程序,这个后面再讲,代码可以先写上。
while True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()exit()

在这里插入图片描述

可以看到,我们的窗口中间有个红色的正方形,这就是我们在新画布上绘制的一个矩形。

这部分主要帮助理解pygame中的类似图层的一种概念,帮助后面在绘制图形和游戏制作的时候不会迷糊。

draw

pygame.draw模块就是我们实际用于绘制图形的模块,当然图形绘制的函数中都有一个参数是Surface,这是绘制图形所需的画布。接下来讲解一下常用的几个图形绘制函数。

矩形(rect)

pygame.draw.rect(Surface, color, Rect, width=0)函数可以绘制矩形。

参数说明:

  • Surface: 要在其上绘制矩形的窗口或屏幕对象。
  • color: 矩形的颜色,一个 RGB 值的三元组,其中每个颜色通道的值范围从 0 到 255。例如,纯红色可以用 (255, 0, 0) 表示,纯绿色用 (0, 255, 0),纯蓝色用 (0, 0, 255),而白色则是 (255, 255, 255),黑色是 (0, 0, 0)。
  • Rect: 矩形的位置和尺寸,格式为 [x坐标, y坐标, 宽度, 高度]。通常以画布左上角顶点为基准位置,即x=0,y=0,区别与一般的坐标轴,y的值都是正值。
  • width: 矩形的边框宽度,如果为 0 或省略,则矩形将被填充。

接下里看代码和执行结果解释函数。

import pygame
pygame.init()screen = pygame.display.set_mode((400, 400))
pygame.display.set_caption('Draw Shapes')# 绘制一个填充的红色矩形
pygame.draw.rect(screen, (255, 0, 0), (50, 50, 100, 100))# 绘制一个未填充的蓝色矩形,边框宽度为 3
pygame.draw.rect(screen, (0, 0, 255), (150, 150, 100, 100), 3)# 更新屏幕
pygame.display.flip()# 点击关闭退出程序,这个后面再讲,代码可以先写上。
while True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()exit()

在这里插入图片描述
代码解释如下:
1. 导入pygame。
2. 初始化pygame模块。
3. 创建一个400*400的窗口。
4. 设置窗口名为Draw Shapes
5. 绘制一个矩形。绘制画布是主窗口(之前讲解Surface的时候用的是新建的字画布,这里直接用窗口,窗口也是画布,都是Surface对象),设置矩形颜色为红色,设置矩形的信息(50,50,100,100),宽度为默认值0,也就是说这个矩形会被红色填充。
6. 绘制一个矩形,绘制画布同样是主窗口,设置矩形颜色为蓝色,矩形信息(150,150,100,100),宽度为3,说明这个矩形是蓝色边框,未被填充的矩形。
7. 更新屏幕,就是把图形更新的到窗口上显示出来。
8. while循环监听事件,如果点击了关闭窗口,我们的Python程序结束。这一步其实是从17行开始的所有代码,后面讲到事件和输入的时候再仔细讲。

通过代码和执行结果,很简单就能矩形的绘制了。那么,关于width参数,如果参数大于等于矩形最大边长,会发生什么呢?大家自行了解。

圆形(circle)

pygame.draw.circle(Surface, color, center, radius, width=0)函数可以绘制圆形。

参数说明:

  • Surface: 要在其上绘制圆形的窗口或屏幕对象。
  • color: 圆形的颜色。
  • center: 圆心的位置,一个二元组 (x, y)。
  • radius: 圆的半径。
  • width: 边框宽度,如果为 0 或省略,则圆形将被填充。

圆形的参数就很简单了,不单独讲水字数了,通过代码和执行结果就能明白。

# 省略与矩形绘制相同的代码,后面不在单独注释了
--snip--# 绘制一个填充的红色圆
pygame.draw.circle(screen, (255, 0, 0), (200, 100), 50)# 绘制一个未填充的绿色圆
pygame.draw.circle(screen, (0, 255, 0), (200, 200), 50, 5)# 省略与矩形绘制相同的代码,后面不在单独注释了
--snip-- 

在这里插入图片描述
执行结果如上图,圆心坐标的基准值依旧是窗口左上角顶点为坐标轴顶点。

多边形(polygon)

pygame.draw.polygon(Surface, color, pointlist, width=0)函数用于绘制多边形。

参数说明:

  • Surface: 要在其上绘制多边形的窗口或屏幕对象。
  • color: 多边形的颜色。
  • pointlist: 多边形顶点的列表,每个顶点是一个二元组 (x, y)。
  • width: 边框宽度,如果为 0 或省略,则多边形将被填充

参数大同小异,区别在顶点坐标的元组。也就是说我们绘制多边形的时候,如果想绘制等边多边形,必须自己计算好坐标的值,都学Python了,肯定不能硬算,写个程序计算各个坐标吧。

--snip--# 绘制一个填充的不知道啥颜色的多边形
pygame.draw.polygon(screen, (125, 125, 125), ((250, 50), (350, 50), (350, 150), (250, 150)))# 绘制一个未填充的不知道啥颜色的多边形
pygame.draw.polygon(screen, (125, 125, 125), ((250, 150), (350, 150), (350, 250), (250, 250)), 5)--snip-- 

在这里插入图片描述
注意看,我们通过多边形的函数,画出了一个正方形并设置了一个灰色的参数。这里要注意的是,这个顶点的坐标元组,每个顶点的左边必须按正常绘画顺序来添加。比如正方是的左边顶点分别为AB,右边顶点分别为CD。那么我们在设置顶点元组的顺序时,必须按照绘画顺序也就是A=>B=>D=>C或者A=>D=>C=>B这样的顺序添加顶点坐标到元组。当然你也可以试试不按顺序。

线条(line)

pygame.draw.line(Surface, color, start_pos, end_pos, width)函数可以绘制出线条,或者说是线段。

参数说明:

  • Surface: 要在其上绘制线条的窗口或屏幕对象。
  • color: 线条的颜色。
  • start_pos: 线条起点的位置,一个二元组 (x, y)。
  • end_pos: 线条终点的位置,一个二元组 (x, y)。
  • width: 线条的宽度,必填!!!线条没有填充的说法,必填宽度。

线条的绘制比较简单,就标两个点的坐标就行,当然线条没有填充这个说法,宽度参数就是线条的宽度。简单过一下。

--snip--# 绘制一个绿色线条
pygame.draw.line(screen, (0, 255, 0), (400, 50), (400, 250), 1)# 绘制一个绿色线条
pygame.draw.line(screen, (0, 255, 0), (450, 50), (450, 250), 5)--snip-- 

在这里插入图片描述

椭圆(ellipse)

pygame.draw.ellipse(Surface, color, Rect, width=0)函数可以绘制椭圆。

参数说明:

  • Surface: 要在其上绘制椭圆的窗口或屏幕对象。
  • color: 椭圆的颜色。
  • Rect: 椭圆的边界矩形,格式为 [x坐标, y坐标, 宽度, 高度]。
  • width: 边框宽度,如果为 0 或省略,则椭圆将被填充。

看参数的话,椭圆的绘制和矩形的绘制差不多,底层应该是用矩形的边界确定椭圆的长边和短边然后绘制出椭圆,也简单过一下就好。

--snip--# 绘制一个填充的红色椭圆
pygame.draw.ellipse(screen, (0, 0, 255), (550, 50, 150, 100))# 绘制一个未填充的蓝色椭圆,边框宽度为 3
pygame.draw.ellipse(screen, (0, 0, 255), (550, 150, 150, 100), 3)--snip-- 

在这里插入图片描述

假如我们绘制椭圆时,边界矩形是个正方形,我们绘制出的图形会是什么呢?

结尾

图形绘制就将这个几个函数,基本上已经满足图形绘制的要求了。后面在学习图片的填充,在2D游戏中,所有的模型基本都是由图形绘制或者图片填充而成的,这两个模块的内容学完,基本就可以绘制出游戏的人物和地图了。

作业

  1. 绘制矩形,圆形,多边形,线条,矩形。
  2. 验证绘制多边形时不按顺序填入顶点元组。
  3. 绘制椭圆时边界矩形设置成正方形。

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

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

相关文章

Day2用 rustlings 练习 Rust 语言-Move Semantics

大家好 今天 完成 2024年自动驾驶OS开发训练营-初阶营第四期-导学 Day2用 rustlings 练习 Rust 语言 -Move Semantics https://doc.rust-lang.org/stable/book/ch04-00-understanding-ownership.html 提交代码时候 提示 没有权限怎么出来 aciton 参考开发环境配置 https://rcor…

图片管理新纪元:高效批量横向拼接图片,一键生成灰色艺术效果,打造专业视觉体验!

在数字时代,图片已成为我们生活和工作中不可或缺的一部分。但面对海量的图片,如何高效地进行批量管理、拼接和调色,成为许多人面临的难题。今天,我们为您带来了一款颠覆性的图片管理工具,让您轻松实现图片批量横向拼接…

智慧生活新篇章,Vatee万腾平台领航前行

在21世纪的科技浪潮中,智慧生活已不再是一个遥远的梦想,而是正逐步成为我们日常生活的现实。从智能家居的温馨便捷,到智慧城市的高效运转,科技的每一次进步都在为我们的生活增添新的色彩。而在这场智慧生活的变革中,Va…

论文翻译 | (TAKE A STEP BACK) 后退一步:在大型语言模型中通过抽象来调用推理

摘要 我们介绍了STEP-BACK提示,这是一种简单的提示技术,使LLM能够进行抽象,从而从包含特定细节的实例中派生高级概念和第一原则。使用概念和原则来指导推理,LLM显着提高了他们遵循正确推理路径的能力。我们使用PaLM-2L、GPT-4和Ll…

Redis数据结构解析-RedisObject

文章目录 ☃️概述☃️源码 ☃️概述 RedisObject 是 Redis 中表示数据对象的结构体,它是 Redis 数据库中的基本数据类型的抽象。在 Redis 中,所有的数据都被存储为 RedisObject 类型的对象。 RedisObject 结构体定义如下(简化版本&#xf…

kafka中

Kafka RocketMQ概述 RabbitMQ概述 ActiveMQ概述 ZeroMQ概述 MQ对比选型 适用场景-从公司基础建设力量角度出发 适用场景-从业务场景出发 Kafka配置介绍 运行Kafka 安装ELAK 配置EFAK EFAK界面 KAFKA常用术语 Kafka常用指令 Kafka中消息读取 单播消息 group.id 相同 多播消息 g…

MyBatis-Plus-实用的功能自动填充字段

前言: java项目用到了mybatis-plus,在一些类里面需要在更新时候,统一设置,修改人,修改ID,修改时间。新增时候设置 创建人,创建时间等 基础类: Data public abstract class BaseModel implements…

java 公共字段填充

公共字段填充 1、mybatis-plus2、mybatis 使用注解加aop2.1 自定义注解2.2 自定义切面类2.3 在mapper上添加上自定义的注解 1、mybatis-plus 通过在类上使用如下的注解 TableField(fill FieldFill.INSERT) 是 MyBatis-Plus 中的注解,用于自动填充字段的值。MyBat…

简单且循序渐进地查找软件中Bug的实用方法

“Bug”这个词常常让许多开发者感到头疼。即使是经验丰富、技术娴熟的开发人员在开发过程中也难以避免遭遇到 Bug。 软件中的故障会让程序员感到挫败。我相信在你的软件开发生涯中,也曾遇到过一些难以排查的问题。软件中的错误可能会导致项目无法按时交付。因此&…

Linux进程、线程——保姆级助理解

目录 1、进程(Process) 1.1 进程基本概念: 1.2 进程分类 1.3 进程的特征 1.4 进程和程序的区别 1.5 进程的状态 1.6 进程的创建——Fork()函数 1.6.1 简介 1.6.2 使用 1.7 进程终止 2、线程(Thread) 1.1 线…

Git管理源代码、git简介,工作区、暂存区和仓库区,git远程仓库github,创建远程仓库、配置SSH,克隆项目

学习目标 能够说出git的作用和管理源代码的特点能够如何创建git仓库并添加忽略文件能够使用add、commit、push、pull等命令实现源代码管理能够使用github远程仓库托管源代码能够说出代码冲突原因和解决办法能够说出 git 标签的作用能够使用使用git实现分支创建,合并…

排序 -- 冒泡排序和快速排序

一、 交换排序 1、基本思想 所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。 2、常见的交换排序 1、冒泡…

《征服数据结构》SparseArray

摘要: 1,SparseArray的介绍 2,SparseArray的代码实现 1,SparseArray的介绍 前面我们讲过《ArrayMap》,用它来实现哈希表,其中存放key和value的数组长度是存放散列表数组长度的二倍。 在哈希表中如果key值是…

【Python】已解决:(Python xml库 import xml.dom.minidom导包报错)‘No module named dom’

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决:(Python xml库 import xml.dom.minidom导包报错)‘No module named dom’ 一、分析问题背景 在使用Python处理XML文件时,xml…

中科曙光:新智生产力引擎,是一台精密的AI发动机

每一个时代的新生产力释放,都需要新的发动机来释放新动能。比如蒸汽机之于畜力、燃油机之于蒸汽机,发动机的每一次进化,都为新兴工业体系奠定了更强大的生产力底座。 如今,AI作为新质生产力的关键引擎,带来了史无前例的…

240706_昇思学习打卡-Day18-基于MindSpore的GPT2文本摘要

240706_昇思学习打卡-Day18-基于MindSpore的GPT2文本摘要 今天做一个根据一段文章提取摘要的提取器,基于nlpcc2017摘要数据,内容为新闻正文及其摘要,就是训练集及标签。 首先我们来预装以下MindSpore环境 %%capture captured_output # 实验…

LabVIEW干涉仪测向系统

开发了一套基于LabVIEW的软件系统,结合硬件设备,构建一个干涉仪测向实验教学平台。该平台应用于信号处理课程,帮助学生将理论知识与实际应用相结合,深化对信号处理核心概念的理解和应用。 项目背景: 当前信号处理教学…

昇思25天学习打卡营第十四天|Pix2Pix实现图像转换

训练营进入第十四天,今天学的内容是Pix2Pix图像转换,记录一下学习内容: Pix2Pix概述 Pix2Pix是基于条件生成对抗网络(cGAN, Condition Generative Adversarial Networks )实现的一种深度学习图像转换模型&#xff0c…

为RK3568或RK3288开发板创建交叉编译环境{采用amd64的ubuntu系统配置交叉编译arm64开发环境}(保姆级包括安装QT)超详细记录版

为RK3568或RK3288开发板创建交叉编译环境{采用amd64的ubuntu系统配置交叉编译arm64开发环境}【保姆级包括安装QT】超详细记录版 Chapter1 为RK3568或RK3288开发板创建交叉编译环境{采用amd64的ubuntu系统配置交叉编译arm64开发环境}(保姆级包括安装QT)超详细记录版一. 安装QT程…

picgo+gitee图床配置

node.js安装 刚开始顺着picgo操作,直接跳转到了node.js官网 下载的时候直接 Next,然后可以自定义安装路径,我的安装路径是C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Node.js 然后再在安装路径的根目录下新建两个文件夹,nodecache 和 nodeglobal, 如图所示:…