Pygameの勉強 *スプライトを使おうの巻*

スプライトっていうのは、ゲーム背景とは別に動く画像を指す。
Pygameにはスプライトをを表すモジュール、pygame.spriteがある。これを使うと、スプライトの管理、描画、衝突判定が簡単にできるんだって。

コードを見てみよう!!

#! /usr/bin/env python
# -*- coding: utf-8 -*-
import pygame
from pygame.locals import *
import sys

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


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_alpha()
        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('Sprite')
    backImg = pygame.image.load('see.jpg').convert()
    #スプライトを作成
    python1 = MySprite('pythonImg.png',0,0,2,2)
    python2 = MySprite('pythonImg.png',10,10,5,5)
    python3 = MySprite('pythonImg.png',320,240,-5,3)

    clock = pygame.time.Clock()

    while True:
        clock.tick(60)  #60fpe
        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 event.type == KEYDOWN and event.key == K_ESCAPE:
                sys.exit()

if __name__ == '__main__':
    main()

spriteでは、以下の三つを定義(オーバーライド)する必要がある。

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