pyxen.draw

draw 模块把图形直接画到屏幕上,只保留一帧。请在 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 用两种方式提供了同样的基本图形。它们在屏幕上完全一样,区别只在于存活时间。

Shape 组件draw
存活时间一直存在,直到你销毁该实体一帧
位置实体的位置、旋转与缩放你传入的世界坐标
开销一个完整实体:transform、图层、组件存储帧缓冲中的若干个四边形
适合游戏中的物体——飞船、墙壁、固定界面程序化图形、调试显示、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)

两点之间的直线。

参数类型说明
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线宽,单位像素。
closedbool为 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、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)

经过三个点的三角形。

参数类型说明
x1、y1、x2、y2、x3、y3float三个顶点。
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() 调用只会画一帧,然后就消失。
  • 绘制使用世界坐标,因此摄像机移动时它也会跟着移动。若想要固定不动的 HUD,请相对 camera 绘制, 或把界面放在一个不移动的摄像机上。
  • 本帧绘制的所有内容都会盖在本帧的精灵之上。