Pygame 教程(3):绘制图形

article/2025/10/3 17:45:44

本章,你将学习如何在 Pygame 中绘制图形。

导航

上一章:重要的概念及对象
下一章:图像传输和绘制文本

文章目录

  • 导航
  • 抗锯齿
  • draw 模块
  • 实例:跟随鼠标的图形
    • 创建初始窗口
    • 添加变量
    • 捕捉鼠标事件
    • 绘制图形
    • 完整代码
  • 结语

抗锯齿

抗锯齿(anti-aliasing,简称 AA)是一种消除显示器输出的画面中图物边缘出现凹凸锯齿的技术。实现抗锯齿效果需要更多的计算时间,因此在进行高质量绘制的同时,也会带来一定的性能缺陷。

draw 模块

pygame.draw模块提供了一些函数以在Surface对象上绘制各种形状。

这些函数的共同点是:

  1. 第一个参数都是图形要绘制到的Surface对象。
  2. 第二个参数都是绘制的颜色。
  3. 所有的非抗锯齿函数都有可选的width参数:
    • 对于非封闭图形,如果width >= 1,它表示线条的粗细,如果width < 1,图形将不会被绘制。
    • 对于封闭图形,如果width >= 1,它表示线条的粗细,如果width == 0,图形将被填充,如果width < 1,图形将不会被绘制。
  4. 函数返回的都是绘制所影响的矩形区域。

具体定义及作用如下表(详见官方文档):

函数定义函数作用
rect(surface, color, rect, width=0, border_radius=0, border_top_left_radius=-1, border_top_right_radius=-1, border_bottom_left_radius=-1, border_bottom_right_radius=-1) -> Rect绘制一个矩形。
rect指定要绘制的矩形的坐标。
最后的5个可选参数用于绘制圆角矩形。
polygon(surface, color, points, width=0) -> Rect绘制一个多边形。
points为3个或更多 (x, y) 坐标组成的顶点序列。
circle(surface, color, center, radius, width=0, draw_top_right=None, draw_top_left=None, draw_bottom_left=None, draw_bottom_right=None) -> Rect绘制一个圆。
center指定圆的中心坐标。
radius指定圆的半径。最后的4个可选参数用于绘制不完整的圆。
ellipse(surface, color, rect, width=0) -> Rect绘制一个椭圆。
rect表示椭圆的位置和大小,椭圆将以矩形的中心为中心,并以矩形为界。
arc(surface, color, rect, start_angle, stop_angle, width=1) -> Rect绘制一段椭圆弧。
rect表示包含被绘制圆弧的椭圆的边界矩形。
参数start_anglestop_angle的单位是弧度,表示椭圆弧的起点和终点:
如果start_angle < stop_angle,弧线以逆时针方向从start_angle画到stop_angle
如果start_angle > stop_angle,将会给stop_angle加上 τ ( 即 2 π ) \tau\ (即2\pi) τ (2π),如果此时start_angle < stop_angle,则采用上述第一种情况,否则不会进行绘制;
如果start_angle == stop_angle也不会进行任何绘制。
line(surface, color, start_pos, end_pos, width=1) -> Rect绘制一条线段。
start_posend_pos分别表示线段的起始坐标和终点坐标。
lines(surface, color, closed, points, width=1) -> Rect绘制多条顶点相交的线段。
closed指定是否要在起始坐标和终点坐标之间添加一条额外的线段。
points为两个或更多 (x, y) 坐标组成的顶点序列。
例如,对于[(x1, y1), (x2, y2), (x3, y3)],将从(x1, y1)画到(x2, y2),再从(x2, y2)画到(x3, y3),如果指定closedTrue,还将从(x3, y3)画到(x1, y1)
aaline(surface, color, start_pos, end_pos, blend=1) -> Rect绘制一条抗锯齿的线段。
blend指定是否与目标图像混合绘制。
其他参数同pygame.draw.line
aalines(surface, color, closed, points, blend=1) -> Rect绘制多条顶点相交的抗锯齿的线段。
blend指定是否与目标图像混合绘制。
其他参数同pygame.draw.lines

实例:跟随鼠标的图形

与上一章一样,为了使读者更清楚地了解pygame.draw模块的使用,我们将创建一个使图形跟随鼠标的程序。

请创建一个新的文件,命名为following_shapes.py

创建初始窗口

请添加以下代码以创建初始窗口:

