【问题标题】:What is the best way to change the sprite used to display an object?更改用于显示对象的精灵的最佳方法是什么?
【发布时间】:2016-04-01 19:28:43
【问题描述】:

我有一个对象,它会根据它面对的方向改变它的显示。该对象采用 4x4 帧网格,并使用每行 4 帧作为每个状态的动画。

目前,我正在使用以下方法将它们加载到单独的精灵中:

def create_animation(image_grid, start_idx, end_idx):
    frames = []
    for frame in image_grid[start_idx:end_idx]:
        frames.append(pyglet.image.AnimationFrame(frame, 0.1))
    return pyglet.sprite.Sprite(pyglet.image.Animation(frames))

然后将应该显示的精灵添加到要绘制的batch,并在不应该绘制时将其删除。

但是,阅读文档时,我看到了:

Sprite.batch

精灵可以从一个批次迁移到另一个批次,或从其批次中移除(用于单个绘图)。请注意,这可能是一项昂贵的操作。

有没有更好的方法来实现我正在尝试做的事情,而不会影响批量切换单个精灵的性能?

【问题讨论】:

  • 您可以尝试在需要时简单地翻转精灵的visible 属性,然后将它们留在批处理中。检查visible 布尔值以查看是否应绘制精灵应该比将它们从批次中交换更快。
  • @Josh 这就是我最终做的事情,愿意把它写成答案吗?

标签: python python-3.x pyglet


【解决方案1】:

您可以将图像加载为 TextureGrid:

    img = pyglet.resource.image("obj_grid.png")
    img_grid = pyglet.image.ImageGrid(   
        img,
        4,  # rows, direction
        4  # cols, frames of the animation
    )
    texture_grid = pyglet.image.TextureGrid(img_grid)  # this is the one you actually use

创建你的(单个)精灵:

    batch = pyglet.graphics.Batch()  # unless you already have a batch
    my_object = pyglet.sprite.Sprite(
        img=texture_grid[0, 0],  # [row, col] for starting grid /frame
        batch=batch
    )

确定/改变方向(“行”,我根据输入猜测?)。

循环 0-3(动画的“col”/帧):

    pyglet.clock.schedule_interval(change_frame, 0.1, my_object)

    def change_frame(dt, my_object):  # pyglet always passes 'dt' as argument on scheduled calls
        my_object.col += 1
        my_object.col = my_object.col & 3 #  or my_object.col % 3 if its not a power of 2

并手动设置框架:

    current_frame = self.texture_grid[self.row, self.col].get_texture()
    my_object._set_texture(current_frame)

没有对 draw() 的额外调用,也没有弄乱 batch()。一切都照常绘制,但您可以根据需要更改它绘制的纹理:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 2014-09-03
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多