根据动画的原理,如果要让一个小方格移动起来,就是让背景网格中的小方格按照运动规律以此呈现出来即可。按照这个思路,我们组织本章节的内容。
1、构建保存小方格 Rect 对象的矩阵
按照上一节的定义,我们将游戏区域分解成了 N 个小方格大小的网格,其实就是一个保存有各个小方格左上角坐标的矩阵(或曰二维数组)。
那么根据 Rect 类的特性,为了优化代码,我们将二维数组内保存的小方格左上角坐标,改为保存各个小方格的 Rect 对象。
def matrix():
''' 功能:以游戏区域为基础,画出用于呈现小方格的 Rect 对象的矩阵。
'''
# 下面一行列表推导的代码用于构造小方格的 Rect 对象的二维列表
box_coordinate_list = [[pygame.Rect((coordinate[0] + x*edge + 2),
(coordinate[1] + y*edge + 2), edge, edge)
for x in range(box_col)] for y in range(box_row)]
return box_coordinate_list
上面的代码就是将列表推导中的 ((coordinate[0] + x*edge + 2), (coordinate[1] + y*edge + 2))
内容修改为 pygame.Rect((coordinate[0] + x*edge + 2), (coordinate[1] + y*edge + 2), edge, edge)
,按照 pygame.Rect
类的语法结构,加上小方格的边长。
同时,我们将背景中的网格进行了隐藏处理,相关代码也进行了精简。
2、修改小方格的呈现方法
为了能够适应游戏区域的矩阵所保存的对象,我们需要修改一下 box
函数,将原来的参数由坐标改为 Rect 对象。
def box(rect:"该参数为一个pygame.Rect对象"):
''' 功能:画出用于组成图形的单个正方形
'''
pygame.Surface.fill(screen, yellow, rect) # 填充方格内的颜色
pygame.draw.rect(screen, white, rect, 1) # 画出方格的线条
return rect
3、让小方格动起来
为了能让事件驱动小方格,我使用向左键和向右键两个键来控制小方格的左右移动。我们可以在主函数中修改为如下代码:
if __name__ == "__main__":
pygame.init() # 使用 pygame 之前先进行初始化
screen = pygame.display.set_mode((s_width, s_height), pygame.RESIZABLE, 32)
pygame.display.set_caption("俄罗斯方块") # 设置窗体名称
m = matrix() # 矩阵在主函数中调用一次即可,没有必要放到 while 循环中。
row, col = inital_pos # 小方格的初始化位置,inital_pos 需要定义一个全局变量。
while True:
pygame.time.delay(100) # 设置动作的延迟时间为 100 毫秒
screen.fill(bgcolor) # 表示填充背景颜色。
for event in pygame.event.get():
if event.type == pygame.QUIT: # 检测退出动作
exit()
area()
keys = pygame.key.get_pressed() # 检测键盘动作
if keys[pygame.K_LEFT]: # 使用向左键来控制小方格向左移动
if col > 0:
col -= 1
if keys[pygame.K_RIGHT]: # 使用向左键来控制小方格向右移动
if col < box_col-1:
col += 1
box(m[row][col]) # 将小方格的呈现放到键盘的控制之后,可以及时接受到变量。
pygame.display.update()
动图演示如下:
如果想让小方格自动向下,那么只需要在 while
循环的内部,最好是在 box(m[row][col])
这行代码之上加入这一行代码:
row += 1
该行代码的功能就是在每个循环中让 row 加一,也就是选择当前小方格下一行的方格。