【Pygame】スプライト用クラスの作成

この記事では、Pygameを用いて複数のキャラクターを効率よく扱うためのスプライトを作成する方法とソースコードを解説します。

スプライト用のクラス作成

スプライトとは、キャラクターを低いCPU負荷で滑らかに動かすグラフィック技術のことです。
これまでにもキャラクターの操作(移動や回転など)を行ってきましたが、複数のキャラクターを扱うとコード量がどんどん増えていく問題があります。
Pygameでは「pygame.sprite」を使うとスプライトの管理、描画、衝突判定等を簡単にできます。
今回はこれを用いて、キャラクター操作に関する各種機能をスプライトクラスとして1つにまとめ、複数のキャラクターを扱いやすくしてみました。

処理手順
「pygame」モジュールをインポートする。
画面のサイズを設定する。
円の中心座標を画面の中心に設定する。
Pygameを初期化する。[pygame.init]
3人分のキャラクター画像を取得する。
画面を更新する。
更新時間の間隔を設定する。
画面の背景色を黒に設定する。
3人のキャラクターを指定した座標(x, y)に描画する。
イベント処理をする。
・画面の閉じるボタンが押されたら終了する。
6-10の処理を繰り返す。

ソースコード

サンプルプログラムのソースコードです。

# -*- coding: utf-8 -*-
import pygame
from pygame.locals import *
import sys

SCREEN = Rect(0, 0, 400, 400)

# スプライトのクラス
class Sprite(pygame.sprite.Sprite):
    # スプライトを作成(画像ファイル名, 位置(x, y), 速さ(vx, vy), 回転angle)
    def __init__(self, filename, x, y, vx, vy, angle=0):
        pygame.sprite.Sprite.__init__(self)
        self.img = pygame.image.load(filename).convert_alpha()
        if angle != 0: self.img = pygame.transform.rotate(self.img, angle)
        w = self.img.get_width()
        h = self.img.get_height()
        self.rect = Rect(x, y, w, h)
        self.vx = vx
        self.vy = vy
        self.angle = angle

    def update(self):
        self.rect.move_ip(self.vx, self.vy)
        # 壁と衝突時の処理(跳ね返り)
        if self.rect.left < 0 or self.rect.right > SCREEN.width:
            self.vx = -self.vx
        if self.rect.top < 0 or self.rect.bottom > SCREEN.height:
            self.vy = -self.vy
        # 壁と衝突時の処理(壁を超えないように)
        self.rect = self.rect.clamp(SCREEN)

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

# メイン
def main():
    pygame.init()
    screen = pygame.display.set_mode(SCREEN.size)
    # スプライトを作成(画像ファイル名, 位置(x, y), 速さ(vx, vy), 回転angle)
    player = Sprite("player.png", 200, 200, 2, 0, 0)
    enemy1 = Sprite("enemy1.png", 200, 200, 0, 2, 0)
    enemy2 = Sprite("enemy2.png", 200, 200, 2, 2, 10)
    clock = pygame.time.Clock()

    while (1):
        clock.tick(30)  # フレームレート(30fps)
        screen.fill((0, 20, 0, 0)) # 画面の背景色
        # スプライトを更新
        player.update()
        enemy1.update()
        enemy2.update()
        # スプライトを描画
        player.draw(screen)
        enemy1.draw(screen)
        enemy2.draw(screen)
        # 画面更新
        pygame.display.update()
        # イベント処理
        for event in pygame.event.get():
            # 終了用のイベント処理
            if event.type == QUIT:          # 閉じるボタンが押されたとき
                pygame.quit()
                sys.exit()
            if event.type == KEYDOWN:       # キーを押したとき
                if event.key == K_ESCAPE:   # Escキーが押されたとき
                    pygame.quit()
                    sys.exit()

if __name__ == "__main__":
    main()

実行結果

サンプルプログラムの実行結果です。

3人のキャラクターを描画できました。

おすすめ関連記事
1 Pygameでゲームプログラミング
2 Python入門 基本文法
関連記事

コメント

  1. 匿名 より:

    11行目のところが構文が違うと返されます。

    • 管理人 より:

      ※匿名様
      コメントありがとうございます。
      Python3だとエラーが出るようなので修正いたしました。

  2. 匿名 より:

    変更ありがとうございます。
    変更したあとのものを実行すると下のエラーが起きます。
    ‘Sprite’ object has no attribute ‘img’
    これはpyhotn3にはないのでしょうか?

    • 管理人 より:

      ※匿名様
      コメントありがとうございます。
      当方の環境でも同様のエラーが出ましたので修正致しました。