本章,将介绍 Pygame 中的重要概念及对象。
文章目录
- 像素坐标
- Rect 对象
- Color 对象
- Surface 对象
- 实例:矩形生成器
- 创建初始窗口
- 创建生成矩形的函数
- 调用函数
- 完整代码
- 结语
像素坐标
Pygame 所创建的窗口,其实只是屏幕上的像素(pixel)组合而成的。最开始每个像素都是黑色的,但是可以在渲染过程中设置为不同的颜色。
大多数游戏框架,包括 Pygame,使用平面直角坐标系来表示特定的坐标。而在 Pygame 中,左上角的像素坐标记作 (0, 0),向右x坐标递增,向下y坐标递增,反之亦然。
Rect 对象
Pygame 中会经常用到pygame.Rect
对象,它用于存储矩形坐标。在构造函数中,通常需要传入矩形的x坐标、y坐标、长和宽。
大多数以Rect
对象作为参数的 Pygame 函数,都支持用其他的方式来表示矩形坐标。如pygame.Rect(10, 10, 20, 30)
也可以用元组表示为(10, 10, 20, 30)
,((10, 10), (20, 30))
等。
Pygame 为Rect
对象定义了很多属性及方法,在此不做赘述,请参见官方文档。
Color 对象
在 Pygame 中,使用 R(red) G(green) B(blue) 模式表示颜色,其中每个值都在 0~255 的范围内,特别地,当需要指定透明值 A(alpha) 时,使用 RGBA 表示颜色。在 RGB 模式下,(0, 0, 0) 表示黑色,(255, 255, 255) 表示白色。
Pygame 定义了pygame.Color
对象。与pygame.Rect
类似,pygame.Color
也可以表示为三元(RGB)或四元(RGBA)元组。详见官方文档。
Surface 对象
Pygame 中另一个常用的对象就是pygame.Surface
对象,用于表示图像。可以在构造函数中传入一个元组以指定图像的大小。
Pygame 中很多 2D 元素都是Surface
对象,如渲染的文本、加载的图片、Pygame 精灵等。
值得一提的是,其实显示屏幕,即pygame.display.set_mode
返回的也是Surface
对象。这意味着,你可以像操作普通的图像一样操作显示屏幕,例如绘制图形、填充等。而之所以 Pygame 的显示屏幕默认是黑色的,也是因为pygame.Surface
对象会默认将背景填充为黑色。
pygame.Surface
对象也定义了许多的方法以操作图像,常用的方法如下表所示:
方法定义 | 方法作用 |
| 返回此图像的大小。 |
| 返回此图像对应的矩形对象。未传入参数时,该矩形以 |
| 返回此图像的副本。 |
| 为图像填充一个颜色,返回受影响的区域的矩形坐标。如果传入 |
| 将指定的图像绘制到此图像上,返回受影响的区域的矩形坐标。 |
实例:矩形生成器
为使读者能够更加透彻地了解上述知识,我们将创建一个随机生成矩形的程序。
请创建一个新的文件,命名为rect_generator.py
。
创建初始窗口
像上一章一样创建初始窗口,代码如下:
import random
import sys
import pygame
pygame.init()
SCREEN = pygame.display.set_mode((600, 600))
pygame.display.set_caption('Rect Generator')
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
pygame.display.update()
与之前不同的是,我们导入了random
库,该模块可用于生成随机数。
创建生成矩形的函数
添加生成矩形的函数,代码如下:
def generate():
left = random.randint(0, 400)
top = random.randint(0, 400)
width = random.randint(0, 200)
height = random.randint(0, 200)
color = (random.randint(0, 255), random.randint(0, 255),
random.randint(0, 255))
surf = pygame.Surface((width, height))
surf.fill(color)
SCREEN.blit(surf, (left, top))
上述代码中:
- 把
left
和top
限制在 0~400 之间,把width
和height
限制在 0~200 之间,这样可以防止矩形超出窗口。 - 用
random.randint(0, 255)
为 RGB 每个值创建一个随机数,以生成一个随机的颜色。 - 创建了一个指定大小的
pygame.Surface
对象,填充为指定的颜色。 - 将
surf
绘制到显示屏幕上,把位置设置为(left, top)
。
调用函数
在游戏循环中调用生成矩形的函数,代码如下:
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
# SCREEN.fill((0, 0, 0))
generate() # 调用生成矩形的函数
pygame.display.update()
上述代码,并没有在调用generate
函数之前调用fill
函数,如果调用了,则每一次循环都会以指定颜色填充屏幕,此时运行效果为矩形在窗口上跳动,而非一个个矩形叠加在窗口上,读者可以自行尝试。
完整代码
import random
import sys
import pygame
pygame.init()
SCREEN = pygame.display.set_mode((600, 600))
pygame.display.set_caption('Rect Generator')
def generate():
left = random.randint(0, 400)
top = random.randint(0, 400)
width = random.randint(0, 200)
height = random.randint(0, 200)
color = (random.randint(0, 255), random.randint(0, 255),
random.randint(0, 255))
surf = pygame.Surface((width, height))
surf.fill(color)
SCREEN.blit(surf, (left, top))
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
# SCREEN.fill((0, 0, 0))
generate()
pygame.display.update()
代码运行截图:
结语
以上,就是本章的内容