一、引言
前面教程中我們學(xué)會(huì)讓方塊移動(dòng)和通過(guò)鍵盤(pán)來(lái)控制方塊的移動(dòng)。本節(jié)開(kāi)始我們來(lái)嘗試做個(gè)簡(jiǎn)單的游戲,從屏幕上方有個(gè)紅色的方塊往下掉落,在屏幕最下方有個(gè)藍(lán)色的方塊,我們可以有個(gè)a、d兩個(gè)鍵分別控制藍(lán)色方塊向左向右移動(dòng),游戲目的是紅色方塊出界前,用藍(lán)色方塊去撞擊紅色方塊,若接住了,則游戲成功,若接不住游戲失敗。(其實(shí)就像平時(shí)玩的接紅包之類的小游戲,用方塊來(lái)代替紅包、筐子等圖片)
二、實(shí)現(xiàn)思路
從前面教程中我們學(xué)習(xí)了方塊怎么自由移動(dòng)和用鍵盤(pán)來(lái)控制方塊的移動(dòng),大致的功能我們都可以實(shí)現(xiàn)出來(lái),唯一有難度的在于如何判斷紅色方塊和藍(lán)色方塊碰撞的問(wèn)題。這本質(zhì)上是如何判斷兩個(gè)矩形相交的問(wèn)題。雖然這問(wèn)題本身不復(fù)雜,但有些同學(xué)會(huì)覺(jué)得特別難判讀,我們來(lái)學(xué)習(xí)pygame為我們提供的函數(shù)來(lái)判斷兩個(gè)矩形是否相交。
pygame矩形碰撞的知識(shí)
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類有個(gè)colliderect方法,該方法接收另一個(gè)Rect對(duì)象,函數(shù)會(huì)判斷兩個(gè)矩形是否有相交部分(除了只有上下邊緣或者左右鄰邊相接的情況)。這個(gè)函數(shù)剛好解決我們需求。

最終代碼
我們只需按前面系列文章分別畫(huà)出兩個(gè)方塊,然后利用colliderect方法判斷是否碰撞到。
import pygame, sys
# 初始化
pygame.init()
SCREEN = pygame.display.set_mode((400, 300))
pygame.display.set_caption('Hello World!')
# 綠色方塊固定在最下方,左右移動(dòng),y值不變
green_x = 110
# 紅色方塊從上往下移動(dòng),x值不變
red_y = 0
# 游戲主循環(huán)
while True:
for event in pygame.event.get():
# 處理退出事件
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
# 鍵盤(pán)按下事件
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('紅色方塊與綠色方塊碰撞到了')
# 為了方便看到碰撞結(jié)果,直接break返回
break
SCREEN.fill((255, 255, 255))
# 調(diào)用 pygame.display.update() 方法更新整個(gè)屏幕的顯示
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)
三、練習(xí)題
- 紅色方塊改成寬30,高60,固定在x坐標(biāo)為200的線上。
- 去掉break語(yǔ)句,當(dāng)紅色方塊走出界面時(shí),增加打印游戲失敗。
- (難度較大)如果不用庫(kù)函數(shù),能否自己寫(xiě)個(gè)函數(shù)來(lái)判斷兩個(gè)方塊相交。