import math
import sysimport pygameclass FollowingShapes:def __init__(self):pygame.init()self.screen = pygame.display.set_mode((800, 800))pygame.display.set_caption('Following Shapes')def run(self):while True:for event in pygame.event.get():if event.type == pygame.QUIT or (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE):pygame.quit()sys.exit()self.screen.fill((0, 0, 0))pygame.display.update()if __name__ == '__main__':app = FollowingShapes()app.run()

与前几个程序截然不同的是,我们把主循环封装到了FollowingShapes类中。当程序所需要处理的工作变得越来越多时,把主代码全部写在顶级语句中并不是一个很好的方式,这样会减低代码的可读性,也会使程序难以维护。时常对代码进行重构,是一个良好的习惯。

在最开始,程序导入了math库,因为在后期绘制弧线时,我们需要使用math.pi

在事件处理中,除了QUIT事件我们还处理了KEYDOWN事件,并且使用了key属性,它表示用户所按下的键。这个属性,并不是所有的事件对象都有的,而是 Pygame 为这个事件添加的特殊属性,这样的事件还有很多,详见官方文档。

添加特殊的属性其实是 Python 的特性之一,可以通过[variable_name].[attribute_name] = [value]的形式在类的外部添加属性,如下所示:

>>> class Editor:
...     pass
... 
>>> editor = Editor()
>>> editor.name = 'vscode'
>>> editor.name
'vscode'

但是这种方法仅限于自定义的类。

回到程序,在事件处理中,如果用户按下了Esc键,也将退出程序,这是因为图形是随着鼠标移动的,如果用户只能把鼠标拖到“关闭”按钮来退出程序,会略显别扭,所以添加了退出程序的快捷键。

在屏幕渲染中调用fill函数是为了在每次循环时填充屏幕,如果不填充屏幕,鼠标移动后旧的图形依然会留在屏幕上。

添加变量

在构造函数中,添加如下代码:

def __init__(self):# ...self.color = (255, 0, 0)self.pos = (0, 0)self.mode = 0# ...

上述代码中,color属性设置绘制图形所使用的颜色,此处为红色,pos属性用于保存鼠标的位置,mode属性指定要绘制的图形。在本实例中,mode与图形的对应关系如下表:

mode的值对应的图形
0矩形
1
2椭圆
3线段
4弧线

捕捉鼠标事件

为了使图形能够跟随鼠标移动,我们需要捕捉鼠标移动的事件。同时,在本实例的设计中,用户一点击鼠标就会切换图形,所以还需要捕捉按下鼠标的事件。在 Pygame 中,这两个事件分别是MOUSEMOTIONMOUSEBUTTONDOWN,捕捉事件的代码如下:

for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()elif event.type == pygame.MOUSEMOTION:self.pos = event.poselif event.type == pygame.MOUSEBUTTONDOWN:self.mode += 1self.mode %= 5

在处理MOUSEMOTION事件时,我们再次使用了一个特殊属性pos,它表示鼠标相对于屏幕的坐标。

在处理MOUSEBUTTONDOWN事件时,我们先将mode自增1,然后把mode取模5并赋值给本身,这样做是为了在mode为4并自增时轮回0。

绘制图形

在代码中添加如下绘制图形的方法:

def draw_shape(self):rect = pygame.Rect(0, 0, 200, 100)rect.center = self.posif self.mode == 0:pygame.draw.rect(self.screen, self.color, rect)elif self.mode == 1:pygame.draw.circle(self.screen, self.color, self.pos, 100)elif self.mode == 2:pygame.draw.ellipse(self.screen, self.color, rect)elif self.mode == 3:pygame.draw.line(self.screen, self.color, rect.topleft, rect.bottomright)elif self.mode == 4:pygame.draw.arc(self.screen, self.color, rect, 0, math.pi)

该方法的最开始,创建了一个矩形对象rect,并将它的中心设置为鼠标坐标,是因为大部分绘制都是基于这个矩形的:

  • 绘制矩形时,rect为矩形的坐标。
  • 绘制椭圆时,rect为椭圆的边界矩形。
  • 绘制线段时,rect也是线段的边界矩形,即线段是rect的对角线。
  • 绘制弧线时,rect是包含弧线的椭圆的边界矩形。

而绘制圆时,因为rect的长宽不相等,所以没有使用,把中心设置为鼠标坐标,半径设置为100。

最后,在run方法中调用draw_shape方法:

# ...
self.screen.fill((0, 0, 0))
self.draw_shape()
pygame.display.update()
# ...

完整代码

