2012-05-31 58 views
3

在MMO游戏客户端中,我需要创建一个循环,在30秒内循环30次(每秒1次)。 最令我失望的是,我发现我不能在循环内使用time.sleep(),因为这会导致游戏在循环过程中冻结。没有time.sleep的Python循环延迟

循环本身非常简单,唯一的困难是如何延迟它。

limit = 31 
while limit > 0 : 
    print "%s seconds remaining" % (limit) 
    limit = limit -1 

蟒蛇库在客户端作为一个单独的文件夹pyc文件存在,我希望我能避免与他们搞乱。 你认为有什么办法可以完成这个延迟,还是死路一条?

+0

多线程是你的朋友。 –

+1

当我们唯一知道的游戏是“它循环”时,很难提供解决方案...... –

回答

4

你的游戏有一个主循环。 (是的,确实如此)。

每次通过循环时,当你去检查状态,移动球员,重画屏幕等,你检查你的计时器上剩下的时间。如果至少1秒钟过去了,您可以打印出“余下的秒数”。如果至少30秒过去了,你会触发你的动作。

+0

就是这样,我找到了主循环,事后很容易。这个循环的存在是我需要知道的,非常感谢你。 – mortaZa

-1

假设的循环内什么是执行时间小于1秒:

limit = 0 
while limit < 30 : 
    time_a = time.time() 
    """ Your code here """ 
    time_spent = time.time() - time_a 
    if time_spent < 1: 
     time.sleep(1 - time_spent) 
    print "%s seconds remaining" % (limit) 
    limit = limit -1 

这会让你的循环迭代时间等于1秒。

+0

time.sleep()会导致游戏在执行时冻结。这确实是一个非常简单的想法,但是对游戏来说却是一个大问题。 – mortaZa

+0

你没有说它不应该被阻挡:(然后使用时间事件作为有人在这里说 – AlbertFerras

1

你不能做没有阻挡或线程,除非你愿意失去精度...

我有时建议这样,但线程是这样做的正确方法...

import time 

counter = 31 
start = time.time() 
while True: 
    ### Do other stuff, it won't be blocked 
    time.sleep(0.1) 
    print "looping..." 

    ### When 1 sec or more has elapsed... 
    if time.time() - start > 1: 
     start = time.time() 
     counter = counter - 1 

     ### This will be updated once per second 
     print "%s seconds remaining" % counter 

     ### Countdown finished, ending loop 
     if counter <= 0: 
      break 

甚至...

import time 

max = 31 
start = time.time() 
while True: 
    ### Do other stuff, it won't be blocked 
    time.sleep(0.1) 
    print "looping..." 

    ### This will be updated every loop 
    remaining = max + start - time.time() 
    print "%s seconds remaining" % int(remaining) 

    ### Countdown finished, ending loop 
    if remaining <= 0: 
     break 
+0

请记住,这只是一个例子,我把'time.sleep(0.1)'做成“打勾”每秒10次,以避免用百个“循环...”行填满你的屏幕,他们正在工作的例子,复制+粘贴并尝试它们。 – KurzedMetal