読者です 読者をやめる 読者になる 読者になる

はんぎょねこの憂鬱

耳から変な汁が出てきた

Pythonゲームプログラミング #2 画像表示

#0 環境構築
#1 メインループ
#2 画像表示
#3 アニメーション
#4 キー入力
#5 サウンド
#6 衝突判定
#7 ステートマシン
#8 マップチップ
#9 スクロール

画像表示

pygameを使ったゲームプログラミングについて説明していきます。

  • Windows10
  • Python3.6.1
  • pygame1.9.3

今回は画像を表示してみます。英語が苦でない方はpygame公式ドキュメントのTutorialを読んだほうが良いでしょう。

画像の読み込みと表示

まずは画像ファイルを適当に用意します。pngなどで透過情報を付けておくとpygameでも透過してくれます。

f:id:dungeonneko:20170511104234p:plain

とりあえず1キャラクターにつき幅32ピクセル、高さ32ピクセルで描いてみました。これを前回作成したmain.pyと同じフォルダに保存します。

f:id:dungeonneko:20170511095617p:plain

f:id:dungeonneko:20170511095623p:plain

main.pyを書き換えて画像を表示するプログラムを実行してみます

こんな感じで星とキノコが動けばOKです

f:id:dungeonneko:20170511104257g:plain

解説

8行目

img_char = pygame.image.load('test.png')  # 画像ファイルの読み込み

画像ファイルを読み込むとSurfaceクラスのインスタンスが作成されます。Surfaceクラスはpygameで画像を扱うためのクラスです。Surfaceクラスについての詳しい説明はドキュメントを読んでみてください。

24行目

screen.blit(img_char, (0, 0))  # 画像全体を表示

screenの座標(0, 0)にimg_charの画像全体をコピーしています。screenもSurfaceクラスです。

25行目

screen.blit(img_char, (x, 100), (64, 0, 32, 32))  # 画像の一部を表示

screenの座標(x, 100)にimg_charの座標(64, 0)から幅32px高さ32px分だけコピーしています。

f:id:dungeonneko:20170511235401p:plain:w240

27~34行目

# 画像の一部を回転させて表示
temp = pygame.Surface((32, 32), pygame.SRCALPHA)
temp.blit(img_char, (0, 0), (32, 0, 32, 32))
temp = pygame.transform.rotate(temp, a)
# 回転すると画像サイズが変化するので手動で中央寄せ
offset_x = (32 - temp.get_width()) / 2
offset_y = (32 - temp.get_height()) / 2
screen.blit(temp, (160 + offset_x, 200 + offset_y))

pygame.transform関数を使って回転する星を表示してみました。img_char全体を回転させてから必要な部分を切り出すのは難しいので↓

f:id:dungeonneko:20170511235425p:plain:w240

あらかじめ表示したい部分を切り抜いてから回転させます。

f:id:dungeonneko:20170511235444p:plain:w240

Surfaceを作成するときにpygame.SRCALPHAフラグを指定すると透過情報付きのSurfaceを作成することができます。また、pygame.transformの他の関数を使えば拡大縮小や反転も可能です。詳しくはドキュメントを読んでみてください。