社内se × プログラマ × ビッグデータ

プログラミングなどITに興味があります。

Pygame マウスカーソル に合わせて Paddle が動く

f:id:blueskyarea:20200813171747g:plain

def main():
    # Initialize pygame screen
    pygame.init()
    screen = pygame.display.set_mode(GAME_RECT.size)
    pygame.display.set_caption("Game Title")

    # Create sprite group
    sprite_group = pygame.sprite.RenderUpdates()
    Paddle.containers = sprite_group
    Paddle()

    # Game loop
    while True:
        screen.fill((0,0,0)) # fill with black
        sprite_group.update()
        sprite_group.draw(screen)
        pygame.display.update()
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            if event.type == KEYDOWN and event.key == K_ESCAPE:
                pygame.quit()
                sys.exit()

# Paddle inheritance Sprite class
class Paddle(pygame.sprite.Sprite):
    def __init__(self):
        # Default sprite group
        pygame.sprite.Sprite.__init__(self, self.containers)
        self.image, self.rect = load_image("paddle.png")
        self.rect.bottom = GAME_RECT.bottom
    def update(self):
        self.rect.centerx = pygame.mouse.get_pos()[0]
        self.rect.clamp_ip(GAME_RECT)

def load_image(filename):
    filename = os.path.join("resource", filename)
    try:
        image = pygame.image.load(filename)
    except pygame.error:
        print ("Failed to load image:", filename)
        raise SystemExit()
    return image, image.get_rect()

if __name__ == "__main__":
    main()

補足

    # Create sprite group
    sprite_group = pygame.sprite.RenderUpdates()
    Paddle.containers = sprite_group
    Paddle()

Paddle のインスタンス生成前に、sprite_group を Paddle.containers メンバ変数に登録。
複数のスプライトをグループにまとめると更新と描画がシンプルになる。

class Paddle(pygame.sprite.Sprite):
    def __init__(self):
        # Default sprite group
        pygame.sprite.Sprite.__init__(self, self.containers)
        self.image, self.rect = load_image("paddle.png")
        self.rect.bottom = GAME_RECT.bottom

Paddle インスタンス生成時、init() (コンストラクタ)で pygame.sprite.Sprite.__init__()を呼び出し、Spriteを継承。
引数にグループリスト(containers)を渡す。
(自身のメンバ変数をクラスの外部から定義し、インスタンス化時にそれをコンストラクタ内で使用するような書き方に個人的に慣れない)