Pygameのスプライトを使ってみよう
今回はゲームでよく使われるスプライトを使ったプログラムを作ります。
スプライトとは、動かす図形と背景を別々に作成して、画面上で合成する仕組みです。
スプライトを使うと、以下の記事で作成したようなプログラムが簡単に作成できます。
今回のプログラムでは、ボールを同時に4つ動かします。
なお、読み込む画像ファイルはあらかじめ作成して、スクリプトと同じディレクトリに置いておきます。
Pythonスクリプト
今回のスクリプトは、以下のようになります。
注意ポイント
あらかじめimg1.png~img4.pngという画像ファイルをスクリプトと同じディレクトリに配置しておく必要があります。
画像ファイルは各自で用意してください。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124  | 
						### インポート import sys import pygame from pygame.locals import * ### 定数 SURFACE = Rect(0, 0, 640, 400) # 画面サイズ(X軸,Y軸,横,縦) G_SIZE  = 20                   # 画像サイズ F_RATE  = 60                   # フレームレート ############################ ### スプライトクラス継承  ############################ class MySprite(pygame.sprite.Sprite):     ############################     ### 初期化メソッド(ファイル名,X軸,Y軸,X軸移動,Y軸移動)     ############################     def __init__(self, name, x, y, mv_x, mv_y):         pygame.sprite.Sprite.__init__(self)         ### 透過変換でファイル読み込み         self.image = pygame.image.load(name).convert_alpha()         ### 画像サイズ変更         self.image = pygame.transform.scale(self.image, (G_SIZE, G_SIZE))         ### 画像サイズ取得         width  = self.image.get_width()         height = self.image.get_height()         ### 四角形オブジェクト生成         self.rect = Rect(x, y, width, height)         ### 移動位置設定         self.mv_x = mv_x         self.mv_y = mv_y     ############################     ### 画面更新     ############################     def update(self):         ### 移動描写         self.rect.move_ip(self.mv_x, self.mv_y)         ### 画面の範囲外ならオブジェクト移動位置を反転         if self.rect.left < 0 or self.rect.right  > SURFACE.width:             self.mv_x = -self.mv_x         if self.rect.top  < 0 or self.rect.bottom > SURFACE.height:             self.mv_y = -self.mv_y         ### 画面内に収める         self.rect = self.rect.clamp(SURFACE)     ############################     ### オブジェクト描画     ############################     def draw(self, surface):         surface.blit(self.image, self.rect) ############################ ### メイン関数  ############################ def main():     ### 画面初期化     pygame.init()     surface = pygame.display.set_mode(SURFACE.size)     ### スプライトを作成     img1 = MySprite("img1.png",   0,   0, 8, 2)     img2 = MySprite("img2.png", 100, 100, 6, 4)     img3 = MySprite("img3.png", 200, 200, 4, 6)     img4 = MySprite("img4.png", 300, 300, 2, 8)     ### グループ設定     img_grp = pygame.sprite.Group(img1, img2, img3, img4)     ### 時間オブジェクト生成     clock = pygame.time.Clock()     ### 無限ループ     while True:         ### フレームレート設定         clock.tick(F_RATE)         ### 背景色設定         surface.fill((0,0,0))         ### スプライトを更新         img_grp.update()         ### スプライトを描画         img_grp.draw(surface)         ### 画面更新         pygame.display.update()         ### イベント処理         for event in pygame.event.get():             ### 終了処理             if event.type == QUIT:                 exit()             if event.type == KEYDOWN:                 if event.key == K_ESCAPE:                     exit() ############################ ### 終了関数 ############################ def exit():     pygame.quit()     sys.exit() ############################ ### メイン関数呼び出し ############################ if __name__ == "__main__":     ### 処理開始     main()  | 
					
スクリプト解説
7行目
画面オブジェクトを生成します。
14~60行目
Spriteクラスを継承します。
引数はファイル名、X軸位置、Y軸位置、X軸の移動先、Y軸の移動先です。
23行目
指定したファイルを読み込みます。
convert_alpha()メソッドは、ピクセル単位の透明度を保持したまま画像のピクセル形式を変更します。
26行目
画像サイズを 20 x 20 ピクセルに変更します。
33行目
引数で渡された情報を元に、四角形オブジェクトを生成します。
42~54行目
オブジェクトの移動位置を更新する関数です。
45行目
オブジェクト自身の位置を移動します。
48~51行目
画面の横位置、縦位置の限界まできたら、オブジェクトの移動する向きを逆転させます。
54行目
画面外になったら画面内に収まるように位置を移動します。
rect.clamp()メソッドを使わないと、オブジェクトが画面から消えることがあります。
59、60行目
オブジェクトを画面に描画します。
69行目
画面を初期化します。
SURFACE.sizeで、画面の横と縦を取得します。
72~75行目
スプライトを作成します。
引数の意味は、以下の通りです。
1番目:ファイル名
2番目:X軸の初期位置
3番目:Y軸の初期位置
4番目:X軸の移動位置
5番目:Y軸の移動位置
78行目
複数のスプライトをグループとしてまとめます。
81行目
時間オブジェクトを生成します。
87行目
指定したフレームレート分、処理を待ちます。
大きい値にすると、プログラムの待ち時間が短くなり、ボールの移動スピードが速くなります。
93行目
スプライト更新メソッドを呼び出します。
96行目
更新したスプライトを描画します。
99行目
画面全体を更新します。
105~109行目
画面右上の✕(バツ)ボタンかエスケープ(Esc)キーを押下すると、終了関数を呼び出します。
114~116行目
スクリプトを終了して、画面を閉じます。