【问题标题】:Pygame Surface layers: Transparent sprite layer issuesPygame 表面层:透明精灵层问题
【发布时间】:2014-01-13 00:08:32
【问题描述】:

我正在使用surface.fill(color, rect) 在精灵表面上绘制一个彩色小方块,然后按以下顺序显示在其他表面之上:

  1. 背景表面
  2. 迷宫表面
  3. 精灵表面

目前我遇到了一个问题,我的精灵在屏幕上涂抹,因为我没有每次都擦拭屏幕。 如何消除这种拖尾效果,同时防止精灵图层覆盖其他图层?

图层代码 - 已初始化,但未更新每一帧。

game_surface = pygame.Surface((self.canvas.get_size()))
game_surface = game_surface.convert()
game_surface.fill((0,0,255))
maze_surface = pygame.Surface((self.canvas.get_size()))
maze_surface = maze_surface.convert_alpha()
maze_surface.fill((0,0,255,0))
play_surface = pygame.Surface((self.canvas.get_size()))
play_surface = play_surface.convert_alpha()
play_surface.fill((0,0,0,0))

目前只有play_surface 实际使用透明度,但最终play_surfacemaze_surface 都需要是透明的。

精灵图层更新 - 每次移动精灵时调用。

def update(self, canvas):

    # move sprite if keys pressed (not shown)

    self.surface.fill((0,0,0,0)) # Newest screen fill attempt. Causes smearing effect
    self.surface.fill(self.color, self.rect) # draw green square
    canvas.blit(self.surface, (0,0))

涂抹效果:红色 = maze_layer,绿色 = 涂抹精灵 Alternate sprite fill - 以上的修改版本

def update(self, canvas):

    # move sprite if keys pressed (not shown)

    self.surface.fill((0,0,0)) # Original screen fill. Covers up lower layers
    self.surface.fill(self.color, self.rect) # draw green square
    canvas.blit(self.surface, (0,0))

不透明 - 黑色 = 填充颜色(我想这样做而不覆盖其他图层)

我怎样才能消除这种拖尾效应(图 1),同时防止精灵层覆盖其他层(图 2)?非常感谢任何帮助。

【问题讨论】:

    标签: python pygame


    【解决方案1】:

    您需要重新绘制精灵覆盖的背景,更新它们的位置,然后在新位置重新绘制精灵。

    您可能有兴趣探索内置支持此功能的pygame.sprite 模块。您可以创建pygame.sprite.Sprite 的子类:

    1. 覆盖update(self) 方法(可选)
    2. 具有用于将它们绘制到屏幕上的 self.imageself.rect 属性
    3. 被添加到pygame.sprite.Group 实例中

    Pygame 的精灵组类(如GroupGroupSingleLayeredUpdates 等)包括像pygame.sprite.Group.clear(surface_dest, background)(见documentation)这样的方法,以方便在您的设备上重新绘制背景图像的任务。在移动并在其他地方重新绘制它们之前的精灵。

    【讨论】:

    • 我希望有一种方法可以在不重绘每一帧背景的情况下做到这一点,因为背景不会改变并且重绘它是多余的。
    • 好吧,Pygame 显示表面已经在背景的一部分上绘制了精灵,因此必须在某些时候再次在此处绘制背景。然而,这可以通过仅重绘每个精灵下的区域来优化,而不是整个屏幕。我提到的pygame.sprite.Group.clear 方法只会重绘组中每个pygame.Spriterect 属性下的区域,这可能会有所帮助。
    • 我试图创建一个Sprite 组和对象,但我收到了错误'Player' object has no attribute 'image'。我不想使用图像来表示精灵,这就是我使用fill 方法的原因。你知道我如何在不分配image 属性的情况下绘制精灵吗?
    • 我认为pygame.sprite 模块没有任何东西可以支持这种自定义绘图。您可能只需要维护一个rect 属性,并为您的精灵使用self.image = None。然后您可以使用其他功能,并使用您自己的系统处理绘图。
    • 据我尝试,使用sprite.Group.clear 会导致我的绘图功能中断或无法正常工作。屏幕清除,但精灵没有绘制(只是一个红色的屏幕)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 2023-03-23
    相关资源
    最近更新 更多