Python Pygame绘图函数

和海龟绘图一样,Pygame 也有各种绘制形状的函数。这些形状包括矩形、圆形、椭圆形、线条或单个的像素,通常都称为绘制图元。在本节教程中,我们来学习一些常用的绘图函数

pygame.draw.line() 函数

先来看绘制线段的函数 pygame.draw.line(),它有 5 个参数,分别是:
  • 待显示的 surface 对象;
  • 画笔的颜色;
  • 起始位置坐标;
  • 结束位置坐标;
  • 线条粗细。

结合前面介绍过的内容,我们来编写一个简单的程序,用 3 条直线,组成一个字母H。
  • 首先,创建了一个 Pygame 的程序窗口;
  • 然后创建了 3 个变量来保存颜色的元组,用到的 3 种颜色分别是黑色、白色和红色;
  • 接下来用白色填充所创建的 Surface 对象,也就是将窗口的背景颜色设置为白色,详情参见下面的“提示”部分;
  • 接着,在这个 Surface 对象上绘制了 3 条不同颜色的直线,直线的宽度都是 2 个像素,并且调用 pygame.display.update() 函数,把 Surface 对象上的内容全部显示到窗口上;
  • 最后通过事件循环,监控用户动作。当点击关闭按钮时,关闭窗口。

提示:我们用大写字母来定义这3个颜色变量——BLACK、WHITE和RED,是为了说明这3个变量的内容是不会轻易改变的,这是一种约定俗成的方式。

完整代码如下。
import pygame

# 创建 pygame
pygame.init()

# 创建窗口
windowSurface=pygame.display.set_mode([500,400])

# 创建颜色变量
BLACK=(0,0,0)
WHITE=(255,255,255)
RED=(255,0,0)
GREEN=(0,255,0)
BLUE=(0,0,255)

# 用白色填充Surface对象
windowSurface.fill(WHITE)

# 在surface对象上绘制线段
pygame.draw.line(windowSurface, BLACK, (60, 60), (60, 120), 2)
pygame.draw.line(windowSurface, RED, (60, 90), (90, 90),2)
pygame.draw.line(windowSurface, BLACK, (90, 60), (90, 120), 2)

# 将surface对象的内容显示到窗口上
pygame.display.update()

# 运行事件循环
Running=True
while Running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            Running =False
pygame.quit()

运行这段代码,我们可以看到一个 Pygame 的窗口,上面有 3 条直线,组成了一个字母H,如图 1 所示。

python pygame绘制字母H
图 1

对这个程序来说,我们想要用白色来填充存储在 windowSurface 变量中的整个 Surface 对象。fill() 函数将会使用传递给参数的颜色来填充整个 Surface 对象。

在 pygame 中,当调用 fill() 方法或其他任何绘制函数时,屏幕上的窗口都不会改变。相反,这些函数将会改变 Surface 对象,但是在调用 pygame.display.update() 函数之前,并不会把新的 Surface 对象绘制到屏幕上。

这是因为,在计算机内存中修改 Surface 对象要比在屏幕上修改图像更快。当所有绘制函数完成了对 Surface 对象的绘制之后,再在屏幕上绘制,这种做法要高效很多。

pygame.draw.rect() 函数

pygame.draw.rect() 是一个绘制矩形的函数,它有 4 个参数,分别是:
  • 待显示的 Surface 对象;
  • 画笔的颜色;
  • 4 个整数的一个元组(分别表示左上角的 X 坐标和 Y 坐标,以及宽度和高度);
  • 线条粗细,如果是 0,表示矩形是填充的。

如果用这个函数绘制一个红色边框的矩形,代码如下。
import pygame

# 创建 pygame
pygame.init()

# 创建窗口
windowSurface=pygame.display.set_mode([500,400])

# 创建颜色变量
BLACK=(0,0,0)
WHITE=(255,255,255)
RED=(255,0,0)
GREEN=(0,255,0)
BLUE=(0,0,255)

# 用白色填充Surface对象
windowSurface.fill(WHITE)

#绘制一个红色边框的矩形
pygame.draw.rect(windowSurface, RED, (60,200, 200, 100),1)

# 将surface对象的内容显示到窗口上
pygame.display.update()

# 运行事件循环
Running=True
while Running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            Running =False
pygame.quit()

可以看到,调用 pygame.draw.rect() 函数方式和调用 pygame.draw.line() 函数的方式类似,绘制的图形如图 2 所示。

python pygame绘制红色边框
图 2

pygame.draw.circle() 函数

pygame.draw.circle() 是一个绘制圆形的函数,它有 5 个参数,分别是:
  • 待显示的 Surface 对象;
  • 画笔的颜色;
  • 要绘制的圆的圆心坐标;
  • 要绘制的圆的半径;
  • 线条粗细,如果是 0,表示圆形是填充的。

如果用这个函数绘制半径为20的黑色实心的圆,代码如下:
import pygame

