![見出し画像](https://assets.st-note.com/production/uploads/images/132596221/rectangle_large_type_2_d973183908650c55fdc4d8af549c6e44.png?width=1200)
4-3 Pygameの図形描画
同人誌について
この連載は、同人誌『PythonとPygameで作る レトロ風RPG 全コード』を一部抜粋して編集したものです。
同人誌本編には、ゲーム本体のソースコードや、各種のサンプルコード、Windowsで実行できるEXEファイルが付属しています。PDFで288ページの本になります。ぜひ、こちらもご購入ください(2024-03-10:ver1.0.3 に更新)。
図形描画の例
図形描画の例を示します。後半の`render()`関数の中に、図形の描画が入っています。
「example_pygame/draw.py」を示します。
import pygame
def main():
pygame.init() # Pygameを初期化
screen = pygame.display.set_mode((800, 600)) # 画面作成
running = True # 実行継続フラグ
while running:
pygame.display.update() # 画面を更新
screen.fill(pygame.Color(0, 0, 0)) # 画面を塗りつぶす
for event in pygame.event.get(): # イベント
if event.type == pygame.QUIT: running = False # 終了
render(screen) # 描画
pygame.display.flip() # 画面フリップ
pygame.quit()
# 描画
def render(screen):
col = pygame.Color(64, 255, 64)
# 四角形
pygame.draw.rect(screen, col, (50, 50, 200, 150)) # 塗りつぶし
pygame.draw.rect(screen, col, (300, 50, 200, 150), width=5) # 線描画
# ポリゴン
points = [(550, 50), (750, 150), (650, 200)]
pygame.draw.polygon(screen, col, points)
# 円
pygame.draw.circle(screen, col, (150, 350), 100,
draw_top_right=True, draw_top_left=False,
draw_bottom_left=True, draw_bottom_right=False)
# 楕円
pygame.draw.ellipse(screen, col, (300, 250, 150, 200))
# 円弧
from math import pi
pygame.draw.arc(screen, col, (500, 250, 150, 200), 0, pi * 1.2, width=5)
# 線
pygame.draw.line(screen, col, (700, 250), (750, 450), width=5)
# 複数線
points = [(50, 500), (750, 500), (400, 550)]
pygame.draw.lines(screen, col, closed=False, points=points, width=5)
if __name__ == "__main__":
main()
実行した画面です。
![](https://assets.st-note.com/img/1709300939865-LH4JICMBEJ.jpg?width=1200)
処理の前半は`main()`関数の処理です。`while`文の最後の方で`render()`関数を実行します。
import pygame
def main():
pygame.init() # Pygameを初期化
screen = pygame.display.set_mode((800, 600)) # 画面作成
running = True # 実行継続フラグ
while running:
pygame.display.update() # 画面を更新
screen.fill(pygame.Color(0, 0, 0)) # 画面を塗りつぶす
for event in pygame.event.get(): # イベント
if event.type == pygame.QUIT: running = False # 終了
render(screen) # 描画
pygame.display.flip() # 画面フリップ
pygame.quit()
`render()`関数です。描画をおこないます。まずは四角形とポリゴンです。
# 描画
def render(screen):
col = pygame.Color(64, 255, 64)
# 四角形
pygame.draw.rect(screen, col, (50, 50, 200, 150)) # 塗りつぶし
pygame.draw.rect(screen, col, (300, 50, 200, 150), width=5) # 線描画
# ポリゴン
points = [(550, 50), (750, 150), (650, 200)]
pygame.draw.polygon(screen, col, points)
円と楕円と円弧です。
# 円
pygame.draw.circle(screen, col, (150, 350), 100,
draw_top_right=True, draw_top_left=False,
draw_bottom_left=True, draw_bottom_right=False)
# 楕円
pygame.draw.ellipse(screen, col, (300, 250, 150, 200))
# 円弧
from math import pi
pygame.draw.arc(screen, col, (500, 250, 150, 200), 0, pi * 1.2, width=5)
線と複数線です。
# 線
pygame.draw.line(screen, col, (700, 250), (750, 450), width=5)
# 複数線
points = [(50, 500), (750, 500), (400, 550)]
pygame.draw.lines(screen, col, closed=False, points=points, width=5)
pygame.draw
図形の描画は`pygame.draw`の各関数でおこないます。第1引数が描画対象の`Surface`、第2引数が色です。以降は各関数によって引数が異なります。`width`に何も指定しなければ塗りつぶしです。`0`より大きな数値を指定すると、その太さの線を描きます。
`pygame.draw`の各関数の引数と戻り値をコードの形で示します。初期値がない引数は必須のものです。
まずは四角形の描画です。`border_radius`や`border_~_radius`は角丸の指定です。
pygame.draw.rect(
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 # 角丸 下右
) -> Rect
ポリゴンの描画です。`points`は、座標`(x, y)`のリストです。
pygame.draw.polygon(
surface, # 描画対象
color, # 色
points, # 座標のリスト
width=0 # 線の太さ
) -> Rect
真円の描画です。`center`は中心位置、`radius`は半径、`draw_~`は、四分割したそれぞれの位置を描くかの`bool`値です。
pygame.draw.circle(
surface, # 描画対象
color, # 色
center, # 中心位置
radius, # 半径
width=0, # 線の太さ
draw_top_right=None, # 上右を描くか
draw_top_left=None, # 上左を描くか
draw_bottom_left=None, # 下左を描くか
draw_bottom_right=None # 下右を描くか
) -> Rect
楕円の描画です。長方形`rect`に内接する楕円を描きます。
pygame.draw.ellipse(
surface, # 描画対象
color, # 色
rect, # 四角形
width=0 # 線の太さ
) -> Rect
円弧の描画です。長方形`rect`に内接する円弧を描きます。
開始角度`start_angle`と終了角度`stop_angle`はラジアンで指定します。ラジアンでは、`pi * 2`(パイの2倍)が1周になります。`pi`は`from math import pi`でインポートできます。
pygame.draw.arc(
surface, # 描画対象
color, # 色
rect, # 四角形
start_angle, # 開始角度
stop_angle, # 終了角度
width=1 # 線の太さ
) -> Rect
線の描画です。開始位置`start_pos`、終了位置`end_pos`は、タプルやリストで表した座標です。1つ目はアンチエイリアスなしです。2つ目はアンチエイリアスありです。
pygame.draw.line(
surface, # 描画対象
color, # 色
start_pos, # 開始位置
end_pos, # 終了位置
width=1 # 線の太さ
) -> Rect
pygame.draw.aaline(
surface, # 描画対象
color, # 色
start_pos, # 開始位置
end_pos, # 終了位置
blend=1 # 非推奨、ブレンドの有無
) -> Rect
複数線の描画です。`points`は、座標`(x, y)`のリストです。1つ目はアンチエイリアスなしです。2つ目はアンチエイリアスありです。
pygame.draw.lines(
surface, # 描画対象
color, # 色
closed, # 線を閉じるかのbool値
points, # 座標のリスト
width=1 # 線の太さ
) -> Rect
pygame.draw.aalines(
surface, # 描画対象
color, # 色
closed, # 線を閉じるかのbool値
points, # 座標のリスト
blend=1 # 線の太さ
) -> Rect
同人誌について
この連載は、同人誌『PythonとPygameで作る レトロ風RPG 全コード』を一部抜粋して編集したものです。
同人誌本編には、ゲーム本体のソースコードや、各種のサンプルコード、Windowsで実行できるEXEファイルが付属しています。PDFで288ページの本になります。ぜひ、こちらもご購入ください(2024-03-10:ver1.0.3 に更新)。
このnoteの記事と、Webページに一部抜粋版を掲載しています。
技術系同人誌など まとめページ