見出し画像

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

 実行した画面です。

図形描画

 処理の前半は`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ページに一部抜粋版を掲載しています。

 技術系同人誌など まとめページ


この記事が気に入ったらサポートをしてみませんか?