画像描画
すでに画像の読み込みと描画は基本コードであつかっています。ここでは、画像の切り抜きと拡大をあつかいます。
まずは、画像 を使って、プログラムを実行した時のスクリーンショットです。画像の一部を拡大して表示します。
次にプログラムの例を示します。2Dゲームではよくある、タイル状の画像から一部を取り出す処理と、画像を拡大する処理です。
import pygame # Pygameをインポート pygame.init() # Pygameを初期化 screen = pygame.display.set_mode((800, 600)) # 画面作成 running = True # 実行継続フラグ # 画像分割読み込み def load(p, x, y, size): image = pygame.image.load(p) # 画像読み込み u = 16 # 画像部品のピクセル単位 sliced = pygame.Surface((u, u), pygame.SRCALPHA) # Surface生成 sliced.blit(image, (0, 0), (x * u, y * u, u, u)) # 一部を貼り付け scaled = pygame.transform.scale(sliced, (size, size)) # 拡大 return scaled image1 = load("chara.png", 0, 0, 256) # 画像分割読み込み image2 = load("chara.png", 1, 4, 384) # 画像分割読み込み while running: for event in pygame.event.get(): # イベント if event.type == pygame.QUIT: # 種類がQUITなら running = False # 終了 screen.fill((0, 0, 0)) # 画面を塗りつぶす screen.blit(image1, (32, 32)) # 描画 screen.blit(image2, (320, 64)) # 描画 pygame.display.flip() # 画面フリップ pygame.quit() # Pygameを終了
画像の読み込みと、切り抜いて拡大する処理はload()
関数にまとめています。load()
関数の中では、次のようなことをおこなっています。
-
画像を
Surface
として読み込む -
pygame.Surface()
でSurface
を生成する -
2の
Surface
に、1のSurface
の一部をblit()
関数で貼り付ける -
2の
Surface
をpygame.transform.scale()
で拡大する -
拡大した
Surface
を戻り値として返す
Pygameのいくつかの関数を使っているので、それぞれの処理の引数をまとめます。=
で値が設定されているものは、初期値のある引数です。これらの引数は必須ではありません。リストとタプルは互換です。どちらで書いても構いません。
pygame.Surface( size, # 横幅と高さのタプル flags=0 # pygame.SRCALPHAなど ) -> Surface # 戻り値:Surfaceオブジェクト
描画先のSurfaceオブジェクト.blit( surface, # 描画元のSurfaceオブジェクト dest, # 描画先のX位置、Y位置のタプル area=None # 描画元のX位置、Y位置、横幅、高さのタプル )
pygame.transform.scale( surface, # Surfaceオブジェクト size # 横幅と高さのタプル ) -> Surface # 戻り値:Surfaceオブジェクト
Pygameで画像を使ったゲームを作るなら、最低限これらの処理がおこなえれば問題ありません。
定義したload()
関数は、画像ファイルのパス、切り抜くX位置とY位置、拡大するサイズを引数にとります。こちらも引数をまとめておきます。
load( path, # 画像ファイルのパス x, # X方向に何番目のタイルかの整数 y, # Y方向に何番目のタイルかの整数 size # 拡大縮小する横幅と高さのタプル ) -> Surface # Surfaceオブジェクト
図形描画
Pygameは、pygame.draw
の下に、いくつかの図形を描く関数を持っています。関数には、次のようなものがあります。各関数の引数の内容については、プログラムの例を示したあと掲載します。
> 四角形、ポリゴン、円、楕円、円弧、線、複数線
この中から、今回のゲーム開発で使う四角形の描画を取り上げます。実行したスクリーンショットと、プログラムの例です。
import pygame # Pygame pygame.init() # Pygameを初期化 screen = pygame.display.set_mode((800, 600)) # 画面作成 running = True # 実行継続フラグ # 図形の描画 def draw(): col = (0, 255, 0) # 色 rect1 = ( 75, 50, 300, 500) # 四角形1 rect2 = (450, 50, 300, 500) # 四角形2 pygame.draw.rect(screen, col, rect1) # 塗りつぶし pygame.draw.rect(screen, col, rect2, width = 5) # 線描画 while running: for event in pygame.event.get(): # イベント if event.type == pygame.QUIT: # 種類がQUITなら running = False # 終了 screen.fill((0, 0, 0)) # 画面を塗りつぶす draw() # 図形の描画 pygame.display.flip() # 画面フリップ pygame.quit() # Pygameを終了
図形の描画はdraw()
関数にまとめています。
draw()
関数の中身を説明します。色を表す変数col
は、RGBの値を持つタプルです。四角形を表す変数rect1
とrect2
は、X位置、Y位置、横幅、高さの値を持つタプルです。
最後は四角形の描画です。pygame.draw.rect()
関数で四角形を2つ描いています。1つ目は塗りつぶしで、2つ目は線描画です。
Pygameの図形描画の多くは、引数にwidth
を指定しなければ塗りつぶし、width
を0より大きな数値で指定すると、その太さで線描画をおこないます。
pygameの図形描画の関数
pygameの図形描画の関数は、四角形以外にも多くあります。そうした関数の引数の情報をまとめておきます。
以降の関数で、=
で値が設定されているものは、初期値のある引数です。これらの引数は必須ではありません。リストとタプルは互換です。どちらで書いても構いません。
rect
とある場所は、X位置、Y位置、横幅、高さのタプルか、pygame.Rect
オブジェクトです(例:(20, 10, 200, 150)
、pygame.Rect(20, 10, 200, 150)
)。
color
とある場所は、R、G、Bのタプルか、pygame.Color
オブジェクトです(例:(255, 255, 255)
、pygame.Color(255, 255, 255)
)。
pygame.draw.rect( surface, # 描画対象のSurfaceオブジェクト color, # 色 rect, # 四角形 width=0, # 線の太さ border_radius=0, # 角丸の指定 border_top_left_radius=-1, # 角丸 上左 border_top_right_radius=-1, # 角丸 上右 border_bottom_left_radius=-1, # 角丸 下左 border_bottom_right_radius=-1 # 角丸 下右 )
pygame.draw.polygon( surface, # 描画対象のSurfaceオブジェクト color, # 色 points, # 座標(x, y)のリスト、例: [(50, 50), (50, 70), (70, 50)] width=0 # 線の太さ )
pygame.draw.circle( surface, # 描画対象のSurfaceオブジェクト color, # 色 center, # 中心位置、例: (50, 70) radius, # 半径 width=0, # 線の太さ draw_top_right=None, # 四分割した円の上右側を描くか、真偽値 draw_top_left=None, # 四分割した円の上左側を描くか、真偽値 draw_bottom_left=None, # 四分割した円の下左側を描くか、真偽値 draw_bottom_right=None # 四分割した円の下右側を描くか、真偽値 )
pygame.draw.ellipse( surface, # 描画対象のSurfaceオブジェクト color, # 色 rect, # 四角形(この範囲に内接する楕円) width=0 # 線の太さ )
次に示す円弧の描画では、角度はラジアンで指定します。ラジアンでは、pi * 2
(パイの2倍)が1周になります。pi
はfrom math import pi
でインポートできます。
pygame.draw.arc( surface, # 描画対象のSurfaceオブジェクト color, # 色 rect, # 四角形(この範囲に内接する楕円) start_angle, # 開始角度、ラジアン stop_angle, # 終了角度、ラジアン width=1 # 線の太さ )
pygame.draw.line( surface, # 描画対象のSurfaceオブジェクト color, # 色 start_pos, # 開始位置、例: (50, 70) end_pos, # 終了位置、例: (70, 50) width=1 # 線の太さ )
pygame.draw.aaline( surface, # 描画対象のSurfaceオブジェクト color, # 色 start_pos, # 開始位置、例: (50, 70) end_pos, # 終了位置、例: (70, 50) blend=1 # 非推奨、ブレンドの有無 )
pygame.draw.lines( surface, # 描画対象のSurfaceオブジェクト color, # 色 closed, # 線を閉じるかの真偽値 points, # 座標のリスト、例: [(50, 50), (50, 70), (70, 50)] width=1 # 線の太さ )
pygame.draw.aalines( surface, # 描画対象のSurfaceオブジェクト color, # 色 closed, # 線を閉じるかの真偽値 points, # 座標のリスト、例: [(50, 50), (50, 70), (70, 50)] blend=1 # 線の太さ )