一、引言
前面教程中我们学会让方块移动和通过键盘来控制方块的移动。本节开始我们来尝试做个简单的游戏,从屏幕上方有个红色的方块往下掉落,在屏幕最下方有个蓝色的方块,我们可以有个a、d两个键分别控制蓝色方块向左向右移动,游戏目的是红色方块出界前,用蓝色方块去撞击红色方块,若接住了,则游戏成功,若接不住游戏失败。(其实就像平时玩的接红包之类的小游戏,用方块来代替红包、筐子等图片)
二、实现思路
从前面教程中我们学习了方块怎么自由移动和用键盘来控制方块的移动,大致的功能我们都可以实现出来,唯一有难度的在于如何判断红色方块和蓝色方块碰撞的问题。这本质上是如何判断两个矩形相交的问题。虽然这问题本身不复杂,但有些同学会觉得特别难判读,我们来学习pygame为我们提供的函数来判断两个矩形是否相交。
pygame矩形碰撞的知识
colliderect()
test if two rectangles overlap
colliderect(Rect) -> bool
Returns true if any portion of either rectangle overlap (except the top+bottom or left+right edges).
Rect类有个colliderect方法,该方法接收另一个Rect对象,函数会判断两个矩形是否有相交部分(除了只有上下边缘或者左右邻边相接的情况)。这个函数刚好解决我们需求。
最终代码
我们只需按前面系列文章分别画出两个方块,然后利用colliderect方法判断是否碰撞到。
import pygame, sys
# 初始化
pygame.init()
SCREEN = pygame.display.set_mode((400, 300))
pygame.display.set_caption('Hello World!')
# 绿色方块固定在最下方,左右移动,y值不变
green_x = 110
# 红色方块从上往下移动,x值不变
red_y = 0
# 游戏主循环
while True:
for event in pygame.event.get():
# 处理退出事件
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
# 键盘按下事件
elif event.type == pygame.KEYDOWN:
# 'a'键被按下
if event.key == pygame.K_a:
green_x -= 5
elif event.key == pygame.K_d:
green_x += 5
red_y += 5
green_rect = pygame.Rect(green_x, 250, 100, 50)
if green_rect.colliderect(85, red_y, 20, 50):
print('红色方块与绿色方块碰撞到了')
# 为了方便看到碰撞结果,直接break返回
break
SCREEN.fill((255, 255, 255))
# 调用 pygame.display.update() 方法更新整个屏幕的显示
pygame.draw.rect(SCREEN, (255, 0, 0), (85, red_y, 20, 50))
pygame.draw.rect(SCREEN, (0, 255, 0), (green_x, 250, 100, 50))
pygame.display.update()
pygame.time.delay(50)
三、练习题
- 红色方块改成宽30,高60,固定在x坐标为200的线上。
- 去掉break语句,当红色方块走出界面时,增加打印游戏失败。
- (难度较大)如果不用库函数,能否自己写个函数来判断两个方块相交。