前回作成したスプライトを、グループに追加してまとめて管理します。
スプライトをグループに追加する
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を渡します。
複数のクラスを渡すこともできるので、描画用のグループと当たり判定用のグループに所属させる、といったことも可能です。