
pygame.sprite.spritecollideでSprite同士の衝突を検知できる。
また、引数の指定によって、衝突したSpriteを削除できる。
pygame.sprite.spritecollide(sprite, group, dokill)
2番めの引数のgroupに属するSpriteのうち、
1番目の引数のspriteと衝突しているもののリストを返す。
3番めの引数のdokillをTrueにすると、衝突しているSpriteがgroupから削除される。
Spriteの衝突判定は、Spriteのrectプロパティによって行っている。
import pygame
import sys
SCREEN = pygame.Rect(0, 0, 400, 400)
FPS = 30
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BALL_SIZE = 20
PADDLE_WIDTH = 60
PADDLE_HEIGHT = 20
PADDLE_POS_Y = SCREEN.bottom - PADDLE_HEIGHT * 2
class Ball(pygame.sprite.Sprite):
def __init__(self, pos, speed):
pygame.sprite.Sprite.__init__(self, self.containers)
x, y = pos
vx, vy = speed
self.image = pygame.Surface((BALL_SIZE, BALL_SIZE))
self.image.fill(WHITE)
pygame.draw.circle(self.image, RED, self.image.get_rect().center, BALL_SIZE / 2)
self.rect = pygame.Rect(x, y, BALL_SIZE, BALL_SIZE)
self.vx = vx
self.vy = vy
def update(self):
self.rect.move_ip(self.vx, self.vy)
if self.rect.left < SCREEN.left or SCREEN.right < self.rect.right:
self.vx = -self.vx
if self.rect.top < SCREEN.top or SCREEN.bottom < self.rect.bottom:
self.vy = -self.vy
self.rect = self.rect.clamp(SCREEN)
class Paddle(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self, self.containers)
self.image = pygame.Surface((PADDLE_WIDTH, PADDLE_HEIGHT))
self.image.fill(GREEN)
self.rect = pygame.Rect(0, PADDLE_POS_Y, PADDLE_WIDTH, PADDLE_HEIGHT)
def update(self):
self.rect.centerx = pygame.mouse.get_pos()[0]
self.rect = self.rect.clamp(SCREEN)
pygame.init()
clock = pygame.time.Clock()
screen = pygame.display.set_mode(SCREEN.size)
sprite_group = pygame.sprite.Group()
ball_group = pygame.sprite.Group()
Ball.containers = sprite_group, ball_group
Paddle.containers = sprite_group
Ball((200, 200), (2, 3))
Ball((100, 200), (3, 3))
Ball((100, 300), (3, 4))
paddle = Paddle()
while True:
pygame.sprite.spritecollide(paddle, ball_group, True)
screen.fill(WHITE)
sprite_group.update()
sprite_group.draw(screen)
pygame.display.update()
clock.tick(FPS)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()