pygame
画面に描く
サーチ…
構文
- pygame.draw.rect(Surface、color、Rect、width = 0)
- pygame.draw.polygon(サーフェス、カラー、ポイントリスト、幅= 0)
- pygame.draw.circle(Surface、color、pos、radius、width = 0)
- pygame.draw.ellipse(Surface、color、Rect、width = 0)
- pygame.draw.arc(Surface、color、Rect、start_angle、stop_angle、width = 1)
- pygame.draw.line(Surface、color、start_pos、end_pos、width = 1)
- pygame.draw.lines(サーフェス、色、閉じ、ポイントリスト、幅= 1)
- pygame.draw.aaline(Surface、color、startpos、endpos、blend = 1)
- pygame.draw.aalines(サーフェス、カラー、閉じ、ポイントリスト、ブレンド= 1)
パラメーター
パラメーター | 詳細 |
---|---|
表面 | シェイプを描画するSurface。 |
色 | 赤、緑、青(およびアルファ)を表す3または4の整数シーケンス。各値は0〜255の範囲です。 |
長方形 | シェイプが描画される矩形領域。 |
幅 | 線の幅。幅= 0の場合、図形は塗りつぶされます。 |
ポイントリスト | 任意の点/頂点のリスト(ピクセル単位(x、y))。 |
pos | 円の中心の位置(ピクセル単位)です(x、y)。 |
半径 | 円の半径はピクセルです。 |
閉まっている | trueの場合、最後と最初の点の間の線が描画され、図形が閉じます。 |
ブレンド= 1 | trueの場合、上書きする代わりに既存のピクセルシェードとシェードをブレンドします。 |
start_angle | アークの初期角度(ラジアン)。 |
stop_angle | ラジアン単位の円弧の最終角度です。 |
start_pos | 行の開始位置(ピクセル単位)。 |
end_pos | ラインの終了位置(ピクセル単位) |
ドローモジュールによる描画
Pygameには、サーフェスに直接シェイプを描画できる関数を含むpygame.draw
というモジュールがあります。
関数 | 説明 |
---|---|
pygame.draw.rect | 長方形を描く |
pygame.draw.polygon | 任意の数の辺を持つ形状を描く |
pygame.draw.circle | 一点の周りに円を描く |
pygame.draw.ellipse | 矩形の内側に丸い形を描画する |
pygame.draw.arc | 楕円の部分的な部分を描画する |
pygame.draw.line | 直線部分を描く |
pygame.draw.lines | 複数の連続した線分を描画する |
pygame.draw.aaline | 細かいアンチエイリアス線を描画する |
pygame.draw.aalines | 接続された一連のアンチエイリアシングされた線を描画する |
モジュールの使い方
モジュールを使用するには、最初にpygameをインポートして初期化し、ディスプレイのモードを設定する必要があります。色定数をあらかじめ定義しておけば、コードをより読みやすく美しくすることができます。すべての関数は、描画するサーフェス、色、 pygame.draw.circle
または2要素の整数/浮動小数点数のいずれかの引数をとります( pygame.draw.circle
は未定義の理由から整数のみをとります)。
例
以下のコードは、すべての異なる機能、使用方法、および外観を示します。例の前にpygameを初期化し、いくつかの定数を定義します。
import pygame
from math import pi
pygame.init()
screen = pygame.display.set_mode((100, 100))
WHITE = pygame.Color(255, 255, 255)
RED = pygame.Color(255, 0, 0)
黒色はサーフェスのデフォルトカラーであり、描画されていないサーフェスの部分を表します。各関数のパラメータは、 パラメータの下にダウンして説明します。
長方形
size = (50, 50)
rect_border = pygame.Surface(size) # Create a Surface to draw on.
pygame.draw.rect(rect_border, RED, rect_border.get_rect(), 10) # Draw on it.
rect_filled = pygame.Surface(size)
pygame.draw.rect(rect_filled, RED, rect_filled.get_rect())
ポリゴン
size = (50, 50)
points = [(25, 0), (50, 25), (25, 50), (0, 25)] # The corner points of the polygon.
polygon = pygame.Surface(size)
pygame.draw.polygon(polygon, RED, points, 10)
polygon_filled = pygame.Surface(size)
pygame.draw.polygon(polygon_filled, RED, points)
サークル
size = (50, 50)
radius = 25
circle = pygame.Surface(size)
pygame.draw.circle(circle, RED, (radius, radius), radius, 10) # Position is the center of the circle.
circle_filled = pygame.Surface(size)
pygame.draw.circle(circle_filled, RED, (radius, radius), radius)
この穴は、パイゲームの描画アルゴリズムの残念な結果です。
楕円
size = (50, 25) # Minimize it's height so it doesn't look like a circle.
ellipse = pygame.Surface(size)
pygame.draw.ellipse(ellipse, RED, ellipse.get_rect(), 5)
ellipse_filled = pygame.Surface(size)
pygame.draw.ellipse(ellipse_filled, RED, ellipse.get_rect())
この穴は、パイゲームの描画アルゴリズムの残念な結果です。
アーク
size = (50, 50)
arc = pygame.Surface(size)
pygame.draw.arc(arc, RED, arc.get_rect(), 0, pi) # 0 to pi is 180° creating a half circle.
ライン
size = (50, 50)
line = pygame.Surface(size)
pygame.draw.line(line, RED, (0, 0), (50, 50)) # Start at topleft and ends at bottomright.
ライン
size = (50, 50)
points = [(25, 0), (50, 25), (25, 50), (0, 25)]
lines = pygame.Surface(size)
pygame.draw.lines(lines, RED, False, points)
lines_closed = pygame.Surface(size)
pygame.draw.lines(lines_closed, RED, True, points)
アンチエイリアス処理されたライン
size = (50, 50)
antialiased_line = pygame.Surface(size)
pygame.draw.aaline(antialiased_line, RED, (0, 0), (50, 50))
アンチエイリアス処理された行
size = (50, 50)
points = [(25, 0), (50, 25), (25, 50), (0, 25)]
antialiased_lines = pygame.Surface(size)
pygame.draw.aalines(antialiased_lines, RED, False, points)
antialiased_lines_closed = pygame.Surface(size)
pygame.draw.aalines(antialiased_lines_closed, RED, True, points)
やってみよう
上記のコードスニペットと下のコードのいずれかを空のファイルにコピーし、名前の画像をblitして実験したいSurfaceの名前に変更します。
import pygame
from math import pi
pygame.init()
screen = pygame.display.set_mode((100, 100))
WHITE = pygame.Color(255, 255, 255)
RED = pygame.Color(255, 0, 0)
# But code snippet here
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
quit()
screen.blit(image, (25, 25))
pygame.display.update()
サーフェス
パイゲームでは、通常、サーフェスを使用してオブジェクトの外観を表し、四角形はその位置を表します。サーフェスは、色や画像を含む白紙のようなものです。サーフェスを作成するには、最初から空白を挿入する方法と、画像を読み込む方法があります。
サーフェスを作成する
サーフェスを作成するには、必要最小限のサイズでなければなりません。これは、幅と高さの2要素の整数シーケンスで、サイズをピクセル単位で表します。
サーフェスを作成してビット深度、マスク、およびピクセルごとのアルファとしての追加機能を制御したり、ビデオメモリに画像を作成したりするときに、追加の引数を渡すこともできます。しかし、これはこの例の範囲外です。
size = width, height = (32, 32)
empty_surface = pygame.Surface(size)
pygame.draw
モジュールを使用してサーフェスにシェイプを描画するか、サーフェスメソッドfill(color)
呼び出してカラーで塗りつぶすことができます。引数colorは、3要素または4要素の整数シーケンスまたはpygame.Color
オブジェクトです。
画像を読み込む
多くの場合、あなたは自分のイメージをゲーム(スプライト)で使用したいと思うでしょう。イメージを使ってサーフェスを作成するのは簡単です:
my_image = pygame.image.load(path_to_image)
イメージへのパスは、相対パスまたは絶対パスにすることができます。パフォーマンスを向上させるには、画像を画面と同じピクセル形式に変換するのが普通です。これは、次のようにSurfaceメソッドconvert()
呼び出すことで実行できます。
my_image = pygame.image.load(path_to_image).convert()
画像に透明度(アルファ値)が含まれている場合は、代わりにconvert_alpha()
メソッドを呼び出しconvert_alpha()
。
my_image = pygame.image.load(path_to_image).convert_alpha()
ブリッティング
サーフェスは、それらを表示できるように、画面に対してblitする必要があります。基本的にブリッティングとは、あるサーフェスから別のサーフェスにピクセルをコピーすることです(スクリーンもサーフェスです)。また、Surfaceの位置を渡す必要があります。これは、2要素の整数シーケンスまたはRectオブジェクトでなければなりません。サーフェスの頂点がその位置に配置されます。
screen.blit(my_image, (0, 0))
pygame.display.update() # or pygame.display.flip()
スクリーン以外のサーフェスにblitすることは可能です。画面にblittedされた内容を表示するには、 pygame.display.update()
またはpygame.display.flip()
を呼び出す必要があります。
透明性
pygameには、カラーキー、サーフェイスアルファ、ピクセルごとのアルファの3種類の透明度がサポートされています。
カラーキー
色を完全に透明にするか、より正確に表現すると、単に色がblitにならないようにします。内部に黒い矩形の画像がある場合は、カラーキーを設定して黒の色がブリットしないようにすることができます。
BLACK = (0, 0, 0)
my_image.set_colorkey(BLACK) # Black colors will not be blit.
サーフェスは1つのカラーキーしか持つことができません。別のカラーキーを設定すると、前の色を上書きします。カラーキーは異なるアルファ値を持つことはできません。カラーキーは表示されません。
面アルファ
Surface全体をアルファ値で透明にします。この方法では、異なるアルファ値を持つことができますが、サーフェス全体に影響します。
my_image.set_alpha(100) # 0 is fully transparent and 255 fully opaque.
ピクセルごとのアルファ
サーフェイス内のすべてのピクセルを個別のアルファ値で透明にします。これはあなたに最も自由度と柔軟性を与えますが、最も遅い方法です。この方法では、サーフェスをピクセルごとのアルファサーフェスとして作成する必要があり、カラー引数には4番目のアルファ整数が含まれている必要があります。
size = width, height = (32, 32)
my_image = pygame.Surface(size, pygame.SRCALPHA) # Creates an empty per-pixel alpha Surface.
サーフェスは、カラーに4番目のアルファ値が含まれている場合、透明度を描画します。
BLUE = (0, 0, 255, 255)
pygame.draw.rect(my_image, BLUE, my_image.get_rect(), 10)
他のサーフェスとは異なり、このサーフェスのデフォルトカラーは黒ではなく透明です。だから、中央の黒い四角形が消えるのです。
カラーキーとサーフェスアルファを組み合わせる
カラーキーとサーフェイスのアルファを組み合わせることはできますが、ピクセルごとのアルファは組み合わせることはできません。これは、ピクセル単位のサーフェスのパフォーマンスを低下させたくない場合に便利です。
purple_image.set_colorkey(BLACK)
purple_image.set_alpha(50)
フルコード
これを空のファイルにコピーして実行します。 1、2、3、または4のキーを押して、画像を表示させます。 2、3、または4を複数回押して、より不透明にします。
import pygame
pygame.init()
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255, 50) # This color contains an extra integer. It's the alpha value.
PURPLE = (255, 0, 255)
screen = pygame.display.set_mode((200, 325))
screen.fill(WHITE) # Make the background white. Remember that the screen is a Surface!
clock = pygame.time.Clock()
size = (50, 50)
red_image = pygame.Surface(size)
green_image = pygame.Surface(size)
blue_image = pygame.Surface(size, pygame.SRCALPHA) # Contains a flag telling pygame that the Surface is per-pixel alpha
purple_image = pygame.Surface(size)
red_image.set_colorkey(BLACK)
green_image.set_alpha(50)
# For the 'blue_image' it's the alpha value of the color that's been drawn to each pixel that determines transparency.
purple_image.set_colorkey(BLACK)
purple_image.set_alpha(50)
pygame.draw.rect(red_image, RED, red_image.get_rect(), 10)
pygame.draw.rect(green_image, GREEN, green_image.get_rect(), 10)
pygame.draw.rect(blue_image, BLUE, blue_image.get_rect(), 10)
pygame.draw.rect(purple_image, PURPLE, purple_image.get_rect(), 10)
while True:
clock.tick(60)
for event in pygame.event.get():
if event.type == pygame.QUIT:
quit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_1:
screen.blit(red_image, (75, 25))
elif event.key == pygame.K_2:
screen.blit(green_image, (75, 100))
elif event.key == pygame.K_3:
screen.blit(blue_image, (75, 175))
elif event.key == pygame.K_4:
screen.blit(purple_image, (75, 250))
pygame.display.update()