如何有效清除pygame alpha图层?

时间:2011-09-12 00:21:30

标签: python 2d transparency pygame

我正在尝试使用python / pygame编写一个2D游戏,每次屏幕刷新时都会在另一个上面打几层。我的基本设置是(从下到上):

  • 背景:表面(不透明),以不同于其余的速率滚动
  • Midground:SRCALPHA透明表面(静态)
  • 玩家/精灵/敌人:精灵组
  • Forground:SRCALPHA透明表面(静态)

现在,我正在将这四个图层分别放在另一个屏幕上。背景以不同于其他三个层的速率滚动,这就是为什么我将它与midground分开。正如我现在的游戏结构一样,它以60fps的速度在我相当适中的笔记本电脑上运行。

-BUT-我在sprite组遇到了麻烦,我直接在屏幕上进行了操作。根据我当前的视口调整每个精灵的矩形似乎是编程事物的一种丑陋方式,我想要一个更优雅的解决方案。

我喜欢把精灵砸到另一个我可以管理的透明表面上,但是我的问题就在于:我找不到一种清除透明层的方法,而这种透明层并不是我性能的一半。我试过的一些设置:

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

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

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

2 个答案:

答案 0 :(得分:1)

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作为依赖。

答案 1 :(得分:1)

通过将Peter的解决方案选择性地应用于图层,我找到了一种快速清除精灵仅透明层的方法:

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

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