pygame.display.update 导致闪烁或不显示任何内容

pygame.display.update causing flickering or not showing anything

在我的游戏中,我试图做到当你走进一个物体时,它会显示一个图像。 我很确定 pygame.display.update() 每帧都会被调用,否则游戏将完全静止。

然而,当我在碰撞时绘制我的新矩形时,它不会出现,除非我在绘制后放置另一个 pygame.display.update(rect) 。这意味着更新一次被调用两次,一次是在主游戏循环中,一次是在绘制矩形之后。由于多次更新调用,这会导致矩形(现在已绘制)闪烁。

我不明白为什么没有第二次更新调用就无法绘制它。

主游戏循环调用:

  def events(self):
    #game loop events
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            self.playing = False
            self.running = False
  
  def update(self):  
    self.all_sprites.update()


  def main(self):
    while self.playing:
          self.events()
          self.update()
          self.draw()
    self.running = False

  def draw(self):
      self.screen.fill(black)
      self.all_sprites.draw(self.screen)
      self.clock.tick(FPS)
      
      pygame.display.update()

#create game instance
g= Game()
g.new()
while g.running:
  #main gameloop
  g.main()

pygame.quit()
sys.exit()

这是我在与我的对象发生碰撞后调用绘制矩形的时间:

 def update(self):
    self.hitbox.center = numpy.add(self.rect.center,(8,22))
    self.interactionhitbox.center = numpy.add(self.rect.center, (8,16))
    if(self.showPopup):
      # Initialwzng Color
      color = (255,0,0)
        
      # Drawing Rectangle 
      rect = pygame.Rect((0,0,60,60))
      pygame.display.update(rect) # WITHOUT THIS LINE IT DOES NOT GET DRAWN, WITH IT IT FLICKERS
      pygame.draw.rect(self.game.screen, color, rect)

所以基本上在第二次 pygame.display.update(rect) 调用时它会出现但会闪烁,没有它它根本不会出现

如果这是一个糟糕的问题或格式不正确,我们将不胜感激。我自 2017 年以来就没来过这里!

矩形未绘制,因为稍后 self.screen.fill(black) 会清除屏幕。您必须在 self.screen.fill(black) 之后和 pygame.display.update() 之前绘制矩形。

创建2张图片,选择要绘制的图片update:

def __init__(self, ...)
    # [...]
  
    self.image = ...

    self.original_image = self.image
    self.image_and_rect = self.image.copy()
    pygame.draw.rect(self.image_and_rect, (255,0,0), self.image_and_rect.get_rect(), 5)

def update(self):
    self.hitbox.center = numpy.add(self.rect.center,(8,22))
    self.interactionhitbox.center = numpy.add(self.rect.center, (8,16))

    if self.showPopup:
        self.image = self.image_and_rect
    else:
        self.image = self.original_image