基本上我正在使用pygame。我的游戏循环有很多事件处理并控制精灵的位置等。
每1秒的雪球精灵将从屏幕左侧进入,但是当在游戏功能中输入这个while循环时,只有while循环运行,并且游戏只是冻结,因为它只等待1秒并且更新精灵,不专注于事件处理或任何事情。
即使使用两种不同的功能,在运行雪球功能时,程序也无法专注于两种功能,并且仍然停留在雪球功能上。
我不想使用任何复杂的东西,只是一个简单优雅的解决方案。我看过线程,但它看起来太复杂了,我对python来说是新手。
答案 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
,它只会阻止你的循环。