0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Pygameを使って RPGを作る(5. 衝突判定)

Last updated at Posted at 2024-12-31

概要

本記事はキャラクターとブロックの衝突判定を行う

使い方の例

colliderect()
rect1とrect2の衝突判定
rect1.colliderect(rect2) -> bool

Block準備

衝突用Blockクラスを用意する

class Block:
    def __init__(self, pos, id):
        # イメージの読み込み
        self.surface = pg.image.load(BLOCK_PATH).convert()
        # 位置
        self.pos = pos
        # rect
        self.rect = self.surface.get_frect(center=pos)
        # 識別用id
        self.id = id

衝突判定メソッドの実装(Blockクラスに実装)

def collision(self, target_rect):
    if self.rect.colliderect(target_rect):
        print(f'Block ID:{self.id}とplayerと衝突しました。')

main.py

import pygame as pg
from settings import *

from player import Player
from wall import Block

class game:
    def __init__(self):
        pg.init()

        # screen
        self.display_surface = pg.display.set_mode((WIDTH, HEIGHT))
        # title
        pg.display.set_caption(TITLE)
        # clock
        self.clock = pg.time.Clock()
        self.running = True

        # Playerクラスのインスタンス宣言
        self.player = Player([250,100])

        # Blockリスト
        self.block_list = []
        for i in range(1,5):
            self.block = Block((i * 200, 100),i)
            self.block_list.append(self.block)

    def run(self):
        """ゲームループ"""
        dt = self.clock.tick(FPS) / 1000

        while self.running:
            # イベント処理
            for event in pg.event.get():
                if event.type == pg.QUIT:
                    self.running = False

            # draw
            self.display_surface.fill(BLUE)

            # 衝突用ブロック
            for block in self.block_list:
                self.display_surface.blit(block.surface, block.rect)
                block.collision(self.player.rect)
            # playerの表示    
            self.display_surface.blit(self.player.surface,self.player.rect)

            # キーボードイベントリスナー
            self.player.input_with_rect(dt)
            
            pg.display.update()

        pg.quit()

if __name__ == "__main__":
    new_game = game()
    new_game.run()

image.png

Block ID:2とplayerと衝突しました。

上記の実装だとBlockとの衝突判定はできるが、その後にPlayerの移動制限をかけたいので、主体性はPlayerクラスが持っているので、衝突判定をPlayerクラスで実装した場合は以下となる。

def collision(self, block_list):
    for block in block_list:
        if block.rect.colliderect(self.rect):
            print(f'Block ID:{block.id}とplayerと衝突しました。')

メインクラスは

# 衝突判定
self.player.collision(self.block_list)
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?