Pygame での基本的な物理と衝突検出の実装

Pygame での基本的な物理と衝突検出の実装

Pygame には、ゲーム オブジェクト間の衝突を検出するための組み込み関数がいくつか用意されています。移動するオブジェクトがいつ、どのようにオーバーラップするかを正確に把握することは複雑な作業になる可能性があるため、これらは非常に貴重です。

pygame モジュールを使用してゲームに基本的な物理と衝突を追加する方法を学びます。

Pygame のビルトイン衝突検出関数

最も基本的な組み込み衝突検出関数は spritecollide です。スプライト、スプライトのグループ、および衝突時にスプライトが「死ぬ」(削除される)かどうかを示すブール値を受け取ります。この関数は、衝突したスプライトのリストを返します。使用方法の例を次に示します。

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

もう 1 つの便利な衝突検出関数は groupcollide です。これは、スプライトの 2 つのグループとブール値も受け取ります。この関数は、衝突したスプライトをキーとし、衝突したスプライトを値とする辞書を返します。使用方法の例を次に示します。

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

spritecollide 関数を使用した基本的なプラットフォーマー ゲームの作成

Pygame を使用して基本的なプラットフォーマー ゲームを作成するには、ユーザーが制御できるプレーヤー スプライトと、プレーヤーが立つプラットフォーム スプライトを作成する必要があります。spritecollide 関数を使用して、プレイヤー スプライトがプラットフォーム スプライトと衝突したことを検出し、プレイヤーがプラットフォームから落下するのを防ぐことができます。

まず、pip を使用して pygame モジュールをインストールします。

pip install pygame

その後、Player と Platform の単純なクラスを作成します。どちらも Pygame の Sprite クラスから継承する必要があります。Player クラスには、速度に基づいてプレーヤーの位置を処理する update メソッドが必要です。また、重力効果を適用するには、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 クラス内で update メソッドを使用し、次のコード スニペットを追加します。

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

update メソッドを呼び出すたびに、速度と重力に従ってプレーヤーの位置が更新されます。

プレーヤー スプライトをジャンプさせるには、ジャンプ アクションを特定のキーまたはボタンにバインドし、プレーヤーの 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 クラスの update メソッド内に追加できます。

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 の値に従ってプレーヤー スプライトの 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 リポジトリにあります。

以下は出力です。

重力と加速を伴うシンプルなプラットフォーマー ゲーム

衝突によるユーザー エンゲージメントの改善

多くのゲームでは、何らかの形式の衝突検出が必要です。コリジョンを使用して、単純なプラットフォーマーから複雑な物理ベースのシミュレーションまで、幅広いゲーム メカニクスを作成できます。

重力、摩擦、加速度などの基本的な物理を実装すると、ユーザー エンゲージメントが大幅に向上し、ゲーム オブジェクトにリアリズムと重量感が追加されます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です