目標:
- pygame で画像を読み込みSpriteクラスで使用する
プロジェクトストラクチャー
- project/ -- 全てを入れるフォルダ(ディレクトリ)
- img/ -- 画像を保存するフォルダ(ディレクトリ)
- player.png
- app.py -- codeを書くファイル
- img/ -- 画像を保存するフォルダ(ディレクトリ)
インポートをしましょう
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
)が含まれているフォルダ(dir
erctoryname
)が格納される
この場合: project
そのgame_dir
を早速使おう。
img_dir = os.path.join(game_dir, "img")
= os
モジュールの中のpath
モジュールの中のjoin
というfunctionを呼び出す
join
functionは受けった引数を一つのパスへとつなげる
この場合: 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_img
をPlayer
クラスで使用しよう
以下が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.image
のRect
をget_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
クラスのものをグループでまとめることができる。
これにより、全てのSprite
にupdate
functionを実行したりできるので便利。
player = Player()
= Player()
インスタンスをplayer
に格納する
all_sprites.add(player)
all_sprites
変数に新しく作ったplayer
インスタンスを入れる
ゲームループの中でPlayer
クラスを描く
all_sprites.draw(screen)
= screen
サーフェス(ゲーム画面)にall_sprites
に含まれるSprite
をdraw()
する