2016-04-03 233 views
2

Python版本:3.5.1和PyGame版本:1.9.2a0在pygame中閃爍圖像

我的主要目標是在屏幕上閃爍圖像。開0.5秒,關0.5秒。

我知道下面可以60fps的

frameCount = 0 
imageOn = False 
while 1: 

    frameCount += 1 



    if frameCount % 30 == 0: #every 30 frames 
     if imageOn == True: #if it's on 
      imageOn = False #turn it off 
     elif imageOn == False: #if it's off 
      imageOn = True #turn it on 



    clock.tick(60) 

工作,但我不認爲這是現實中一個int被計數的幀。最終我的幀號會太大而無法存儲在int中。

如何在不存儲當前幀(在此情況下爲frameCount)的情況下每隔x秒刷新一次圖像?或者,這實際上是最實際的方法嗎?

+0

請注意,python Ints不限於32位:它們會自動轉換爲「bigints」。另外請注意,在60fps時,您的遊戲需要運行大約2.3年,然後才需要超過32位。 –

+0

有趣的一點大安。還有Racialz,如果你擔心它,你可以有一個if語句來重置它。如果frameCount> 1000000:frameCount = 0編輯:其中一個答案解決了我以前說 –

回答

1

避免讓你的遊戲依賴於框架速度,因爲它會根據幀速率改變一切,並且如果計算機無法運行幀速率,整個遊戲就會變慢。

這個變量將幫助我們跟蹤已經過了多久。 while while循環之前:

elapsed_time = 0 

爲了找出幀需要的時間。 MY_CLOCK是pygame的時鐘對象,60是任意

elapsed_time += my_clock.tick(60) # 60 fps, time is in milliseconds 

而且你可以有一個if語句某處while循環:

if elapsed_time > 500 # milliseconds, so .5 seconds 
    imageOn = False if imageOn else True 
    elapsed_time = 0 # so you can start counting again 

編輯:我建議你看一看Chritical的答案更簡單的方法改變imageOn的True False值。我使用了內聯條件,這是有效的,但沒有必要。

0

我不知道這對您有多大幫助,但是爲了防止您的frameCount變得太大,只要您改變imageOn的狀態,例如,您可以使其等於0

if frameCount % 30 == 0: 
    if imageOn == True: 
     imageOn = False 
     frameCount = 0 
    elif imageOn == False: 
     imageOn = True 
     frameCount = 0 

但是,如果沒有其他人以更好的方式回答問題,我只推薦這是最後的選擇。希望這有助於,即使有點!

編輯:我只是意識到,你也可以更巧妙地通過簡單地使imageOn = not imageOn構造代碼:

if frameCount % 30 == 0: 
    imageOn = not imageOn 
    frameCount = 0 
+0

謝謝,這些都是有幫助的,我想知道如果蟒蛇有一些像你提到的技巧 – Keatinge

0

你可以嘗試使用pygame的timers

import pygame 
from pygame.locals import * 

def flashImage(): 
    imageOn = not imageOn 

pygame.init() 
pygame.time.set_timer(USEREVENT+1, 500) # 500 ms = 0.5 sec 
imageOn = False 
while 1: 
    for event in pygame.event.get(): 
     if event.type == USEREVENT+1: 
      flashImage() 
     if event.type == QUIT: 
      break