# 创建 pygame
pygame.init()

# 创建窗口
windowSurface=pygame.display.set_mode([500,400])

# 创建颜色变量
BLACK=(0,0,0)
WHITE=(255,255,255)
RED=(255,0,0)
GREEN=(0,255,0)
BLUE=(0,0,255)

# 用白色填充Surface对象
windowSurface.fill(WHITE)

#绘制半径为20的黑色实心的圆
pygame.draw.circle(windowSurface, BLACK, (350, 75), 40, 0)

# 将surface对象的内容显示到窗口上
pygame.display.update()

# 运行事件循环
Running=True
while Running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            Running =False
pygame.quit()

绘制的图形如图 3 所示。

python pygame绘制红色原型
图 3

pygame.draw.polygon() 函数

pygame.draw.polygon() 是一个绘制多边形函数,它有 4 个参数,分别是:
  • 待显示的Surface对象;
  • 画笔的颜色;
  • 坐标列表,多边形的多条边是通过在每个坐标点以及其后续的坐标点之间依次绘制线条,然后,从最后的点到第一个点绘制线条而形成的;
  • 线条粗细,如果是 0 或者不填写,表示多边形是填充的。

如果用这个函数绘制一个绿色填充五边形,代码如下:
import pygame

# 创建 pygame
pygame.init()

# 创建窗口
windowSurface=pygame.display.set_mode([500,400])

# 创建颜色变量
BLACK=(0,0,0)
WHITE=(255,255,255)
RED=(255,0,0)
GREEN=(0,255,0)
BLUE=(0,0,255)

# 用白色填充Surface对象
windowSurface.fill(WHITE)

#绘制一个绿色填充五边形
pygame.draw.polygon(windowSurface, GREEN, ((300, 100), (445, 206),(391, 377), (210, 377), (154, 206)))

# 将surface对象的内容显示到窗口上
pygame.display.update()

# 运行事件循环
Running=True
while Running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            Running =False
pygame.quit()

绘制的图形如图 4 所示。

python pygame绘制多边形
图 4

pygame.draw.ellipse() 函数

pygame.draw.ellipse() 函数绘制了一个椭圆形,它有 4 个参数,分别是:
  • 待显示的 Surface 对象;
  • 画笔的颜色;
  • 边界矩形(bounding rectangle),就是围绕这一个形状所能绘制的最小的矩形,参数可以是一个 pygame.Rect 对象或者是 4 个整数的一个元组;
  • 线条粗细。

如果用这个函数绘制一个蓝色的椭圆形,代码如下
import pygame

# 创建 pygame
pygame.init()

# 创建窗口
windowSurface=pygame.display.set_mode([500,400])

# 创建颜色变量
BLACK=(0,0,0)
WHITE=(255,255,255)
RED=(255,0,0)
GREEN=(0,255,0)
BLUE=(0,0,255)

# 用白色填充Surface对象
windowSurface.fill(WHITE)

#制一个蓝色的椭圆形
pygame.draw.ellipse(windowSurface, BLUE, (300, 250, 40, 80), 1)

# 将surface对象的内容显示到窗口上
pygame.display.update()

# 运行事件循环
Running=True
while Running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            Running =False
pygame.quit()

绘制的图形如图 5 所示。
python pygame绘制椭圆形
图 5

我们把这些绘图函数放到一起,来看一下绘制效果,代码如下。
#导入pygame模块
import pygame
# 创建 pygame
pygame.init()
# 创建窗口
windowSurface=pygame.display.set_mode((500,400))
# 创建颜色常量
BLACK=(0,0,0)
WHITE=(255,255,255)
RED=(255,0,0)
GREEN=(0,255,0)
BLUE=(0,0,255)
# 用白色填充Surface对象
windowSurface.fill(WHITE)
# 在Surface对象上绘制线段
pygame.draw.line(windowSurface, BLACK, (60, 60), (60, 120), 2)
pygame.draw.line(windowSurface, RED, (60, 90), (90, 90),2)
pygame.draw.line(windowSurface, BLACK, (90, 60), (90, 120), 2)
# 在Surface对象上绘制圆
pygame.draw.circle(windowSurface, BLACK, (350, 75), 40, 0)
# 在Surface对象上绘制多边形
pygame.draw.polygon(windowSurface, RED, ((300, 100), (445, 206),(391, 377), (210, 377), (154, 206)))
# 在Surface对象上绘制矩形
pygame.draw.rect(windowSurface, RED, (60,200, 200, 100),1)
# 在Surface对象上绘制椭圆
pygame.draw.ellipse(windowSurface, BLACK, (300, 250, 40, 80), 1)
# 将Surface对象的内容显示到窗口上
pygame.display.update()
# 游戏循环
Running=True
while Running:
    # 事件循环
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            Running=False
pygame.quit()

运行代码,结果如图 6 所示。


图 6