6

基本上我有一个循环(tick、set_caption、screen_fill、event.get()、send_frame_event、flip、repeat)

当我在 Windows 7 上拖动窗口时,循环停止循环,我最终卡在 pygame.event.get() 中,我试图为 get 定义某些事件,例如 get([pygame.QUIT]) 无济于事.

拖动/移动窗口时,只需调用 pygame.event.clear() 即可获得相同的冻结效果。

有解决方法吗?

不是完整的代码,但应该足够了:

def start(self):
    self.running = True
    Clock = pygame.time.Clock()
    while self.running:
        self.p += 25
        tickFPS = Clock.tick(self.fps)
        pygame.display.set_caption("Press Esc to quit. FPS: %.2f" % (Clock.get_fps()))
        self.screen.fill([self.p&0xFF,(255-self.p)&0xFF,255])
        self.handleEvents()
        self.raiseEvent("updateFrame")
        pygame.display.flip()
def handleEvents(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            self.running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                self.running = False

完整代码在: http: //pastie.org/private/wm5vqq3f7xe0xlffy1fq

4

2 回答 2

1

尝试在pygame.event.pump()主循环(或 handleEvents 函数)中调用

于 2012-04-12T13:26:54.630 回答
0

不知道这是否有帮助:

我意识到问题在于移动窗口窗口,而不是重新调整窗口大小。也许移动和重新调整大小之间有一些相似之处?

我在重新调整大小的文档中发现了这一点:

然后设置显示模式,将几个事件放在pygame事件队列中。当用户请求程序关闭时发送 pygame.QUIT。当显示器获得和失去输入焦点时,窗口将接收 pygame.ACTIVEEVENT 事件。如果显示设置了 pygame.RESIZABLE 标志,则在用户调整窗口尺寸时将发送 pygame.VIDEORESIZE 事件。当必须重新绘制窗口的某些部分时,直接绘制到屏幕的硬件显示将获得 pygame.VIDEOEXPOSE 事件。

和:

请注意,当用户调整游戏窗口大小时,pygame 不会自动更新其内部屏幕表面。每次发送 VIDEORESIZE 时都必须调用 set_mode()。这在文档中确实应该更清楚。

也许在移动游戏窗口时,会发生类似的事情?

于 2012-04-12T12:26:49.627 回答