pyxen.Sprite

表示分配给 Entity 的可渲染图像。

Sprite 是不可变对象。要更改实体显示的内容,请替换精灵。

有关渲染概念,请参见精灵与渲染


构造函数

Sprite(
    image,
    *,
    tile=None,
    pivot=None,
    animation=None,
    loop=True
)

你可以将 image 作为位置参数或关键字参数传递——但不能同时使用两者。


参数

参数类型描述
imagestr图像素材的名称
tile(x, y, w, h)图像的子矩形
pivot(x, y)锚点(像素)
animationstr要播放的精灵动画名称
loopbool动画是否循环(默认 True

image(必需)

Sprite("hero")

如果图像不存在:

ValueError: Failed to load image 'hero'

tile(可选)

定义纹理的子矩形。

Sprite(
    "tileset",
    tile=(0, 0, 16, 16)
)

如果未指定,使用完整图像。


pivot(可选)

定义精灵的原点。

Sprite(
    "hero",
    pivot=(8, 8)
)

如果未指定:(0, 0)(左上角)。


animation(可选)

播放在精灵编辑器的动画时间轴中定义的命名动画。引擎从图像的元数据中读取动画数据(帧序列、FPS)并自动推进帧。

Sprite("hero", animation="walk")

不能与 tile 同时使用——只能选择其一。

动画在分配给实体时立即开始播放。默认循环播放。使用 loop=False 播放一次性动画:

Sprite("hero", animation="death", loop=False)

要检查动画状态,请使用实体上的 e.animation 组件。


loop(可选)

控制动画是否重复播放。仅与 animation 一起使用。默认值:True

Sprite("hero", animation="jump", loop=False)

示例

hero_sprite = Sprite(
    image="hero",
    tile=(0, 0, 16, 16),
    pivot=(8, 8)
)

动画精灵:

hero_sprite = Sprite(
    image="hero",
    animation="walk",
    pivot=(8, 8)
)

分配 Sprite

可以在生成时分配:

player = world.spawn(
    sprite=Sprite("hero"),
    x=32,
    y=32
)

或稍后:

player.sprite = Sprite("hero_idle")

Sprite 不可变性

Sprite 是不可变的——创建后无法修改。

替换实体的精灵:

player.sprite = Sprite("hero_jump")

颜色

实体暴露一个颜色属性,可以在不替换精灵的情况下对其着色:

entity.color = (r, g, b, a)

示例:

player.color = (1.0, 0.5, 0.5, 1.0)

默认颜色:(1.0, 1.0, 1.0, 1.0)

读取颜色返回一个 Color 对象:

c = player.color
print(c.r, c.g, c.b, c.a)

动画

推荐使用 animation 参数来制作精灵动画。在精灵编辑器中定义命名动画,然后按名称播放:

player.sprite = Sprite("hero", animation="walk")

通过赋值新的精灵来切换动画:

player.sprite = Sprite("hero", animation="idle")

对于一次性动画,通过实体的 animation 组件检查是否播放完毕:

player.sprite = Sprite("hero", animation="attack", loop=False)

def update():
    if player.animation and player.animation.finished:
        player.sprite = Sprite("hero", animation="idle")

手动动画

你也可以通过每帧替换精灵的图块来手动制作动画:

player.sprite = Sprite(
    "atlas",
    tile=(frame * 16, 0, 16, 16)
)

常见错误

缺少图像

Sprite()
ValueError: Sprite must have an image

重复的图像参数

Sprite("hero", image="hero")
TypeError: image specified both positionally and as keyword

Tile 和 Animation 冲突

Sprite("hero", tile=(0, 0, 16, 16), animation="walk")
TypeError: cannot specify both tile and animation

未找到动画

Sprite("hero", animation="fly")
ValueError: Animation 'fly' not found in 'hero'