簡體   English   中英

Python游戲計時器(線程?)

[英]Python Game Timer (Threads?)

我正在用Python設計游戲,並且想知道如何制作一個可以與我的游戲一起運行的高效計時器。

注意:我正在使用Pygame。

我目前有一個像這樣的計時器:

import time

seconds = 60

def start_timer():
    global seconds
    while seconds > 0:
        print seconds
        seconds -= 1
        time.sleep(1)

但是,當在我的主要游戲功能中運行時,由於timer.sleep我的游戲掛起。

def main(self):
    Timer.start_timer()

我不確定我的問題與不使用線程有關,盡管我不確定100%。 有人可以幫我解釋一下正確的解決方案是什么嗎?

如果您使用的是PyGame或其他圖形庫,並且已經圍繞事件循環或幀速率循環構建了游戲,則需要使用該庫附帶的功能。 如果您有事件循環,可以要求它安排事件在60秒內觸發。 如果您遇到了幀速率循環,則您可以執行相同的操作,或者需要每幀檢查一次剩余時間。

但是,如果您這樣做,那么是的,線程化就是答案。

對於簡單的計時器,最簡單的解決方案是Timer類。 但是,這不會自動重復計時器,因此您必須手動添加。 例如,您可以啟動一個1秒計時器,並在其到期時啟動另一個1秒計時器:

def start_timer():
    global seconds
    if seconds > 0:
        print seconds
        seconds -= 1
        threading.Timer(1, start_timer).start()

seconds = 60
threading.Timer(1, start_timer).start()

但是,使用知道如何為您重復的計時器通常要容易得多。 你可以建立一個自己的(注意, threading文檔包含一個鏈接到 ,它不是很難搞清楚如何添加邏輯,使得它每開火interval為秒count的時間,而不是只一次)。 或者,您可以搜索PyPI ,找到已經為您實現了這一目標的數十個人。

還請記住,一旦使用線程,就必須處理線程問題。 如果您使用的是GUI庫,則它們通常不允許您從后台線程調用GUI方法。 如果要訪問兩個線程之間共享的變量,則通常需要一個Lock或其他同步對象來保護它。 等等。

如果您使用的是PyGame,則它應具有自己的計時功能

如果您使用的是事件循環或混合設計,則在pygame.event.get()或類似對象上循環並為不同事件(如鼠標單擊或按下鼠標pygame.event.get()調用“事件處理程序”,則可以使用set_timer創建每秒觸發一次的事件。 例如:

TIMER1_EVENT = pygame.USEREVENT + 1

def start_timer1():
    global seconds
    seconds = 60
    pygame.time.set_timer(TIMER1_EVENT, 1000)

def on_timer1():
    global seconds
    print seconds
    seconds -= 1
    if seconds < 0:
        pygame.time.set_timer(TIMER1_EVENT, 0)

# elsewhere, inside your main event loop
elif event.type == TIMER1_EVENT:
    on_timer1()

每個函數的文檔中都鏈接有非常簡單的示例程序; 如果您查看set_timer的示例,將會發現它的使用非常簡單。

如果您使用的是純幀循環,那么您大概已經在調用Clock.tick或類似的東西了,那么您將不得不使用該返回值來計算自上次以來的毫秒數,然后確定是否ve又傳遞了另一個整數秒,也就是傳遞了0。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM