【问题标题】:How do I clear a pygame alpha layer efficiently?如何有效地清除 pygame alpha 层?
【发布时间】:2011-11-14 23:37:42
【问题描述】:

我正在尝试使用 python / pygame 编写一个 2D 游戏,该游戏在每次屏幕刷新时将多个图层叠加在一起。我的基本设置是(从下到上):

  • 背景:表面(不透明),以不同于静止的速度滚动
  • 中景:SRCALPHA 透明表面(静态)
  • 玩家/精灵/敌人:精灵组
  • 前景:SRCALPHA 透明表面(静态)

现在,我在每个屏幕上将这四个图层一层一层地传送。背景以与其他三层不同的速度滚动,这就是为什么我将它与中景分开的原因。由于我现在已经构建了游戏,它可以在我相当普通的笔记本电脑上以 60fps 的速度运行。

-但是- 我在精灵组上遇到了问题,我直接将其传送到屏幕上。必须根据我当前的视口调整每个精灵的矩形似乎是一种丑陋的编程方式,我想要一个更优雅的解决方案。

我很想将精灵 blit 到另一个我可以管理的透明表面,但这就是我的问题:我找不到清除透明层的方法,这不会使我的性能减半。我尝试过的一些设置:

  • 我尝试使用混合模式 rgba_sub (surf.fill((255,255,255,255), area, BLEND_RGBA_SUB)) 用白色表面填充图层——这太棒了,太慢了
  • 我已经尝试了一个空白表面的 surface.copy() - 这更快,但我的 fps 仍然减半
  • 我尝试将精灵与中间层相结合,并使用 pygame.sprite.LayeredUpdates 来更新精灵。这对性能没有影响,但在中景透明的情况下不起作用。我在背景层上看到了精灵的踪迹。

到目前为止,我发现的最佳解决方案是我当前将精灵直接绘制到屏幕上的设置。它看起来很棒,运行速度很快,但管理起来很痛苦,因为我必须确保每个精灵的矩形都根据每一帧的视口进行调整。它也使碰撞检测变得困难。

还有另一种快速清除 pygame 透明表面的方法吗?快速,每秒可以完成 60 次以上? 或者,我的图层是否有设置仍然可以达到相同的效果?

【问题讨论】:

    标签: python 2d transparency pygame


    【解决方案1】:

    我想出了一种快速清除精灵透明层的方法,方法是将彼得的解决方案选择性地应用于图层:

    for s in self.level.sprites:
      spritelayer.fill((0), s.rect)
    

    这似乎工作正常(每帧擦除所有内容)并且仍然以 60fps 运行。

    【讨论】:

      【解决方案2】:

      Surface.fill() 将清除所有 R、G、B 和 A 值。

      >>> img = pygame.image.load("hasalpha.png")
      >>> print img.get_at((300, 300))
      (238, 240, 239, 255)
      >>> surface.fill(0)
      >>> print img.get_at((300, 300))
      (0, 0, 0, 0)
      

      听起来这将按照您的描述进行。如果您尝试对 alpha 值进行更具体的操作,pygame.surfarray.pixel 函数可以为您提供直接可编辑的值。这会很快,但需要 numpy 作为依赖项。

      【讨论】:

      • 这似乎比 surf.fill((255,255,255,255), area, BLEND_RGBA_SUB) 运行得更快,但是当我在整个图层上运行它时,性能仍然减半。
      • 啊哈!但是当我只在精灵矩形上应用它时,它运行得很快:D 谢谢先生!
      猜你喜欢
      • 2011-01-15
      • 2013-10-03
      • 2013-10-26
      • 2017-03-05
      • 1970-01-01
      • 1970-01-01
      • 2016-09-15
      • 2014-04-01
      • 1970-01-01
      相关资源
      最近更新 更多