簡體   English   中英

在 pygame 中讓玩家在每個間隔移動的最佳方法是什么?

[英]What is the best way to make a player move at every interval in pygame?

是否有一個庫或一種簡單的方法可以每 0.5 秒循環一次而不中斷程序的 rest?

我剛剛開始使用 pygame 並且到目前為止已經制作了一個簡單的平台游戲和 Pong 副本。 我決定嘗試制作一個 Snake 副本(我目前只有頭部),我需要蛇每 0.5 秒移動一次,而輸入可以以 30 fps 的速度注冊,我有游戲運行的 rest。 這是我目前的解決方法:

while running: #this is tabbed back in my code

# keep loop running at the right speed
clock.tick(FPS)

# get time at each iteration
currentTime = str(time.time()).split(".")[0]
gameTime = int (currentTime) - int (startTime)
# this is used to check for something every 0.5 second (500 ms)
currentTimeMs = str(time.time()).split(".")[1]

# snake will move evry 0.5 second in a direction
if currentTimeMs[0] in ["5","0"] and moveDone == False:
    moveDone = True
    player1.move(direction)
elif currentTimeMs[0] not in ["5","0"]:
    moveDone = False

while running:循環中有更多代碼來獲取方向並顯示精靈,但這不是必需的。 我當前的代碼工作正常,每次 mm:ss:x 中的 x 為 0 或 5(相隔 0.5 秒)時,都會為我的 player1 重復移動 function,如果在幾幀內多次重復,則不會重復。

此代碼需要在運行循環中工作,而不是停止程序,因此 time.sleep() 不起作用。 我也嘗試過使用schedule庫,但它不起作用,因為當將方向變量傳遞到 function 時,它似乎不允許改變方向變量。

因此,我的問題是; 是否有圖書館或更短的方法來完成我的需要?

在此先感謝您,如果您需要,我可以將整個代碼發送給您。

您可以存儲最后一步的時刻,然后與實際時間進行比較。 為此,您可以使用perf_counter from time 這是一個例子

last_move_time = perf_counter()

while running:
    if perf_counter() - last_move_time > 0.5:
        # move player
        last_move_time = perf_counter()

我建議使用 pygames 事件機制和pygame.time.set_timer() (有關文檔,請參見此處)。

你會做這樣的事情:

pygame.time.set_timer(pygame.USEREVENT, 500)

並在事件循環中查找事件類型。

if event.type == pygame.USEREVENT:

如果這是您在程序中使用的唯一用戶定義事件,則可以使用USEREVENT

當您檢測到該事件時,計時器已過期並且您移動了蛇或其他任何東西。 一個新的定時器可以再設置 1/2 秒。 如果您需要更高的准確性,您可以密切關注時間並將計時器設置為正確的時間,但對於您的情況,每次將其設置為 1/2 秒就可以了。

如果您需要多個計時器並需要將它們區分開來,您可以創建一個帶有屬性的事件,您可以將其設置為不同的值來跟蹤它們。 像這樣的東西(雖然我沒有運行這個特定的代碼片段,所以可能有錯字):

my_event = pygame.event.Event(pygame.USEREVENT, {"tracker": something})
pygame.time.set_timer(my_event , 500)

暫無
暫無

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

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