一呛梆、引言
前面教程中我們學(xué)會讓方塊移動和通過鍵盤來控制方塊的移動衩椒。本節(jié)開始我們來嘗試做個簡單的游戲尤误,從屏幕上方有個紅色的方塊往下掉落楚殿,在屏幕最下方有個藍(lán)色的方塊撮慨,我們可以有個a、d兩個鍵分別控制藍(lán)色方塊向左向右移動,游戲目的是紅色方塊出界前砌溺,用藍(lán)色方塊去撞擊紅色方塊影涉,若接住了,則游戲成功规伐,若接不住游戲失敗蟹倾。(其實就像平時玩的接紅包之類的小游戲,用方塊來代替紅包楷力、筐子等圖片)
二喊式、實現(xiàn)思路
從前面教程中我們學(xué)習(xí)了方塊怎么自由移動和用鍵盤來控制方塊的移動,大致的功能我們都可以實現(xiàn)出來萧朝,唯一有難度的在于如何判斷紅色方塊和藍(lán)色方塊碰撞的問題岔留。這本質(zhì)上是如何判斷兩個矩形相交的問題。雖然這問題本身不復(fù)雜检柬,但有些同學(xué)會覺得特別難判讀献联,我們來學(xué)習(xí)pygame為我們提供的函數(shù)來判斷兩個矩形是否相交。
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對象里逆,函數(shù)會判斷兩個矩形是否有相交部分(除了只有上下邊緣或者左右鄰邊相接的情況)。這個函數(shù)剛好解決我們需求用爪。
最終代碼
我們只需按前面系列文章分別畫出兩個方塊原押,然后利用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
# 游戲主循環(huán)
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('紅色方塊與綠色方塊碰撞到了')
# 為了方便看到碰撞結(jié)果颇玷,直接break返回
break
SCREEN.fill((255, 255, 255))
# 調(diào)用 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)
三笨农、練習(xí)題
- 紅色方塊改成寬30,高60帖渠,固定在x坐標(biāo)為200的線上谒亦。
- 去掉break語句,當(dāng)紅色方塊走出界面時空郊,增加打印游戲失敗份招。
- (難度較大)如果不用庫函數(shù),能否自己寫個函數(shù)來判斷兩個方塊相交狞甚。