pygame-两个显示器同时使用pygame.time.wait()函数进行两次显示更新

时间:2018-12-04 12:36:20

标签: python pygame

我在两次显示更新之间添加了一个pygame.time.wait(2000)函数,期望在按下按键后它将首先显示一个文本,然后在2秒后显示第二个文本。但最终在触发两秒钟后同时显示两个文本。我应该如何正确使用该功能来实现自己的目标?

import pygame
from pygame.locals import *
from sys import exit

SCREEN_WIDTH = 448
SCREEN_HEIGHT = 384

pygame.init()
screen = pygame.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT])
my_font = pygame.font.SysFont("arial", 16)
textSurfaceObj1 = my_font.render('Hello world!', True, (255,255,255))
textRectObj1 = textSurfaceObj1.get_rect()
textRectObj1.center = (100, 75)
textSurfaceObj2 = my_font.render('Hello world!', True, (255,255,255))
textRectObj2 = textSurfaceObj2.get_rect()
textRectObj2.center = (200, 150)


while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()
        if event.type == KEYDOWN:
            screen.blit(textSurfaceObj1, textRectObj1)
            pygame.display.flip()
            pygame.time.wait(2000)
            screen.blit(textSurfaceObj2, textRectObj2)
            pygame.display.flip()

1 个答案:

答案 0 :(得分:1)

如果您的代码能否正常运行取决于您所使用的窗口管理器,但是您注意到,这不好。

您需要全神贯注于您的游戏在循环中运行,并且您为停止循环所做的一切(例如waitsleep)都将无法正常工作。

在您的代码中,您具有三种状态:

1)什么也不打印
2)打印第一个文本
3)打印两个文本

解决问题的一种简便方法是简单地跟踪变量中的当前状态,如下所示:

import pygame
from sys import exit

SCREEN_WIDTH = 448
SCREEN_HEIGHT = 384

pygame.init()
screen = pygame.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT])
my_font = pygame.font.SysFont("arial", 16)

text = my_font.render('Hello world!', True, (255,255,255))
text_pos1 = text.get_rect(center=(100, 75))
text_pos2 = text.get_rect(center=(200, 150))

state = 0
ticks = None
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()
        if event.type == pygame.KEYDOWN and state == 0:
            state = 1
            ticks = pygame.time.get_ticks()

    if state == 1 and ticks and pygame.time.get_ticks() > ticks + 2000:
        state = 2

    screen.fill((30, 30, 30))
    if state > 0: screen.blit(text, text_pos1)
    if state > 1: screen.blit(text, text_pos2)
    pygame.display.flip()