import math
import sysimport pygameclass FollowingShapes:def __init__(self):pygame.init()self.screen = pygame.display.set_mode((800, 800))pygame.display.set_caption('Following Shapes')self.color = (255, 0, 0)self.pos = (0, 0)self.mode = 0def draw_shape(self):rect = pygame.Rect(0, 0, 200, 100)rect.center = self.posif self.mode == 0:pygame.draw.rect(self.screen, self.color, rect)elif self.mode == 1:pygame.draw.circle(self.screen, self.color, self.pos, 100)elif self.mode == 2:pygame.draw.ellipse(self.screen, self.color, rect)elif self.mode == 3:pygame.draw.line(self.screen, self.color, rect.topleft, rect.bottomright)elif self.mode == 4:pygame.draw.arc(self.screen, self.color, rect, 0, math.pi)def run(self):while True:for event in pygame.event.get():if event.type == pygame.QUIT or (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE):pygame.quit()sys.exit()elif event.type == pygame.MOUSEMOTION:self.pos = event.poselif event.type == pygame.MOUSEBUTTONDOWN:self.mode += 1self.mode %= 5self.screen.fill((0, 0, 0))self.draw_shape()pygame.display.update()if __name__ == '__main__':app = FollowingShapes()app.run()

代码运行截图:

代码运行截图

结语

以上,就是本章的所有内容。下一章,我们将会学习如何加载图像并绘制文字。


http://chatgpt.dhexx.cn/article/8Ayp7vDD.shtml

相关文章

Mac Pycharm导入Pygame教程(超细)

首先先新建一个想要使用Pygame的项目 进入项目后&#xff0c;点击文件&#xff08;File&#xff09;——新项目设置&#xff08;settings&#xff09; 点击新项目的偏好设置&#xff08;Preferences for new project &#xff09; 随后可以看到 点击Python 编译器&#xff0…

mac python3.8上怎么安装pygame 第三方库_Python3.8安装Pygame教程步骤详解

注:因为最近想用一下python做一些简单小游戏的开发作为项目练手之用,而Pygame模块里面提供了大量的有用的方法和属性。今天我们就在之前安装过PyCharm的基础上,安装Pygame,下面是安装的步骤,希望能够帮到大家。 第一步 安装Python和pip 如果已安装,使用python --version …

Pygame教程系列一:快速入门篇

【简介】 Pygame 是python用来开发视频游戏的游戏引擎&#xff0c;底层主要是SDL库实现&#xff0c;算是目前利用python开发小游戏的一个性能比较高的一个游戏框架 一、安装pygame 使用pip下载安装 pip install pygame二、入门案例详析 1、示例效果 2、示例代码 import os …

pygame教程3

目录 做个小游戏精灵类精灵类介绍使用精灵类 做个小游戏 这个小游戏使用了pygame教程2的知识。 #↓初始化 import pygame,sys from pygame.locals import * pygame.init()#初始化pygame。 screen pygame.display.set_mode((800,600)) pygame.display.set_caption("Hell…

pygame教程2

目录 响应键盘上的事件让画面动起来了解x轴和y轴画圆形圆形动起来 响应键盘上的事件 import pygame#导入pygame。 import sys#导入sys from pygame.locals import *#导入pygame所有的常量&#xff0c;方便以后使用。 pygame.init()#初始化pygame。 screen pygame.display.set…

pygame教程笔记

pygame教程 安装pygameGame Development 1-1: Getting Started with PygameGame Development 1-2: Working with SpritesGame Development 1-3: More About SpritesPygame Shmup Part 1: Player Sprite and ControlsPygame Shmup Part 2: Enemy SpritesPygame Shmup Part 3: Co…

pygame基础教程

pygame简介 pygame可以实现python游戏的一个基础包。 pygame实现窗口 初始化pygame&#xff0c;init()类似于java类的初始化方法&#xff0c;用于pygame初始化。 pygame.init() 设置屏幕&#xff0c;(500,400)设置屏幕初始大小为500 * 400的大小&#xff0c; 0和32 是比较高…

Python pygame(GUI编程)模块最完整教程(1)

提示&#xff1a;下滑文章左侧可以查看目录&#xff01;本教程分为多篇&#xff0c;总目录如下。 总目录&#xff1a; README.md Python-ZZY/Python-Pygame最完整教程 - Gitee.com 1 初识pygame 1.1 简介 pygame是python中一个流行的GUI编程模块&#xff0c;是专门为了开发游…

Pygame教程(非常详细)

文章目录 教程特点阅读条件 Pygame是什么扩展知识 Pygame下载和安装1) pip包管理器安装2) 二进制安装包安装 第一个Pygame程序初始化程序创建Surface对象事件监听游戏循环 Pygame Display显示模块详解Pygame Surface创建图像Pygame Transform图像变形Pygame Time时间控制详解1)…

