Pygame表层:透明的精灵层问题

时间:2013-12-24 19:54:42

标签: python pygame

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

  1. 背景表面
  2. 迷宫表面
  3. 精灵表面
  4. 目前我遇到一个问题,我的精灵在屏幕上涂抹,因为我不是每次都擦屏。 如何在保持精灵图层覆盖其他图层的同时消除这种拖尾效应?

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

    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都需要透明。

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

    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,绿色=涂抹精灵 Red = maze_layer, Green = sprite 替代精灵填充 - 上述

    的修改版本
    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))
    

    非透明度 - 黑色=填充颜色(我希望这样做而不会遮盖其他图层) Non-transparent :(

    如何在保持精灵层覆盖其他层(图2)的同时消除这种拖尾效应(图1)?非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

你需要重新绘制精灵所覆盖的背景,更新它们的位置,然后将精灵重新绘制到新的位置。

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

  1. 覆盖update(self)方法(可选)
  2. 拥有用于将其绘制到屏幕的self.imageself.rect属性
  3. 已添加到pygame.sprite.Group个实例
  4. Pygame的sprite组类(例如GroupGroupSingleLayeredUpdates等)包括pygame.sprite.Group.clear(surface_dest, background)等方法(请参阅documentation)以方便在移动之前重新绘制精灵上的背景图像并在其他地方重新绘制它们的任务。