Python
pygame

Pygame 画像を読み込み、Spriteクラスで使用する

目標:

  • pygame で画像を読み込みSpriteクラスで使用する

プロジェクトストラクチャー

  • project/ -- 全てを入れるフォルダ(ディレクトリ)
    • img/ -- 画像を保存するフォルダ(ディレクトリ)
      • player.png
    • app.py -- codeを書くファイル

インポートをしましょう

import pygame
import os
  • このosというモジュールは、自分が使っているコンピューターの情報を得るためのfunctionがたくさん入っているもの。今回はこのファイルへのパスを得るために使う。

# フォルダへのパスを変数に格納しよう
game_dir = os.path.dirname(__file__)
img_dir = os.path.join(game_dir, "img")

os.path.dirname
= osモジュールの中のpathモジュールの中のdirnameというfunctionを呼び出す。

__file__というのは実行されているファイル名が格納されている。
この場合だったら、app.py

これでgame_dirという変数に実行されているファイル(app.py)が含まれているフォルダ(direrctoryname)が格納される
この場合: project

そのgame_dirを早速使おう。
img_dir = os.path.join(game_dir, "img")
= osモジュールの中のpathモジュールの中のjoinというfunctionを呼び出す
joinfunctionは受けった引数を一つのパスへとつなげる
この場合: project/img/


次に、画像ファイルをpygameに読み込もう

player_img = pygame.image.load(
    os.path.join(img_folder, "player.png")).convert()

pygame.image.load().convert()
= 画像を読み込み(load())、pygameが扱いやすいように変換する(convert())。それをplayer_img変数に格納する。


次に、作ったplayer_imgPlayerクラスで使用しよう

以下がPlayerクラス

class Player(pygame.sprite.Sprite):
    # sprite for the Player
    def __init__(self):
        super().__init__()
        self.image = pygame.transform.scale(player_img, (50, 38))
        self.image.set_colorkey((0,0,0))
        self.rect = self.image.get_rect()

ここに注目は
self.image = pygame.transform.scale(player_img, (50, 38))
ここではtransformモジュールにあるscale()functionを使用する
scale([Surface], [サイズ])の引数
1. どのSurfaceに書くのか
2. どの大きさにするのか(ピクセル)*Tupleで渡す

self.image.set_colorkey((0,0,0))
= 画像の周囲にある無駄な外縁を消すためのfunction
ここでは周囲の黒を消す (0,0,0)

self.rect = self.image.get_rect()
= 新しく作った画像を格納した属性self.imageRectget_rect()functionを使って、別の属性self.rect属性に格納しておく。


次に、Playerクラスのインスタンスを作ろう

all_sprites = pygame.sprite.Group()
player = Player()
all_sprites.add(player)

all_sprites = pygame.sprite.Group()
= all_sprites変数にpygame.sprite.Group()を格納
Group()ではSpriteクラスのものをグループでまとめることができる。
これにより、全てのSpriteupdatefunctionを実行したりできるので便利。

player = Player()
= Player()インスタンスをplayerに格納する

all_sprites.add(player)
all_sprites変数に新しく作ったplayerインスタンスを入れる


ゲームループの中でPlayerクラスを描く

all_sprites.draw(screen)

= screenサーフェス(ゲーム画面)にall_spritesに含まれるSpritedraw()する