用pygame開(kāi)發(fā)自己的游戲-4.方塊碰撞

一、引言

前面教程中我們學(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ù)剛好解決我們需求。


pygame Rect碰撞函數(shù)例子.png

最終代碼

我們只需按前面系列文章分別畫(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í)題

  1. 紅色方塊改成寬30,高60,固定在x坐標(biāo)為200的線上。
  2. 去掉break語(yǔ)句,當(dāng)紅色方塊走出界面時(shí),增加打印游戲失敗。
  3. (難度較大)如果不用庫(kù)函數(shù),能否自己寫(xiě)個(gè)函數(shù)來(lái)判斷兩個(gè)方塊相交。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容