對PyGame中的時間和時間測量工作有一個主要的誤解。您可以使用pygame.time.Clock(),但採用完全不同的方式。
注意:這裏所有的代碼示例都是Python 3.4;如果您仍然使用Python 2.x並且使用代碼時遇到問題,請隨時詢問。
的一些基本知識
你的腳本運行儘可能地快,所以基本上與您的操作系統的每一個滴答,你擁有了它處理一次,這是根據計算機的CPU每秒某處大約100倍。
現在出現第二個問題:Clock()是Pygame模塊「時間」中的一個類,它本身沒有任何價值。如果你讓你的程序打印「mainclock」,yield將是:它永遠不會等於0,因此你的if語句永遠不會產生True,因此永遠不會被處理(所以絕不會把1加到「score」)。
你瞭解這部分?如果沒有,請隨時提出進一步的問題!這些是你必須理解的一些非常基礎的東西,以便基本上使用任何編程語言(至少是面向對象的)。
如何解決您的問題
您需要pygame.time.Clock()爲了解決您的問題,但在比你做了什麼不同的方式。定義一個變量爲您的遊戲的時鐘,就像你用「mainclock」確實已經:
mainclock = pygame.time.Clock()
時鐘()類有一個方法「.tick()」。此方法測量自上次打勾後的時間。試一試:將您的代碼更改爲此並查看它打印的內容!
while True:
print(mainclock.tick())
或者在Python 2.x的: 而真: 打印mainclock.tick()
您將收到每個腳本已被處理時間的值(這就是所謂的 「嘀」)。在我的電腦這個打印了幾個數字:
>>>
0
35
1
2
2
1
1
1
2
等等
這是毫秒,因爲腳本已經處理的最後時間。這意味着:當1000毫秒的時間過去了,整整一秒鐘過去了。現在將其用於我們的目的,我們只需將它們添加在一起即可!
mainclock = pygame.time.Clock()
tick_count = 0
score = 0
while True:
tick_count += mainclock.tick()
if tick_count >= 1000:
score += 1
tick_count = 0
print(score)
另一種方法是限制幀速率。這可以通過在Clock()的「.tick()」方法中添加數字值來完成。
while True
mainclock.tick(60)
這將導致你的腳本運行從來沒有超過60次第二快(建議:使你的腳本打印mainclock.tick(60),看看它產生!)。現在,我們可以做兩件事情:要麼我們採取這一事實,併除以60一秒或我們仍然測量時間,我們以前那樣:
方法之一 - 測量時間爲前
mainclock = pygame.time.Clock()
tick_count = 0
score = 0
while True:
tick_count += mainclock.tick(60)
if tick_count >= 1000:
score += 1
tick_count = 0
print(score)
你看,這裏沒有重大改變。我們只是簡單地告訴劇本,每秒不會超過60次,其餘的則保持不變。如果您打印「mainclock.tick(60)」,您現在將在每個循環中接收16或17個值,因爲它會在兩個滴答聲之間等待這段時間,以確保它不會每秒運行60次以上。
方法二 - 除以秒...
因爲我們告訴程序不運行速度比第二快60倍,這也意味着一個刻度爲1/60秒。我們也可以這樣做:
mainclock = pygame.time.Clock()
tick_count = 0
score = 0
while True:
tick_count += 1/60 # NOTE: in Python 2.x this has to be: 1.0/60 or 1/60.0!
if tick_count >= 1:
tick_count = 0
score += 1
print(score)
或者:
mainclock = pygame.time.Clock()
tick_count = 1
score = 0
while True:
tick_count -= 1/60.0
if tick_count <= 0:
tick_count = 1
score += 1
print(score)
希望,這有助於!否則,請隨時多問。
雖然不是對您的問題的直接回答,但您可能想重新思考如何處理時間。有兩種常用方法:1.恆定的幀長度。 2.可變的幀長。在第一種方法中,您將每個幀視爲一秒的X分數(通常爲60),因此每次只需添加值/ X。在第二種方法中,您將時間增量傳遞給它並將其乘以每秒的值。 – user3820547 2014-12-03 07:55:26