【发布时间】:2021-01-17 14:46:12
【问题描述】:
在图像中,红色轨迹是 pygame 在我在精灵周围添加边界矩形时创建的轨迹。精灵也这样做,最简单的解决方案是在每次重绘后将表面清除为黑色。然而,尝试在整个主表面上这样做并不是一个好主意。我该如何解决这个问题?
【问题讨论】:
在图像中,红色轨迹是 pygame 在我在精灵周围添加边界矩形时创建的轨迹。精灵也这样做,最简单的解决方案是在每次重绘后将表面清除为黑色。然而,尝试在整个主表面上这样做并不是一个好主意。我该如何解决这个问题?
【问题讨论】:
通常你会这样做:
def draw():
# fill screen with solid color.
# draw, and flip/update screen.
但是,您可以只更新屏幕的脏部分。见pygame.display.update():
pygame.display.update()
为软件显示更新屏幕部分update(rectangle=None) -> Noneupdate(rectangle_list) -> None这个函数类似于 pygame.display.flip() 用于软件显示的优化版本。它只允许一部分 要更新的屏幕,而不是整个区域。如果没有参数 通过它会更新整个 Surface 区域,例如 pygame.display.flip().
您可以将单个矩形或一系列矩形传递给函数。一次传递多个矩形比传递多个矩形更有效 使用单个或部分列表多次调用更新 矩形。如果传递一系列矩形,则可以安全地包含 列表中没有值,将被跳过。
最好和RenderUpdates结合使用,也就是Sprite.Group:
pygame.sprite.RenderUpdates
跟踪脏更新的组子类。RenderUpdates(*sprites) -> RenderUpdates
这个类派生自 pygame.sprite.Group()。它有一个扩展的 draw() 方法来跟踪屏幕的变化区域。
【讨论】:
只要有一个黑色矩形,然后在上一帧上你的精灵所在的位置上方进行 blit 处理,应该可以去掉它。请记住在对精灵进行 blit 之前执行此操作,否则您的新精灵将被部分涂黑。
【讨论】:
取您的屏幕名称。 (就我而言,它是屏幕。)然后……
screen.fill((0, 0, 0))
把它放在 bliting 之前和绘图之后。 (它会变成黑色背景。) 希望这会有所帮助!
【讨论】:
如果你想避免重绘整个屏幕,那么只需修复被你的精灵“损坏”的区域。已经建议在您的精灵所在的位置绘制一个黑色矩形。如果您的背景始终是全黑的,则此方法有效。但是,如果有背景图片,那么您可以只将背景图片的损坏部分复制回屏幕。
如果背景更加动态,那么另一种解决方案是在绘制精灵之前复制您将用精灵覆盖的屏幕部分,并将其存储在某个地方。然后绘制精灵,必要时翻转屏幕。在移动精灵之前,将保存的背景部分复制回屏幕,然后再重复一遍。
【讨论】: