下落的方块
本课属于 Coddy Pygame 学习旅程的“游戏循环”单元。第 27 课,共 35 课。
下落的物体,每一帧的 y 值都会增大。也把方块设为 Rect,并在循环的每次迭代中增加它的 y 值:
block = pygame.Rect(220, 0, 20, 20)
while running:
# 事件和按键
block.y += 3
# 填充、绘制每秒 60 帧时,每帧移动 3 像素,相当于每秒移动 180 像素。窗口高 360 像素,所以方块需要两秒才能落到底部。
这个游戏像 Move a Square 一样按帧移动,而不是按 dt 移动。Rect 只保存整数,因此像每次移动 0.6 像素这样的步长会被截断为 0,Rect 就永远不会移动。按时间移动 Rect 的游戏会将位置保存在 Vector2 中,再复制到 Rect。
方块离开窗口后仍会继续下落。目前还没有任何机制能让它停下来;下一课会让它返回。
挑战
简单让一个方块从顶部落下。
- 在篮子下方,创建
block = pygame.Rect(220, 0, 20, 20)。 - 在循环中,篮子移动后,将
block.y增加 3。 - 在篮子之后,用红色
(235, 80, 80)绘制方块。
按“开始”:一个红色方块会从顶部落下。然后点击“检查”。
亲手试试
import pygame
pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Catch the Blocks")
clock = pygame.time.Clock()
basket = pygame.Rect(200, 330, 80, 16)
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
basket.x -= 8
if keys[pygame.K_RIGHT]:
basket.x += 8
basket.clamp_ip(screen.get_rect())
screen.fill((30, 30, 46))
pygame.draw.rect(screen, (80, 160, 255), basket)
pygame.display.flip()
clock.tick(60)
pygame.quit()
游戏循环中的所有课
自己练习: Pygame 在线编辑器