2014-05-15 93 views
2

我似乎真的被困在我的程序中的某個點,並希望你能幫助。Python pygame循環不尋常的延遲

我基本上試圖創建一個簡單的命中移動圖像遊戲。圖像隨機放置在一系列「上升點」之一,然後玩家需要在圖像放置到新位置之前點擊圖像。

一切似乎都很好,但我似乎得到pygame.tick或蟒蛇time.sleep()一個奇怪的延遲。

我只想說我是一個python和pygame的新手,但對於我的生活無法理解哪裏出了問題。從我迄今爲止的理解來看,圖像應定期以1秒的間隔移動到新的位置。

但是相反,程序似乎有時會「掛起」或「延遲」,並且圖像似乎卡住了幾秒鐘,然後彷彿試圖趕上來回奔跑,然後該程序似乎會爲幾秒鐘內看起來好的工作(定期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,遊戲運行時似乎是以1秒爲間隔的正確傳播速度。如果我省略time.sleep()並使用.tick(60),圖像會快速閃動,但我相信我仍然可以看到某種延遲。

我試着做了一些Google搜索,發現有幾頁說pygame的.tick()方法和python sleep()方法都存在問題,但無法確定這是否爲真。

老實說,我不知道香港專業教育學院做錯了這裏,所以希望你能幫助:)

非常感謝!

回答

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) 

    # ... 
+0

嗨謝謝你的回覆,我明白你說2會衝突,謝謝你的幫助。當嘗試if ms ..語句時,我認爲它的評估爲False,因爲我得到無法到達該位置的錯誤(upos),所以我認爲它是一個空元組。如果我添加一個else子句,問題仍然存在...... –

+0

@ user3069267:啊,它可能在第一遍中被竊聽。嘗試在啓動循環之前初始化'uppos',或者在'1000'處啓動'ms',以便在第一幀上運行更新。 – Blckknght

+0

令人驚歎的東西!十分感謝你的幫助 :) –