とある科学の備忘録

とある科学の備忘録

CやPythonのプログラミング、Arduino等を使った電子工作をメインに書いています。また、木製CNCやドローンの自作製作記も更新中です。たまに機械学習とかもやってます。

【Python】Pygameで図形を描画する

前回、Pygameを使って画面上に文字を描画するプログラムを作成しました。

shizenkarasuzon.hatenablog.com
f:id:pythonjacascript:20181229192049j:plain:h300

今回は、このプログラムに図形を描画するプログラムを追加します。

サンプルプログラム:

以下のプログラムを実行してください。

from pygame.locals import *
import pygame
import sys

def main():
    pygame.init()    # Pygameを初期化
    screen = pygame.display.set_mode((400, 330))    # 画面を作成
    pygame.display.set_caption("S.C.MAGI")    # タイトルを作成

    #テキストの設定については前回の記事をご覧ください。
    font1 = pygame.font.SysFont("hg正楷書体pro", 150)
    font2 = pygame.font.SysFont(None, 50)
    
    text1 = font1.render("警告", True, (255,0,0))
    text2 = font2.render("EMERGENCY", True, (255,0,0))
    
    running = True
    #メインループ
    while running:
        screen.fill((0,0,0))  #画面を黒で塗りつぶす
       
        # 図形を描画
        #---------------  ここからが今回の追加部分  --------------------------
        
        pygame.draw.rect(screen, (255,0,0), (20,70,10,180))
        pygame.draw.rect(screen, (255,0,0), (370,70,10,180))

        for i in range(50):
            k = i * 20 - 60
            pygame.draw.polygon(screen, (255,0,0), [[40 + k, 10], [50+k, 10],[20+k,60],[10+k, 60]])
            pygame.draw.polygon(screen, (255,0,0), [[40 + k, 270], [50+k, 270],[20+k,320],[10+k, 320]])

        #---------------  ここまで  --------------------------

        screen.blit(text1, (40,80))
        screen.blit(text2, (90,220))
        pygame.display.update() #描画処理を実行
        for event in pygame.event.get():
            if event.type == QUIT:  # 終了イベント
                running = False
                pygame.quit()  #pygameのウィンドウを閉じる
                sys.exit() #システム終了
                
if __name__=="__main__":
    main()

 

実行結果:

f:id:pythonjacascript:20181229205607j:plain:h300
このようになればOKです。

簡単に解説

今回は、図形を描くプログラムを実行しましたが、前回のプログラムとの違いはここだけです:

pygame.draw.rect(screen, (255,0,0), (20,70,10,180))
pygame.draw.rect(screen, (255,0,0), (370,70,10,180))

for i in range(50):
    k = i * 20 - 60
    pygame.draw.polygon(screen, (255,0,0), [[40 + k, 10], [50+k, 10],[20+k,60],[10+k, 60]])
    pygame.draw.polygon(screen, (255,0,0), [[40 + k, 270], [50+k, 270],[20+k,320],[10+k, 320]]

つまり、ここだけで、上下の平行四辺形と文字の左右の四角形の描画処理をしているのです。

図形を描画するには以下のような関数を使います。


四角形(矩形)を描画

四角形(矩形)を描くには、pygame.draw.rect()関数を使います。
使用例:

pygame.draw.rect(screen, (255,0,0), (20,70,10,180))

それぞれの引数は次のような役割です。

引数 説明
第1引数 screenオブジェクト screen
第2引数 図形のRGB色 (255,255,255)#←白色を表す
第3引数 図形の形(左上のx座標、左上のy座標、横幅、縦の幅)で指定 (20,30,100,100)

四角形(矩形)を描画(枠線なし&高速)

枠線なしの場合、fill関数を使って矩形を書くこともできます。
rect()関数よりも高速に描画できるようです。

プログラム例:

screen.fill((255,255,0), (10,10,300,200))

円を描画

円を描くにはpygame.draw.cycle()関数を使います。

pygame.draw.circle(screen, (255,0,0), (30,20), 50)

それぞれの引数は次のような役割です。

引数 説明
第1引数 screenオブジェクト screen
第2引数 図形のRGB色 (255,255,255)#←白色を表す
第3引数 円の中心座標(x, y) (30, 20)
第4引数 円の半径 50




楕円を描画

楕円を描くにはpygame.draw.ellipse()関数を使います。

pygame.draw.ellipse(screen, (255,0,255),(30,20,100,50,))

それぞれの引数は次のような役割です。

引数 説明
第1引数 screenオブジェクト screen
第2引数 図形のRGB色 (255,255,255)#←白色を表す
第3引数 図形の形状(中心x座標、中心y座標、幅、高さ)で指定 (30,20,100,50,)




多角形を描画

pygame.draw.polygon()関数を使うと、自分の設定した形の図形を書くことができます。

pygame.draw.polygon(screen, (255,0,0), [[40, 10], [50, 10],[20,60],[10, 60]])

それぞれの引数は次のような役割です。

引数 説明
第1引数 screenオブジェクト screen
第2引数 図形のRGB色 (255,255,255)#←白色を表す
第3引数 図形の形(後述) ( [[40, 10], [50, 10],[20,60])

なお、第三引数は図形の形を指定します。図形の形は、[頂点x座標, 頂点y座標]を複数含むリストで指定します。
指定した頂点を順に結んでいき面を形成して、その部分を塗りつぶす、という関数です。

頂点を指定する順番によって描画がおかしくなることがあるので注意が必要です。
また、「面」の描画なので、頂点の数は3つ以上必要です。



その他の図形描画関数については、このページをご覧ください。
draw - Pygameドキュメント 日本語訳