【发布时间】:2020-07-03 18:30:31
【问题描述】:
我正在设计一个简单的情绪识别游戏,它在屏幕上显示面孔一秒钟,然后消失并让参与者单击按钮来决定显示哪种情绪。然而,我努力让它只显示一秒钟,我最终使用了一个 while 循环来显示它,但自从我发现我的游戏滞后并且运行非常缓慢。这是相关代码,来自我定义的用于显示图像的函数。我已经设置好了,所以它会创建一个透明版本的图像,然后将其改为 blits,以提供图像在 1 秒后消失的错觉。
def askQuestion(imageNumber):
mouse = pygame.mouse.get_pos()
last = pygame.time.get_ticks()
while pygame.time.get_ticks() - last <= 1000:
screen.blit(images[imageNumber], (((display_width/2) - (images[imageNumber].get_size()[0]/2)), (((display_height/2) - (images[imageNumber].get_size()[1]/2)))))
else:
images[imageNumber].fill((255,255,255,0))
我强烈怀疑它滞后的原因是,通过 while 循环,Python 不断地将图像传送到屏幕上,而不是只执行一次,从而消耗了大量资源。任何人都可以建议一种更简单的方法来仅显示此图像一秒钟而不使用 while 循环吗? (另外,我知道我的图像坐标代码真的很乱——它在我的待办事项清单上!)
更新:我尝试合并@Kingsley 建议的“状态机”,但它似乎仍然无法正常工作,因为图像无限期地保留在屏幕上。到目前为止,这是我所拥有的:
running = True
while running:
screen.fill((255, 255, 255))
answerDetection()
pygame.draw.circle(screen, (0,0,0), (int(display_width/2), int(display_height/2)), 10, 2)
displayButtons("sad", 0, 700, 200, 100)
displayButtons("happy", 240, 700, 200, 100)
displayButtons("neutral", 480, 700, 200, 100)
displayButtons("angry", 720, 700, 200, 100)
displayButtons("afraid", 960, 700, 200, 100)
imageNumber = len(answers) + 1
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
running = False
gameState = States.VIEWING
timeNow = pygame.time.get_ticks()
startTime = timeNow
if ( gameState == States.VIEWING):
if( timeNow <= startTime + 1000):
askQuestion(imageNumber)
else:
gameState == States.ANSWERING
if (gameState == States.ANSWERING):
images[imageNumber].fill((255,255,255,0))
for rects in rectList:
for event in pygame.event.get():
if event.type == pygame.MOUSEBUTTONUP:
if pygame.Rect(rects).collidepoint(mouse):
gameState == States.VIEWING
澄清一下, answerDetection() 是一个检测用户点击了哪个按钮的函数。 在 States.ANSWERING 部分中,我使用 "images[imageNumber].fill((255, 255, 255, 0)) 作为使图像透明的一种方式,因为在 VIEWING 状态下我要做的就是使图像消失(因为按钮一直在显示)。我不确定问题是它没有改变状态,还是当它改变状态时没有发生任何事情。
任何帮助将不胜感激!
编辑 2: 进一步的实验揭示了问题:通过我有 timeNow = pygame.time.get_ticks() 紧跟 startTime = timeNow 的方式,循环不断更新 timeNow 变量,然后立即将 startTime 变量重新设置为相同的数字之后 - 据我了解,我们希望 startTime 是一个静态数字,以指示“查看”状态开始的时间。否则,timeNow 永远不会比 startTime 多 1000 毫秒,并且永远不会进入“应答”状态。我只需要找到一种方法来设置查看状态开始时的时间,并将其设置为 startTime 变量中的静态时间。
【问题讨论】:
标签: pygame