pygame 跳过更新屏幕
pygame skipped updating screen
我最近刚开始学习 pygame,目前正在研究一个教程示例,该示例在 window 的边缘有一只猫 运行。(我将猫替换为读取矩形,以便您可以复制过去的示例)
import pygame
import sys
from pygame.locals import *
pygame.init()
FPS = 5
fpsClock = pygame.time.Clock()
DISPLAYSURF = pygame.display.set_mode((400, 300), 0, 32)
pygame.display.set_caption('Animation')
WHITE = (255, 255, 255)
RED = (255, 0, 0)
# catImg = pygame.image.load('cat.png')
catx = 10
caty = 10
direction = 'right'
while True:
DISPLAYSURF.fill(WHITE)
if direction == 'right':
catx += 5
if catx == 280:
direction = 'down'
elif direction == 'down':
caty += 5
if caty == 220:
direction = 'left'
elif direction == 'left':
catx -= 5
if catx == 10:
direction = 'up'
elif direction == 'up':
caty -= 5
if caty == 10:
direction = 'right'
# DISPLAYSURF.blit(catImg, (catx, caty))
pygame.draw.rect(DISPLAYSURF, RED, (catx, caty, 100, 50))
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
pygame.display.update()
fpsClock.tick(FPS)
但是如果我 运行 它显示的图像不是我所期望的:除非我将鼠标放在 window 上,否则红色矩形不是 运行ning。 (这可能是设计选择。所以无论如何)
更令人担心的是矩形没有按照我预期的方式移动。它移动几步而不是沿着路径向前跳一点,然后移动一点,再次跳跃等等。
我找不到跳跃发生方式的模式。我唯一能说的是它不会离开 window.
边缘的路径
如果我移动这条线:
DISPLAYSURF.fill(WHITE)
在 while 循环之外,我可以看到屏幕沿着路径的跳过部分之后仍然是红色的。
所以在我看来,代码仍在后台进行,矩形仍写入虚拟 DISPLAYSURF 对象,但 DISPLAYSURF 对象未打印到屏幕上。此外,代码 运行 非常快。
我用的是python3.8.0
pygame 2.0.0.dev6
在 windows
我没有找到任何关于此事的信息。
有人有同样的问题吗?这是从哪里来的?
这是Indentation的事情。 pygame.display.update()
必须在应用程序循环而不是事件循环中完成:
while True:
DISPLAYSURF.fill(WHITE)
# [...]
pygame.draw.rect(DISPLAYSURF, RED, (catx, caty, 100, 50))
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
#<---|
pygame.display.update()
fpsClock.tick(FPS)
注意,application loop中的代码在每一帧都执行,但是event loop中的代码只在事件发生时执行,比如鼠标移动(pygame.MOUSEMOTION
)。
我最近刚开始学习 pygame,目前正在研究一个教程示例,该示例在 window 的边缘有一只猫 运行。(我将猫替换为读取矩形,以便您可以复制过去的示例)
import pygame
import sys
from pygame.locals import *
pygame.init()
FPS = 5
fpsClock = pygame.time.Clock()
DISPLAYSURF = pygame.display.set_mode((400, 300), 0, 32)
pygame.display.set_caption('Animation')
WHITE = (255, 255, 255)
RED = (255, 0, 0)
# catImg = pygame.image.load('cat.png')
catx = 10
caty = 10
direction = 'right'
while True:
DISPLAYSURF.fill(WHITE)
if direction == 'right':
catx += 5
if catx == 280:
direction = 'down'
elif direction == 'down':
caty += 5
if caty == 220:
direction = 'left'
elif direction == 'left':
catx -= 5
if catx == 10:
direction = 'up'
elif direction == 'up':
caty -= 5
if caty == 10:
direction = 'right'
# DISPLAYSURF.blit(catImg, (catx, caty))
pygame.draw.rect(DISPLAYSURF, RED, (catx, caty, 100, 50))
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
pygame.display.update()
fpsClock.tick(FPS)
但是如果我 运行 它显示的图像不是我所期望的:除非我将鼠标放在 window 上,否则红色矩形不是 运行ning。 (这可能是设计选择。所以无论如何) 更令人担心的是矩形没有按照我预期的方式移动。它移动几步而不是沿着路径向前跳一点,然后移动一点,再次跳跃等等。 我找不到跳跃发生方式的模式。我唯一能说的是它不会离开 window.
边缘的路径如果我移动这条线:
DISPLAYSURF.fill(WHITE)
在 while 循环之外,我可以看到屏幕沿着路径的跳过部分之后仍然是红色的。 所以在我看来,代码仍在后台进行,矩形仍写入虚拟 DISPLAYSURF 对象,但 DISPLAYSURF 对象未打印到屏幕上。此外,代码 运行 非常快。
我用的是python3.8.0 pygame 2.0.0.dev6 在 windows
我没有找到任何关于此事的信息。 有人有同样的问题吗?这是从哪里来的?
这是Indentation的事情。 pygame.display.update()
必须在应用程序循环而不是事件循环中完成:
while True:
DISPLAYSURF.fill(WHITE)
# [...]
pygame.draw.rect(DISPLAYSURF, RED, (catx, caty, 100, 50))
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
#<---|
pygame.display.update()
fpsClock.tick(FPS)
注意,application loop中的代码在每一帧都执行,但是event loop中的代码只在事件发生时执行,比如鼠标移动(pygame.MOUSEMOTION
)。