スプライトグループの使い方

前回作成したスプライトを、グループに追加してまとめて管理します。

スプライトをグループに追加する

Spriteをグループに追加するには、Group.add()を使います。

#!/usr/bin/env python
import pygame
from pygame.locals import *
import sys

import cursor, tools, player

SCR_RECT = Rect(0, 0, 640, 480)

class Main():
    def __init__(self):
        pygame.init()
        pygame.display.set_caption("sample")
        screen = pygame.display.set_mode(SCR_RECT.size)

        # グループを作成する
        self.players = pygame.sprite.Group()

        # プレイヤーを複数インスタンス化
        self.player_1 = player.Player((288, 200))
        self.player_2 = player.Player((150, 40))
        self.player_3 = player.Player((330, 400))

        # プレイヤー1と2をグループに追加
        self.players.add(self.player_1)
        self.players.add(self.player_2)

        self.bg = tools.load_image("data", "bg.png")

        clock = pygame.time.Clock()
        while True:
            clock.tick(30)
            self.update()
            self.draw(screen)
            pygame.display.update()
            self.key_handler()

    def update(self):
        # グループを更新
        self.players.update()

    def draw(self, screen):
        screen.blit(self.bg, (0, 0))
        # グループを描画
        self.players.draw(screen)
        self.player_3.draw(screen)

    def key_handler(self):
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()

if __name__ == "__main__":
    Main()

ラビップルを三体作り、二匹だけグループに追加しています。

前回と同じコードだと三匹が重なって描画されてしまうので、座標を引数に渡すようにコードを編集しています。

def __init__(self, pos):
    pygame.sprite.Sprite.__init__(self)
    self.images = tools.split_image(tools.load_image("data", "rabipple.png"), 2, 2)
    self.image = self.images[0]
    # 画像のRect値を取得
    self.rect = self.image.get_rect()
    self.rect.center = pos
    self.direction = 0

実行してみると、グループに追加されたラビップルはキー操作で移動しますが、グループに追加されていない三匹目のラビップルは動きません。

このように、グループに対してupdate()やdraw()を実行することで、グループに所属しているすべてのスプライトを更新・描画することができます。

所属グループをあらかじめ設定する

Spriteのコンストラクタ実行時に、あらかじめ作成しておいたグループを引数として渡すことで、所属するグループを定義することができます。

インスタンス化されたときに自動で設定していたグループに所属するため、いちいちグループに追加する手間がなくなります。

実際にゲームを作っていくときには、主にこのやり方を使っていきます。

# グループを作成する
self.players = pygame.sprite.Group()
# Playerクラスのデフォルトグループに設定する
player.Player.containers = self.players

グループを作成後、Playerクラスのデフォルトグループとして設定します。

def __init__(self, pos):
    pygame.sprite.Sprite.__init__(self, self.containers)

Playerクラスのコンストラクタで、引数にcontainersを渡します。

複数のクラスを渡すこともできるので、描画用のグループと当たり判定用のグループに所属させる、といったことも可能です。