在 Pygame 中實現基礎物理和碰撞檢測

在 Pygame 中實現基礎物理和碰撞檢測

Pygame 提供了幾個內置函數來檢測遊戲對象之間的碰撞。這些都是非常寶貴的,因為準確計算移動物體何時以及如何重疊可能是一項複雜的任務。

了解如何使用 pygame 模塊在遊戲中添加基本物理和碰撞。

Pygame 的內置碰撞檢測功能

最基本的內置碰撞檢測函數是 spritecollide。它接收一個精靈、一組精靈和一個布爾值,指示精靈在碰撞時是否應該“死亡”(被移除)。此函數返回發生碰撞的精靈列表。以下是如何使用它的示例:

collided_sprites = pygame.sprite.spritecollide(sprite1, sprite_group, True)

另一個有用的碰撞檢測函數是 groupcollide,它接受兩組精靈和一個布爾值。這個函數返回一個字典,其中碰撞的精靈作為鍵,它們碰撞的精靈作為值。以下是如何使用它的示例:

collision_dict = pygame.sprite.groupcollide(group1, group2, True, True)

使用 spritecollide 函數創建一個基本的平台遊戲

要使用 Pygame 創建一個基本的平台遊戲,您需要創建一個用戶可以控制的玩家精靈和一個供玩家站立的平台精靈。您可以使用 spritecollide 函數來檢測玩家精靈何時與平台精靈發生碰撞,並防止玩家從平台掉落。

首先,使用 pip 安裝 pygame 模塊:

pip install pygame

之後,為 Player 和 Platform 創建簡單的類,它們都應該繼承自 Pygame 的 Sprite 類。Player 類應該有一個更新方法來根據速度處理玩家的位置。此外,它應該有一個 y_velocity 變量來應用重力效果。Platform 類應該有一個 __init__ 方法,它獲取平台的坐標並創建一個具有該大小的表面。

玩家等級

您可以使用 pygame.sprite.Sprite 模塊創建一個 Player 類。此類將使用給定的 x 和 y 坐標初始化播放器。然後,update 方法將通過增加 y_velocity 值來更新玩家的位置。

import pygame

class Player(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = pygame.Surface((32, 32))
        self.rect = self.image.get_rect(topleft=(x, y))
        self.y_velocity = 0


    def update(self):
        self.rect.y += self.y_velocity

平台類

Platform 類還使用 pygame.sprite.Sprite 模塊。此類將使用給定的 x 和 y 坐標以及寬度和高度來初始化平台。

class Platform(pygame.sprite.Sprite):
    def __init__(self, x, y, width, height):
        super().__init__()
        self.image = pygame.Surface((width, height))
        self.rect = self.image.get_rect(topleft=(x, y))

遊戲循環

遊戲循環將允許您創建一個大小為 640×480 的窗口。然後,它將運行一個循環來檢查任何事件,例如退出命令。它還將檢查玩家和平台之間的任何碰撞。最後,它會用白色填充屏幕,繪製玩家和平台,然後翻轉顯示。

player = Player(100, 300)
player_group = pygame.sprite.Group()
player_group.add(player)

platform = Platform(50, 400, 100, 20)
platform_group = pygame.sprite.Group()
platform_group.add(platform)

# Initialize pygame and create window
pygame.init()
screen = pygame.display.set_mode((640, 480))

# Main game loop
running = True

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    player_group.update()
    collided = pygame.sprite.spritecollide(player, platform_group, False)

    if collided:
        player.y_velocity = 0
    screen.fill((255, 255, 255))
    player_group.draw(screen)
    platform_group.draw(screen)
    pygame.display.flip()

pygame.quit()

以下是輸出:

使用 pygame 的簡單平台遊戲

實現重力和跳躍行為

要在您的平台遊戲中實現重力和跳躍行為,您需要為您的玩家精靈添加 y 速度並更新其在每一幀中的 y 位置。為此,您可以使用 Player 類中的更新方法並添加以下代碼片段:

class Player(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = pygame.Surface((32, 32))
        self.rect = self.image.get_rect(topleft=(x, y))
        self.y_velocity = 0

    def update(self):
        self.rect.y += self.y_velocity
        self.y_velocity += GRAVITY # Apply gravity to y velocity

現在每次調用更新方法時,它都會根據玩家的速度和重力更新玩家的位置。

要讓玩家精靈跳躍,您可以將跳躍動作綁定到特定的鍵或按鈕,並使用負值更新玩家的 y 速度。以下代碼片段是玩家按下空格鍵時如何跳轉的示例。

JUMP_VELOCITY = -10

# inside the game loop
if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
    player.y_velocity = JUMP_VELOCITY

請注意,在檢查鍵值之前,您需要檢查 event.type 以確保該事件是 KEYDOWN 事件。

添加摩擦力和加速度等基礎物理

要為您的平台遊戲添加摩擦力和加速度等基本物理特性,您需要在每一幀中更新玩家精靈的 x 速度。您可以將 x 速度添加到播放器類並以與 y 速度相同的方式更新它。要實現摩擦,您可以在每一幀中少量降低玩家精靈的 x 速度。例如,您可以在 Player 類的更新方法中添加以下代碼片段:

FRICTION = 0.9

class Player(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = pygame.Surface((32, 32))
        self.rect = self.image.get_rect(topleft=(x, y))
        self.y_velocity = 0
        self.x_velocity = 0


    def update(self):
        self.rect.y += self.y_velocity
        self.rect.x += self.x_velocity
        self.y_velocity += GRAVITY # Apply gravity to y velocity
        self.x_velocity *= FRICTION # Apply friction to x velocity

要實現加速,可以為水平移動設置一個變量player_movement,並根據player_movement值更新player sprite的x速度。您可以通過將移動綁定到特定鍵或按鈕並在事件循環中更新玩家的 x 速度來實現此目的,例如:

ACCELERATION = 0.5
player_movement = 0

if event.type == pygame.KEYDOWN:
    if event.key == pygame.K_LEFT:
        player_movement = -1
    elif event.key == pygame.K_RIGHT:
        player_movement = 1
elif event.type == pygame.KEYUP:
    if event.key in (pygame.K_LEFT, pygame.K_RIGHT):
        player_movement = 0


player.x_velocity += player_movement * ACCELERATION

通過使用這些技術,您可以使用 Pygame 的內置碰撞檢測功能和基本物理學來創建一個簡單而有趣的平台遊戲。通過一點點創造力和實驗,您可以使用這些技術來創建各種不同的遊戲和遊戲機制。

您可以在 GitHub 存儲庫中找到完整的代碼。

以下是輸出:

具有重力和加速度的簡單平台遊戲

通過碰撞提高用戶參與度

許多遊戲需要某種形式的碰撞檢測。您可以使用碰撞來創建範圍廣泛的遊戲機制,從簡單的平台遊戲到復雜的基於物理的模擬。

實現重力、摩擦力和加速度等基本物理特性還可以極大地提高用戶參與度,為遊戲對象增加真實感和重量感。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *