[pygame]有趣的游戏循环

Plux posted @ 2009年5月02日 04:08 in Design with tags pygame python , 2262 阅读

不知道大家是怎么写pygame的绘制、时间循环的?像下面这样?

while True:
     for event in pygame.event.get():
         if event.type == QUIT: return
     #game loop...

很多教程,都很简单地使用了这样的循环……可惜的是这样跳出循环很容易导致很多问题,一是程序结构不好看(《DOM scripting with Javascript》的作者说的);二是,如果你的绘制代码是放在其他线程的话或者绘制代码时间滞后了,那个线程、那段代码可能会先抛出一个不明不白的“错误”才让你退出(至少对用户来说是这样)。

我以前也这样做,于是我的朋友问我,为什么你说你的程序做好了,但退出时却有一个令人费解的对话框出现啊?

我以前不太注重这些细节,因为对于我们来说,这些东西对使用时没有影响的。但对于用户来说,他们不知道我在程序里确切干了些什么,总会有一点害怕,害怕我把他的电脑搞坏了,或者怀疑自己的硬件有问题到维修店白跑一遍……呵呵,说得有点夸张了。

于是,我去pygame.org看看有没有人写出更好的循环结构呢?找到了一个……

while True:
     clock.tick(15)
     #game loop...
     for event in pygame.event.get():
         if event.type == pygame.locals.QUIT:
             raise SystemExit

这次把return改为raise SystemExit了,这样整个系统都会退出,这样基本上不会出现Windows那个什么提示错误的对话框了……然而,终端运行还是有问题,抛出了一个虚拟机退出而线程未完全退出的异常,不过对于Windows用户来说关系不大——他们大概不会在cmd下运行这个程序吧?但对于追求一个完美的结局,这样的结构显然还不够好……

while pygame.display.get_init():
     clock.tick(60)
     pygame.display.update()
     for event in pygame.event.get():
         if event.type == QUIT:
             t.running = False #退出线程
             pygame.quit() #退出pygame模块

这样就好了,循环根据pygame的display模块是否退出来判断是否继续执行,退出之前通知所有线程停止执行。(但对于线程执行时间滞后问题还是没有很好地解决)

其实都是具体问题具体分析,暂时还没有发现一个更好的方案了……

不知道大家有没有更好的循环写法呢?

 

 

 


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter