Python Pygame循环异常延迟

时间:2014-05-15 17:57:30

标签: python pygame

我似乎真的陷入了我的计划的某一点,并希望你能提供帮助。

我基本上试图创建一个简单的动态图像游戏。图像被放置在一系列"向上点之一"随机,然后玩家需要在图像放置到新位置之前点击图像。

一切似乎都很顺利,但我似乎在使用pygame.tick或python time.sleep()时遇到了奇怪的延迟。

我只想说我是一个蟒蛇和pygame新手,但对于我的生活不能理解出了什么问题。根据我的理解,到目前为止,图像应定期以1s间隔移动到新位置。

但相反,该程序似乎是“挂起”#34;或者"延迟"有时,图像似乎卡住了几秒钟,然后来回奔波,就像试图赶上,然后程序似乎适用于几秒钟(常规1秒延迟)似乎很好,并且然后回去努力移动或跟上。

希望这有道理:) 她是循环的代码,所以你可以看到我认为我遇到问题的地方:

# The values are tuples which hold the top-left x, y co-ordinates at which the  
# rabbit image is to be blitted...

uppoints = {1: (70, 70), 2: (250, 70), 3: (430, 70), 4: (600, 70),
        5: (70, 250), 6: (250, 250), 7: (430, 250), 8: (600, 250),
        9: (70, 430), 10: (250, 430), 11: (430, 430), 12: (600, 430)}


# Get a random location to pop up...
def getpos(ups):
    x = random.randint(1, 2)
    if x == 1:
        up = ups[1]
        return up
    elif x == 2:
        up = ups[2]
        return up

uppos = ()

while gamerunning:
    uppos = getpos(uppoints)

        for event in pygame.event.get():
            if event.type == QUIT:
            gamerunning = False

            if event.type == pygame.MOUSEMOTION:
                mpos = pygame.mouse.get_pos()

            if event.type == pygame.MOUSEBUTTONDOWN:
                if event.button == 1:
                    if rabbits.rect.collidepoint(event.pos):
                        score += 10

    mainwin.fill((0, 0, 0))
    scoretxt2 = basefont.render(str(score), True, (0, 0, 0))
    mainwin.blit(mainback, (0, 0))
    mainwin.blit(rabbits.image, uppos)
    mainwin.blit(scoretxt, (70, 30))
    mainwin.blit(scoretxt2, (160, 32))
    mainwin.blit(livestxt, (600, 30))
    mainwin.blit(livestxt2, (690, 32))

    pygame.display.flip()

    time.sleep(1)

    # Check which level the user is by score, and increase the speed of the rabbits  as needed...
    fpsclock.tick(60)

如果我使用time.sleep,则游戏以1s的间隔以正确的速度运行。如果我省略time.sleep()并使用.tick(60),图像会疯狂地闪烁,但我相信我仍然可以看到某种延迟。

我尝试了一些谷歌搜索,发现有几页说pygame' s .tick()方法和python sleep()方法都有问题,但无法确定是否属实。

老实说,我不知道我在这里做错了什么,所以希望你能帮忙:)。

非常感谢!

1 个答案:

答案 0 :(得分:2)

您的time.sleepfpsclock.tick电话互相矛盾。对sleep的调用告诉Python停止一整秒,什么都不做。另一方面,tick调用表示您希望以每秒60帧的速度运行。

我怀疑你不想使用sleep。当程序处于休眠状态时,不会处理IO事件,程序将显示为挂起。相反,您需要更改代码的其余部分,以便在每秒更新一次时正常运行。

我想你可能想要改变你呼叫getpos的地方,只能改变一次。我建议像:

ms = 0

while gamerunning:
    ms += fpsclock.get_time()
    if ms > 1000: # 1000 ms is one second
        ms -= 1000
        uppos = getpos(uppoints)

    # ...