PythonとPygameで作る レトロ風RPG 全コード

同人誌について

 この連載は、同人誌『PythonとPygameで作る レトロ風RPG 全コード』を一部抜粋して編集したものです。

 同人誌本編には、ゲーム本体のソースコードや、各種のサンプルコード、Windowsで実行できるEXEファイルが付属しています。PDFで290ページの本になります。ぜひ、こちらもご購入ください。

(2024-03-28:ver1.0.4 に更新、2024-03-10:ver1.0.3 に更新)


4-3 Pygameの図形描画

公開:2024-03-01、更新:2024-03-10

図形描画の例

 図形描画の例を示します。後半の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_radiusborder_~_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周になります。pifrom 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で290ページの本になります。ぜひ、こちらもご購入ください。

(2024-03-28:ver1.0.4 に更新、2024-03-10:ver1.0.3 に更新)

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


トップページに戻る
Cronus Crown(クロノス・クラウン)のトップページに戻る
(c)2002-2024 Cronus Crown (c)1997-2024 Masakazu Yanai
ご意見・お問い合わせはサイト情報 弊社への連絡までお願いします
個人情報の取り扱い、利用者情報の外部送信について