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

2024-05-19 07:42:07 发布

您现在位置:Python中文网/ 问答频道 /正文

基本上我使用的是pygame。我的gameloop有很多事件处理和控制精灵的位置等等。在

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

即使使用两个不同的函数,当运行snowball函数时,程序也不能同时关注这两个函数,而是停留在snowball函数上。在

我不想用任何复杂的东西,只是一个简单优雅的解决方案。我已经看过线程,但它看起来太复杂了,而且我对python还不熟悉。在


Tags: 函数程序功能游戏屏幕解决方案事情线程
1条回答
网友
1楼 · 发布于 2024-05-19 07:42:07

不要使用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,它只会阻塞你的循环。在

相关问题 更多 >

    热门问题