在Python中使用time模块时,如何同时运行两个while循环

时间:2015-07-23 23:54:07

标签: python pygame

基本上我正在使用pygame。我的游戏循环有很多事件处理并控制精灵的位置等。

每1秒的雪球精灵将从屏幕左侧进入,但是当在游戏功能中输入这个while循环时,只有while循环运行,并且游戏只是冻结,因为它只等待1秒并且更新精灵,不专注于事件处理或任何事情。

即使使用两种不同的功能,在运行雪球功能时,程序也无法专注于两种功能,并且仍然停留在雪球功能上。

我不想使用任何复杂的东西,只是一个简单优雅的解决方案。我看过线程,但它看起来太复杂了,我对python来说是新手。

1 个答案:

答案 0 :(得分:1)

请勿使用time模块。

只需创建一个事件,并告诉pygame每秒将该事件放入事件队列(使用pygame.time.set_timer函数)。然后你可以像在其他事件中一样在你的主循环中处理它。

这是一个简单的例子。它使用pygame.time.set_timer和单个主循环的自定义事件,而不需要time模块:

import pygame
import random
pygame.init()
screen = pygame.display.set_mode((300, 300))
player, dir, size = pygame.Rect(100,100,20,20), (0, 0), 20
MOVEEVENT, APPLEEVENT, trail = pygame.USEREVENT+1, pygame.USEREVENT+2, []
pygame.time.set_timer(MOVEEVENT, 250)
pygame.time.set_timer(APPLEEVENT, 1000)
apples=[]
while True:
    keys = pygame.key.get_pressed()
    if keys[pygame.K_w]: dir = 0, -1
    if keys[pygame.K_a]: dir = -1, 0
    if keys[pygame.K_s]: dir = 0, 1
    if keys[pygame.K_d]: dir = 1, 0

    if pygame.event.get(pygame.QUIT): break
    for e in pygame.event.get():
        if e.type == MOVEEVENT: # this event happens every 250 ms
            trail.append(player.inflate((-10, -10)))
            trail = trail[-5:]
            player.move_ip(*[v*size for v in dir])
        if e.type == APPLEEVENT: # this event happens every 1000 ms
            apples.append(pygame.rect.Rect(random.randint(0, 30) * 10, random.randint(0, 30) * 10, 10, 10))

    screen.fill((0,120,0))
    for t in trail:
        pygame.draw.rect(screen, (255,0,0), t)
    for a in apples:
        pygame.draw.rect(screen, (0,255,100), a)

    pygame.draw.rect(screen, (255,0,0), player)
    pygame.display.flip()

这可以让您了解如何解决您的问题。不要使用time.sleep,它只会阻止你的循环。