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, y1 | float | 始点(ワールド座標)。 |
x2, y2 | float | 終点。 |
color | タプル | 線の色。既定は不透明な白。 |
width | float | 線の太さ(ピクセル)。既定は 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 | タプル | 線の色。既定は不透明な白。 |
width | float | 線の太さ(ピクセル)。 |
closed | bool | True にすると最後の点と最初の点を結びます。 |
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, y | float | 角の位置。 |
width, height | float | 大きさ(ピクセル)。 |
fill | タプル | 内側の色。省略すると塗りません。 |
stroke | タプル | 輪郭の色。省略すると描きません。 |
stroke_width | float | 輪郭の太さ。既定は 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, y3 | float | 3 つの頂点。 |
fill | タプル | 内側の色。省略すると塗りません。 |
stroke | タプル | 輪郭の色。省略すると描きません。 |
stroke_width | float | 輪郭の太さ。 |
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, y | float | 中心の位置。 |
radius | float | 半径(ピクセル)。 |
fill | タプル | 内側の色。省略すると塗りません。 |
stroke | タプル | 輪郭の色。省略すると描きません。 |
stroke_width | float | 輪郭の太さ。 |
segments | int | 曲線を近似する直線の分割数。既定は 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を基準に 描くか、動かないカメラの上に置いてください。 - そのフレームで描いたものは、同じフレームのスプライトより上に重なります。