在 Pygame 中循环时,不理解特定的 True 语句

While Loops in Pygame, not understanding a particular True statement

我目前正在学习 pygame 和 python 的一般知识,关于 while True 语句,有些事情让我有些困惑。我目前只是在屏幕上打开一个带有粉红色方块的黑色 window。这就是下面代码的作用。

import pygame
import sys
from pygame import surface

pygame.init()
screen = pygame.display.set_mode((1600, 900))
pygame.display.set_caption('Yohora')

test_surface = pygame.Surface((100, 100))
test_surface.fill('pink')

while True:
  for event in pygame.event.get(): 
    if event.type == pygame.QUIT: 
      pygame.quit() 
      sys.exit()

  screen.blit(test_surface, (200,100)) # Displays pink square
  pygame.display.update()

我想更好地理解这个 True 语句并理解它到底指的是什么。

所以我改成了

while screen == True:

while pygame.init() == True:

两次运行都打开了 window 并立即关闭了它。但是,当我将其更改为

while pygame.init() != True:

然后 window 保持打开状态,就像我使用

时一样
while True:

直觉上,如果情况正好相反,对我来说会更有意义吗?即,当 pygame.init()(即 window 已初始化)为 True 时,请执行以下操作。但是,它是说,虽然 window 未初始化(即不正确),但请执行以下操作。

我显然漏掉了什么。

pygame.init() 不是 return TrueFalsepygame.init() return 是一个包含 2 个组件的元组。因此 pygame.init() == True 总是 Falsepygame.init() != True 总是 True.

循环while True:是一个无限循环。它将保留 运行 其主体,直到程序终止或循环内的某些内容将控制从循环中中断。

但是,要很好地跳出循环,您需要 两个 breaks。一个用于内部循环(处理所有未决事件),然后一个用于外部循环。对于后者,您需要设置一个标志,表明您已经看到 'quit' 事件。所以它变得有点乱。

现在的设置方式本质上没有任何问题。但是为了演示更优雅的程序流程,请看这个:

while True:
  should_quit = False

  # Process pending events
  for event in pygame.event.get(): 
    if event.type == pygame.QUIT: 
      should_quit = True
      break

  # Are we done?
  if should_quit:
    break

  # Update
  screen.blit(test_surface, (200,100))
  pygame.display.update()

# Do game cleanup (and any of your own cleanup) here
pygame.quit() 

您可以看到这种模式给您的事件循环增加了一些混乱。另请注意,我删除了 sys.exit() 调用(这是在循环内终止程序的原因)。

如果您想删除额外的中断,请考虑将显示+更新步骤移动到之前您的事件泵,然后您可以将主循环更改为:

should_quit = False
while not should_quit:
  # Update
  screen.blit(test_surface, (200,100))
  pygame.display.update()

  # Process events
  for event in pygame.event.get(): 
    if event.type == pygame.QUIT: 
      should_quit = True
      break

# Do game cleanup (and any of your own cleanup) here
pygame.quit()