概要
本記事はキャラクターとブロックの衝突判定を行う
使い方の例
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()
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)