pyxen.draw

draw モジュールは、1 フレームだけ画面に直接図形を描きます。update() から呼び出してください。 描いたものはフレームの終わりで消えるので、次のフレームでも描き直さなければ見えなくなります。

from pyxen import *

def update():
    draw.circle(64, 64, 20, fill=(1, 0.2, 0.3, 1))
    draw.line(0, 0, 128, 128, color=(1, 1, 1, 1))

何も生成されず、何も残りません。保持しておくエンティティも、破棄するものもありません。


draw と Shape コンポーネントのどちらを使うか

Pyxen は同じプリミティブを 2 通り用意しています。画面上の見た目は同じで、違うのは寿命だけです。

Shape コンポーネントdraw
寿命エンティティを破棄するまで残る1 フレーム
位置エンティティの位置・回転・スケール渡したワールド座標
コスト完全なエンティティ(transform、レイヤー、コンポーネント記憶領域)フレームバッファ内のいくつかのクアッド
向いている用途船・壁・固定 UI などゲーム内の物体手続き的な図形、デバッグ表示、HUD のバー、軌跡

そのものがゲーム内の 存在 なら Shape を、すでに自分で管理しているものを絵として描くだけなら draw を選んでください。


色

色の引数はすべて、各成分が 0.0〜1.0 の (r, g, b, a) タプル、または Color を受け取ります。

draw.rect(10, 10, 40, 20, fill=(1, 0, 0, 1))        # 不透明な赤
draw.rect(10, 40, 40, 20, fill=(1, 0, 0, 0.35))     # 35% の赤

塗りつぶし系の図形は既定では何も描きません。 draw.rect、draw.triangle、draw.circle は fill も stroke も完全な透明から始まるため、どちらも渡さない呼び出しは見えません。これがこの モジュールで最もよくある落とし穴です。一方 draw.line と draw.polyline の既定値は不透明な白なので、 必ず表示されます。


関数

draw.line(x1, y1, x2, y2, color=(1,1,1,1), width=1)

2 点を結ぶ直線。

引数型説明
x1, y1float始点(ワールド座標)。
x2, y2float終点。
colorタプル線の色。既定は不透明な白。
widthfloat線の太さ(ピクセル)。既定は 1。
def update():
    draw.line(0, 64, 128, 64, color=(0.3, 1, 0.5, 1), width=2)

draw.polyline(points, color=(1,1,1,1), width=1, closed=False)

連続した線分の並び。

引数型説明
pointsタプルまたは FloatBuffer(x1, y1, x2, y2, …) という平坦な列。座標ペアのリストではありません。
colorタプル線の色。既定は不透明な白。
widthfloat線の太さ(ピクセル)。
closedboolTrue にすると最後の点と最初の点を結びます。
def update():
    draw.polyline((10, 10, 40, 60, 80, 20, 110, 70),
                  color=(1, 0.8, 0.2, 1), width=2)

平坦な並びなのは意図的です。FloatBuffer がすでにこの形をしているため、一度計算した経路を組み直さずに 毎フレームそのまま draw.polyline に渡せます。


draw.rect(x, y, width, height, fill=None, stroke=None, stroke_width=1)

軸に沿った長方形。x, y は中心ではなく角です。

引数型説明
x, yfloat角の位置。
width, heightfloat大きさ(ピクセル)。
fillタプル内側の色。省略すると塗りません。
strokeタプル輪郭の色。省略すると描きません。
stroke_widthfloat輪郭の太さ。既定は 1。
def update():
    # 体力バー:暗い下地、明るい塗り、細い輪郭。
    draw.rect(4, 4, 60, 6, fill=(0.1, 0.1, 0.1, 1))
    draw.rect(4, 4, 60 * health / max_health, 6, fill=(0.2, 1, 0.4, 1))
    draw.rect(4, 4, 60, 6, stroke=(1, 1, 1, 0.5))

draw.triangle(x1, y1, x2, y2, x3, y3, fill=None, stroke=None, stroke_width=1)

3 点を通る三角形。

引数型説明
x1, y1, x2, y2, x3, y3float3 つの頂点。
fillタプル内側の色。省略すると塗りません。
strokeタプル輪郭の色。省略すると描きません。
stroke_widthfloat輪郭の太さ。
def update():
    draw.triangle(64, 20, 84, 60, 44, 60, fill=(1, 1, 0.3, 1))

draw.circle(x, y, radius, fill=None, stroke=None, stroke_width=1, segments=12)

中心点を囲む円。

引数型説明
x, yfloat中心の位置。
radiusfloat半径(ピクセル)。
fillタプル内側の色。省略すると塗りません。
strokeタプル輪郭の色。省略すると描きません。
stroke_widthfloat輪郭の太さ。
segmentsint曲線を近似する直線の分割数。既定は 12。

円は実際には多角形です。小さいサイズなら 12 分割で丸く見えます。大きな円では値を上げ、多角形らしさを 見せたいときは下げてください。

def update():
    draw.circle(64, 64, 24, fill=(0.2, 0.4, 1, 1), segments=32)
    draw.circle(64, 64, 30, stroke=(1, 1, 1, 0.4), segments=32)

注意

  • draw の呼び出しは update() に書きます。start() から呼ぶと 1 フレームだけ描かれて消えます。
  • 描画はワールド座標で行われるため、カメラが動けば一緒に動きます。固定したい HUD は camera を基準に 描くか、動かないカメラの上に置いてください。
  • そのフレームで描いたものは、同じフレームのスプライトより上に重なります。