あなたが答えを見つけたかどうか、それとも、これが役立つかどうかはわかりません...私もゲームにタイマーを追加することに取り組んでいますが、いくつか質問があります...まず、私は次のコードで成功しています。(これは別の掲示板から入手したものですが、もう一度見つけられないようですので、現時点で信用を与えていないことをお詫びします。サイトを見つけたら、この投稿を編集します)。
コンソール ウィンドウにカウントを表示するように記述されたこのコードを取得し、画面に表示するように変更しました。
タイマーとティックでほとんど成功しませんでした(何らかの理由で、プログラムが無限ループを実行しているように見えました...とにかく:
これは私が使用しているものです:
import time
import threading
import pygame, sys
#among others....
#timer clock
global timerrun #I added this to show / hide the clock from my main screen
timerrun = 0 #just a default
class Timer (threading.Thread):
def __init__(self,seconds):
self.runTime = seconds
threading.Thread.__init__(self)
def run(self):
time.sleep(self.runTime)
class CountDownTimer(Timer):
def run(self):
counter = self.runTime
for sec in range(self.runTime):
global timerrun
timerrun = 1 #set timer is running global variable - tells main loop to display clock
global timedisp #set timedisplay as global var so it can be shared between threads
timedisp = clockfont.render(str(counter),1,(255,255,255))
#print str(counter)
time.sleep(1.0)
counter -= 1
class CountDownExec(CountDownTimer):
def __init__(self, seconds, action):
self.action = action
CountDownTimer.__init__(self, seconds)
def run (self):
CountDownTimer.run(self)
self.action()
def myAction():
#print "Perform an action here... say GAME OVER!"
global timedisp
timedisp = clockfont.render("GAME OVER",1,(255,255,255))
c = CountDownExec(timeonclock,myAction)
いくつかの注意点: まず、これが何をするのか 100% 確信が持てません... 基本的に、最初の部分はタイマー関数を設定します。2 番目の部分では、タイマーの変数を設定します (カウントと遅延... 今のところ、簡単にするために 1 秒ずつ増やしています)。
次の部分 (私が思うに) は、この関数を新しいスレッド内で実行するように指示します。したがって、メインループから独立して自分のペースで実行されます (つまり、一度に 1 秒ずつゲームを一時停止することはありません)。
最後の部分は、時計がゼロになったときに何をしたいかです... グローバルな timedisp 変数を「ゲームオーバー」と言うように再設定します
また、このメソッドがシステムにどのように負担をかけているのかわかりません。これが「効率的かどうか」はわかりません-これについて誰かの意見が欲しいです。
これらの関数の前に、フォントを次のように定義しています。
clockfont = pygame.font.SysFont("#FONT_NAME",SIZE) #font to use for timer clock
私のメインループでは、次のように結果を表示しています:
if timerrun == 1:
clockpos = (screenwidth - timedisp.get_width()) /2 #center my clock
screen.blit(timedisp,(clockpos,100)) #put it on screen
繰り返しますが、timerrun 変数を使用しているのは、(私のゲームで) 時計をオプションにしたいからです... テストのために、キーボードの "t" キーを押すまで時計は表示されません.. タイマーを実行します新しいスレッドで:
if event.key==K_t:
c.start();
その後、時計が表示され、カウントダウンし、終了すると「GAME OVER」と表示されます。
誰かが助けてくれるなら、ここに私の質問があります...
グローバル変数を介して変更テキストを渡すことがこれを行うための「正しい」方法であるかどうかはわかりません..これら2つのスレッドを使用して画面上の表示を更新するより良い方法があるかどうか、またはどのように行うかを誰かに教えてもらえますか.
タイムアップ時のアクション(「ゲームオーバー」と表示されている部分)をメインスレッドに戻して実行したい(これでいいのか?)
例: 時間がなくなると、2 人のプレイヤーのスコアを比較して勝者を宣言する関数が実行されます。- 「スレッド 2」(タイマー) が「スレッド 1」(ゲームの残りの部分) で関数を呼び出すようにするにはどうすればよいですか??
最後に、プログラム全体をリセットせずに時計を「リセット」する方法を探しています。もう一度「t」を押すと、スレッドを最初からやり直すことができないというエラーが表示されます。時計を再起動する方法について誰か提案できますか??
どうもありがとうございました!
ジェイ