Pygame提供了几种不同的功能,用于在表面对象上绘制不同的形状。这些形状(例如矩形,圆形,椭圆形,线条或单个像素)通常称为绘图基元(drawing primitives)。
代码
# -*- coding:utf-8 -*-
import pygame, sys
from pygame.locals import*
pygame.init()
# set up the window
DISPLAYSURF = pygame.display.set_mode((500, 400))
pygame.display.set_caption('Drawing')
# set up the colors
BLACK = (0, 0, 0) # 这样做使代码更具可读性
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
# draw on the surface object
DISPLAYSURF.fill(WHITE)
pygame.draw.polygon(DISPLAYSURF, GREEN, ((146, 0), (291, 106), (236, 277), \
(56, 277), (0, 106)))
pygame.draw.line(DISPLAYSURF, BLUE, (60, 60), (120,60), 4)
pygame.draw.line(DISPLAYSURF, BLUE, (120, 60), (60, 120))
pygame.draw.line(DISPLAYSURF, BLUE, (60, 120), (120, 120), 4)
pygame.draw.circle(DISPLAYSURF, BLUE, (300, 50), 20, 0)
pygame.draw.ellipse(DISPLAYSURF, RED, (300, 250, 40, 80), 1)
pygame.draw.rect(DISPLAYSURF, RED, (200, 150, 100, 50))
pixObj = pygame.PixelArray(DISPLAYSURF)
pixObj[480][380] = BLACK
pixObj[482][382] = BLACK
pixObj[484][384] = BLACK
pixObj[486][386] = BLACK
pixObj[488][388] = BLACK
del pixObj
# run the game loop
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
pygame.display.update()
结果
下面解释代码
1、fill(color)
- fill() 方法不是函数,而是pygame.Surface
对象的方法。它将使用的颜色填充整个Surface对象。
2、pygame.draw.polygon(surface, color, pointlist, width)
– 多边形是仅由平面构成的形状。在surface和颜color参数告诉在什么表面绘制多边形的功能,绘出什么颜色。
所述pointlist
参数是一个元组或点的列表(即,元组或两个整数元组为XY坐标的列表)。通过在每个点和元组中后面的点之间绘制线来绘制多边形。然后从最后一个点到第一个点绘制一条线。还可以传递点数列表。
宽度参数是可选的。如果将其遗漏,将填充绘制的多边形,就像屏幕上的绿色多边形用颜色填充一样。如果为width参数传递整数值,则仅绘制多边形的轮廓。整数表示多边形轮廓的宽度。为width 参数传递1将产生一个瘦多边形,而传递4 或10或20将产生更厚的多边形。如果为width参数传递整数0,则将填充多边形(就像离开宽度一样) 完全参数)。
所有pygame.draw绘图函数最后都有可选的宽度参数,它们的工作方式与pygame.draw.polygon()
的width 参数相同。宽度 参数的更好名称可能是厚度,因为该参数控制绘制线条的粗细度。
3、pygame.draw.line(surface, color, start_point, end_point, width)
- 此函数在start_point 和end_point参数之间绘制一条线。
4、pygame.draw.lines(surface, color, closed, pointlist, width)
- 这个函数从一个点到下一个点绘制一系列的线,就像pygame.draw.polygon()
一样。唯一的区别是,如果为关闭的参数传递False,则不会有从pointlist参数的最后一个点到第一个点的一条线。如果传递True,则会从最后一个点到第一个点绘制一条线。
5、pygame.draw.circle(surface, color, center_point, radius, width)
- 此函数绘制一个圆。圆的中心位于center_point参数处。为radius参数传递的整数设置圆的大小。
圆的半径是从中心到边缘的距离。(圆的半径始终是直径的一半。)为半径参数传递20将绘制一个半径为20像素的圆。
6、pygame.draw.ellipse(surface, color, bounding_rectangle, width)
- 此函数绘制一个椭圆(类似于压扁或拉伸的圆圈)。此函数具有所有常用参数,但为了告诉函数绘制椭圆的大小和位置,必须指定椭圆的边界矩形。边界矩形 是可以围绕形状中绘制的最小矩形。
所述bounding_rectangle参数可以是一个pygame.Rect 对象或四个整数的元组。请注意,您没有像对pygame.draw.circle()
函数那样指定椭圆的中心点。
7、pygame.draw.rect(surface, color, rectangle_tuple, width)
- 此函数绘制一个矩形。所述rectangle_tuple 是任一的四个整数的元组(对于XY坐标的左上角,而宽度和高度)或pygame.Rect 对象可以被替代。如果rectangle_tuple 具有相同的宽度和高度大小,则将绘制一个正方形。
pygame.PixelArray Objects
没有一个函数你可以调用它将一个像素设置为一个颜色(除非你 用相同的起点和终点调用pygame.draw.line()
)。Pygame框架需要在绘制到Surface对象之前和之后运行一些代码。如果必须为您想要设置的每个像素执行此操作,则程序运行速度会慢得多。(通过我的快速测试,以这种方式绘制像素要慢两到三倍。)
相反,应该创建一个Surface 对象的pygame.PixelArray
对象(我们将其简称为PixelArray对象),然后设置单个像素。创建Surface对象的PixelArray对象将“锁定”Surface对象。当Surface对象被锁定时,仍然可以在其上调用绘图函数,但是它不能使用blit()
方法在其上绘制PNG或JPG图像等图像。(blit()
方法将在本章后面解释。)
如果要查看Surface对象是否已锁定,则get_locked()
Surface方法将在锁定时返回True,否则返回False 。
从pygame.PixelArray()
返回的PixelArray对象可以通过使用两个索引访问它们来设置单个像素。例如,代码中pixObj [480] [380] = BLACK
将X坐标480和Y坐标380的像素设置为黑色(记住BLACK变量存储颜色元组(0,0,0))。
要告诉Pygame您已完成绘制单个像素,请使用del语句删除PixelArray对象。删除PixelArray对象将“解锁”Surface对象,以便您可以再次在其上绘制图像。如果您忘记删除PixelArray对象,则下次尝试将图像blit(即绘制)到Surface时,程序将引发一个错误,指出“·pygame.error: Surfaces must not be locked during blit
”。
The pygame.display.update() Function
完成调用绘图函数以使显示Surface对象看起来像你想要的方式后,你必须调用pygame.display.update()
使显示Surface实际出现在屏幕上。
你必须记住的一件事是pygame.display.update()
只会使显示Surface(即从调用pygame.display.set_mode()
调用返回的Surface对象)出现在屏幕上。如果希望其他Surface对象上的图像出现在屏幕上,则必须使用blit()
方法将它们“blit”(即复制它们)到显示Surface对象( “绘图图像”中将对此进行说明)部分)。