【问题标题】:Is there any way to "clear" a surface?有什么方法可以“清除”表面吗?
【发布时间】:2023-03-23 09:10:02
【问题描述】:

有没有什么办法可以清除表面上的任何东西?

【问题讨论】:

  • 您使用的是哪个工具包? Tk、Qt、Gtk、WxWidgets?
  • TkInter 我猜,或者我真的不知道?我所有的图形都使用 pygame。
  • 是的,确实有方法。
  • 如果是pygame:为什么不直接用纯色填充表面(必然有填充方法)......
  • @Eric:如果您使用的是 pygame,请更新问题以实际说明您正在使用 pygame。

标签: python pygame geometry-surface blit


【解决方案1】:

如果您想要使 pygame Surface 对象“干净”,即擦除所有贴在它上面的图像,在每个游戏循环中给它贴上新图像,并在不创建新表面的情况下保持对等像素 alpha,您可以填充它,但不要使用纯色,而是使用透明色

from pygame import Color, Surface
empty = Color(0,0,0,0) #The last 0 indicates 0 alpha, a transparent color
field = Surface((width, height), flags=SRCALPHA)

#Inside the game loop
field.fill(empty)

*抱歉我的英文不好,还在学习中

【讨论】:

    【解决方案2】:

    当我不关心性能时,我使用:

    mysurface.fill((0,0,0))
    

    它将在整个表面上绘制指定的颜色(在本例中为黑色)。这就是你所说的“清晰”吗?

    哦,当然,您需要在执行此操作后“翻转”表面以使其在屏幕上可见。

    【讨论】:

      【解决方案3】:

      我不知道你使用的是什么 API,所以这里是一个模糊的答案:

      在几乎所有情况下,“清除”表面只是将与表面大小相同的彩色四边形粘贴到其上。使用的颜色是您想要的清晰颜色。

      如果您知道如何进行 blit,只需将相同大小的白色四边形 blit 到表面上。

      【讨论】:

        【解决方案4】:

        您无法撤消写在另一个图形顶部的一个图形,就像您无法撤消在同一板上的另一个粉笔插图顶部绘制的一个粉笔插图一样。

        通常在图形中完成的是您对黑板所做的 - 清除所有内容,下次只重绘您想要保留的内容。

        【讨论】:

          【解决方案5】:

          我也有这个问题

          创建表面:

          mask=pygame.Surface((180,100),pygame.SRCALPHA)
          

          清除表面:

          mask.fill
          mask.set_alpha(255)
          

          画你的线条/图像等

          然后使用 Alpha Blend 标志将该表面粘贴到您的主表面上

          screen.blit(mask,(0,0),special_flags=(pygame.BLEND_RGBA_ADD))
          

          【讨论】:

            【解决方案6】:

            .fill((255,255,255,0)) 似乎对我有用。

            【讨论】:

              【解决方案7】:

              我在自己制作的游戏中使用了以下内容:

              self.image = 0 #to empty it
              self.image = pygame.image.load("image")
              

              【讨论】:

                【解决方案8】:

                对于 pygame 你可以使用Surface.fill

                【讨论】:

                • 是的,我可以使用它,但这里有一个棘手的部分:我的表面在另一个表面上被 blitted,并且正在使用 SRCALPHA 标志来支持透明度。如果我用纯色填充整个表面,我的整个游戏板都会变成那种颜色,因为这个表面被所有东西都覆盖了......而且我不知道如何解决这个问题
                • @Eric,您应该将这些要求添加到您的问题中
                【解决方案9】:

                用 fill 填充表面,然后用 set_alpha 使其透明

                surface.fill
                surface.set_alpha(255)
                

                【讨论】:

                • 啊,我明白你现在要做什么了。不,您无法撤消表面上的 blit。听从 Kylotan 的建议。
                【解决方案10】:

                如果您想在 blitting 之前清除表面,您可以先用不太可能的随机颜色填充表面,使用该颜色设置 alpha(颜色键),然后将具有透明背景的原始精灵 blit 回到表面上。

                idle_image = pg.image.load("sprite.png") #sprite with transparent background
                temp_color = pg.Color(132, 23, 213, 255) #random unlikely replacement color
                
                def clear_surface(surface):
                    surface.fill(st.temp_color)
                    surface.set_colorkey(st.temp_color)
                    surface.blit(idle_image, (0,0))
                

                【讨论】:

                  【解决方案11】:

                  您可以通过使其透明来清除表面。 下面是我如何使用空颜色 RGB 通过将表面设置为切换到透明版本来使文本闪烁。

                  from __future__ import absolute_import, division, print_function
                  from itertools import cycle
                  import pygame
                  
                  VISITOR_TTF_FILENAME = 'pixelFont.ttf'
                  BLINK_EVENT = pygame.USEREVENT + 0
                  empty = (255,255,255,0)
                  
                  
                  def main():
                      pygame.init()
                      try:
                          screen = pygame.display.set_mode((800, 600))
                          screen.fill((255,255,255))
                          screen_rect = screen.get_rect()
                  
                          clock = pygame.time.Clock()
                  
                          font = pygame.font.Font(VISITOR_TTF_FILENAME, 50)
                          on_text_surface = font.render(
                              'Press Any Key To Start', True, pygame.Color('green3')
                          )
                          blink_rect = on_text_surface.get_rect()
                          blink_rect.center = screen_rect.center
                          off_text_surface = pygame.Surface(blink_rect.size)
                          off_text_surface.fill(empty)
                          
                          blink_surfaces = cycle([on_text_surface, off_text_surface])
                          blink_surface = next(blink_surfaces)
                          pygame.time.set_timer(BLINK_EVENT, 1000)
                  
                          while True:
                              for event in pygame.event.get():
                                  if event.type == pygame.QUIT:
                                      return
                                  if event.type == BLINK_EVENT:
                                      blink_surface = next(blink_surfaces)
                  
                              screen.blit(blink_surface, blink_rect)
                              pygame.display.update()
                              clock.tick(60)
                      finally:
                          pygame.quit()
                  
                  
                  if __name__ == '__main__':
                      main()
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2016-01-20
                    • 2010-11-28
                    • 1970-01-01
                    • 1970-01-01
                    • 2012-05-10
                    • 2012-08-12
                    • 1970-01-01
                    相关资源
                    最近更新 更多