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