スプライト1

今回はスプライトを使用します.
スプライトはゲーム背景とは滅に動く画像(キャラクター, ボール,ブロック等)のことです.
スプライトを使用すると画像のバウンドや衝突の処理がカンタンにでき, ゲームを作成するのに必須となります.
また画像の処理をまとめて行うのでオブジェクト指向になります.
今まではひとつの画像のみの処理を書いていたので, 処理をClassでまとめます.

import pygame
from pygame.locals import *
import sys

SCR_RECT = Rect(0, 0, 1000, 700)

class MySprite(pygame.sprite.Sprite):
    def __init__(self, filename, x, y, vx, vy):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load(filename).convert()
        colorkey = self.image.get_at((0,0))  # 左上の色を透明色に
        self.image.set_colorkey(colorkey, RLEACCEL)
        width = self.image.get_width()
        height = self.image.get_height()
        self.rect = Rect(x, y, width, height)
        self.vx = vx
        self.vy = vy

    def update(self):
        self.rect.move_ip(self.vx, self.vy)
        # 壁にぶつかったら跳ね返る
        if self.rect.left < 0 or self.rect.right > SCR_RECT.width:
            self.vx = -self.vx
        if self.rect.top < 0 or self.rect.bottom > SCR_RECT.height:
            self.vy = -self.vy
        # 画面からはみ出ないようにする
        self.rect = self.rect.clamp(SCR_RECT)

    def draw(self, screen):
        screen.blit(self.image, self.rect)

def main():
    pygame.init()
    screen = pygame.display.set_mode(SCR_RECT.size)
    pygame.display.set_caption("スプライトの使い方")

    # スプライトを作成
    python1 = MySprite("kappa3.png", 0, 0, 3, 6)
    python2 = MySprite("kappa3.png", 10, 10, 5, 5)
    python3 = MySprite("kappa3.png", 320, 240, -2, 3)
    clock = pygame.time.Clock()

    while True:
        clock.tick(60)  # 60fps
        backImg = pygame.image.load("hakusuiko.jpg").convert()
        screen.blit(backImg, (0,0))
        # スプライトを更新
        python1.update()
        python2.update()
        python3.update()



        # スプライトを描画
        python1.draw(screen)
        python2.draw(screen)
        python3.draw(screen)


        pygame.display.update()

        for event in pygame.event.get():
            if event.type == QUIT:
                sys.exit()

if __name__ == "__main__":
    main()

このスクリプトはmain関数とMySpriteクラスで成り立っています.
main関数は,

if __name__ == "__main__":
    main()

で呼び出します.
実行すると__name__に__main__という文字列が代入され, if文がTrueとなりmain()が実行されます.
次にスプライトクラスです.

class MySprite(pygame.sprite.Sprite):
    def __init__(self, filename, x, y, vx, vy):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load(filename).convert()
        colorkey = self.image.get_at((0,0))  # 左上の色を透明色に
        self.image.set_colorkey(colorkey, RLEACCEL)
        width = self.image.get_width()
        height = self.image.get_height()
        self.rect = Rect(x, y, width, height)
        self.vx = vx
        self.vy = vy

    def update(self):
        self.rect.move_ip(self.vx, self.vy)
        # 壁にぶつかったら跳ね返る
        if self.rect.left < 0 or self.rect.right > SCR_RECT.width:
            self.vx = -self.vx
        if self.rect.top < 0 or self.rect.bottom > SCR_RECT.height:
            self.vy = -self.vy
        # 画面からはみ出ないようにする
        self.rect = self.rect.clamp(SCR_RECT)

    def draw(self, screen):
        screen.blit(self.image, self.rect)

スプライトクラスは, pygame.sprite.Spriteです.
スプライトを使用する場合はこのクラスを継承して作ります.
今回はSpriteを継承してMySpriteというスプライトクラスを実装しています.
Spriteを継承するには, __init__()でpygame.sprite.Sprite.__init__()を呼び出す必要があります.
コンストラクタは__init__()メソッドとして定義します。第一引数が self で、それぞれのインスタンスをさします。第二引数は自分で定義したパラメータが入ります.
Spriteでは3つの定義をする必要があります.
更新, 描写, 衝突判定をするためです.

self.image #スプライトの画像の設定
self.rect  #スプライトの位置とサイズを表すRect
update()   #スプライトの1フレームでの更新処理

今回は, filenameの画像をロードしてself.imageにセットしています.
その画像の余白を透明にする処理も行います.
次に画像の幅(width)と高さ(height)を設定します.
その画像のサイズをself.rectにセットします.
スプライトの場合は, biltでバウント処理と実装するのではなく,
update()は, バウンドの処理,
draw()によって実装します.
self.rectによって最初の位置が設定されています.

python1 = MySprite("kappa3.png", 0, 0, 3, 6)
python2 = MySprite("kappa3.png", 10, 10, 5, 5)
python3 = MySprite("kappa3.png", 320, 240, -2, 3)

ここで最初の位置と速度とベクトルの指定をしています,
MySpriteというクラスはオブジェクトの雛形です.
update(), draw()によって実装します.