Edited at

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()する