iT邦幫忙

2024 iThome 鐵人賽

DAY 26
0

今天來做碰撞檢測

    if ball_x <= 0 or ball_x >= screen_width - ball_radius:
        ball_speed_x = -ball_speed_x
    if ball_y <= 0:
        ball_speed_y = -ball_speed_y
    if ball_y >= screen_height:
        running = False

    paddle_rect = pygame.Rect(paddle_x, paddle_y, paddle_width, paddle_height)
    if paddle_rect.collidepoint(ball_x, ball_y):
        ball_speed_y = -ball_speed_y

    for brick in bricks:
        if brick.collidepoint(ball_x, ball_y):
            bricks.remove(brick)
            ball_speed_y = -ball_speed_y
            break

碰撞檢測邏輯分析

  • 牆壁碰撞檢測:
    當球的 x 座標 (ball_x) 小於等於 0(左邊牆壁)或大於等於螢幕寬度減去球的半徑(右邊牆壁)時,表示球已經撞到左右牆壁,此時需要改變球的 x 軸速度方向 (ball_speed_x),這樣球才會反彈回來。利用 ball_speed_x = -ball_speed_x 這樣的程式碼,就可以讓球的水平移動方向改變。

  • 球掉出底部的檢測:
    當球的 y 座標超過視窗高度(ball_y >= screen_height)時,表示球已經掉到視窗外的底部。將 running 變數設為 False,從而結束主迴圈,停止遊戲。

  • 擋板碰撞檢測:
    首先使用 pygame.Rect 建立擋板的位置和大小(透過擋板的 x、y 座標以及寬度和高度)。接著使用 paddle_rect.collidepoint(ball_x, ball_y) 檢查球是否撞到擋板。如果碰撞到,則改變球的 y 軸速度方向 (ball_speed_y) 來讓球反彈。

  • 磚塊碰撞檢測:
    使用 for 迴圈來是指沿着某條路線,依次對每個磚塊做一次且僅做一次碰撞。 bricks 列表中的所有磚塊,每個磚塊透過 brick.collidepoint(ball_x, ball_y) 來確認球是否撞到它。如果撞到磚塊,則將該磚塊從列表中移除(bricks.remove(brick)),同時改變球的 y 軸速度方向,讓球進行反彈。break 語句用來確保每次碰撞只處理一個磚塊,避免重複檢測或出現邏輯錯誤。

這段程式碼雖然看起來簡單,但卻包含了很多基本概念。透過改變速度方向來模擬物體的反彈效果,是碰撞檢測中最常見的處理方式,這是網路上學到的。當球掉到螢幕底部時,如果沒有適當處理,球會繼續在視窗外部移動,遊戲也不會自動停止,這跟擋板一樣道理就是不能超出邊框。

那今天就先這樣。/images/emoticon/emoticon29.gif


上一篇
玩家輸入與球的位置更新
系列文
從Python入門到自製遊戲:30天鐵人挑戰之旅26
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言