GeoWave0.9.8开发人员指南

GeoWave0.9.8开发人员指南 官方英文地址&#xff1a;http://s3.amazonaws.com/geowave/0.9.8/docs/devguide.html 介绍 什么是GeoWave GeoWave是一个开源库&#xff0c;用于在排序的键值数据存储和流行的大数据框架之上存储&#xff0c;索引和搜索多维数据。GeoWave包含特定的…

行人检测之DPM

基于可识别训练的部件模型的目标检测 Object Detection with Discriminatively Trained Part Based Models 摘要 基于多尺度可变形的部件模型我们来描述一个目标检测系统。我们的系统能够表示高度可变的对象类并在PASCAL目标检测挑战达到最先进的结果。虽然可变形部件模型变…

Xuxiang Qi--Deep Learning based Semantic Labelling of 3D Point Cloud in Visual SLAM

元学习论文总结||小样本学习论文总结 2017-2019年计算机视觉顶会文章收录 AAAI2017-2019 CVPR2017-2019 ECCV2018 ICCV2017-2019 ICLR2017-2019 NIPS2017-2019 提出了一种建立三维密集语义地图的方法&#xff0c;采用GPU&#xff0c;ROS消息通信无法支持。 摘要 三维(3D)点云…

古老的DPM

基于可识别训练的部件模型的目标检测 Object Detection with Discriminatively Trained Part Based Models 摘要 基于多尺度可变形的部件模型我们来描述一个目标检测系统。我们的系统能够表示高度可变的对象类并在PASCAL目标检测挑战达到最先进的结果。虽然可变形部件模型变得…

OpenCV-Python (官方)中文教程(部分一)

官网链接(英文版):https://docs.opencv.org/4.1.1/d6/d00/tutorial_py_root.html 第一章. OpenCV简介 了解如何在计算机上设置OpenCV-Python&#xff01; 1.OpenCV-Python教程简介 1.1 OpenCV OpenCV是由Gary Bradsky于1999年在Intel公司创建的&#xff0c;第一次发布是在…

【视觉SLAM十四讲】视觉里程计—特征点法

本文为视觉 SLAM 学习笔记&#xff0c;讲解视觉里程计中的特征点法。 本讲内容概要 图像特征的意义&#xff0c;在单幅及多幅图像中提取特征点。对极几何的原理&#xff0c;利用对极几何的约束恢复图像间相机的三维运动PnP 问题&#xff0c;利用已知三维结构与图像的对应关系…

【记录】一个深度学习算法工程师的成长之路( 思考和方法以及计划 )

原文链接:https://blog.csdn.net/TeFuirnever/article/details/100999282 声明&#xff1a; 1&#xff09;该文章整理自网上的大牛和机器学习专家无私奉献的资料&#xff0c;具体引用的资料请看参考文献。 2&#xff09;本文仅供学术交流&#xff0c;非商用。所以每一部分具体的…

面向动态环境基于面元的RGB-D SLAM系统

点击上方“3D视觉工坊”&#xff0c;选择“星标” 干货第一时间送达 作者&#xff1a;robot L https://zhuanlan.zhihu.com/p/142175916 本文仅做学术分享&#xff0c;如有侵权&#xff0c;请联系删除。 主要内容 面向动态环境基于面元的RGB-D SLAM系统&#xff0c;主要内容如下…

StaticFusion

主要内容 面向动态环境基于面元的RGB-D SLAM系统&#xff0c;主要内容如下&#xff1a; 同时估计RGB-D相机位姿并分割当前帧图片中的静态像素。将当前帧像素的静态概率当做一个取值范围为 的连续变量&#xff0c;和位姿一起联合优化。构建静态场景的面元地图。为此&#xff…

Caffe各层参数详解

在之前的文章中&#xff0c;整理了 ubuntu18安装和caffe-cpu安装问题汇总&#xff08;含详细流程&#xff09;&#xff0c;这篇文章则对caffe的各个层进行一个剖析。文章篇幅较长&#xff0c;可根据目录按层选择阅读。 简述 Net是由Layer层层组成的 Net是由Solver文件支配的…

CoppeliaSim用户手册中文翻译版(二)

CoppeliaSim 用户手册 文章目录 5. 计算模块5.1 计算模块属性对话框5.2 碰撞检测5.3 距离计算5.4 逆运动学5.4.1 IK组和IK元素的基础知识5.4.2 解决IK和FK的任何类型的机制 5.5 逆运动对话框5.5.1 IK元素对话框 5.6 动力学5.6.1 设计动态仿真5.6.2 一般动力学特性5.6.2.1 动态引…