2016-12-02 3 views
2

私はゲームのMVPを書いています。しかし今、私はそれにストップウォッチを追加して、プレイヤーがゲームの左下隅または右下隅にカウントダウンされている時間を見ることができるようにします。これは、そのようなストップウォッチを作成する方法、それを私のゲームにどのように含めるかについての質問ではありません。ゲームにタイマーを追加するスレッドを実装する方法は?

私は、画面上に時計の数字をレンダリングする方法を考え出しましたが、問題は、私は時計をオフにトリガするために、任意の入力を使用する場合、ゲームがクロックループに陥ったままということです。ここで説明するいくつかのコードは:T1の出力を介して表示され

// when the player makes her first input the clock is triggered 

if (!CLOCK) 
    this->clockStatus(ON); 


// within the clockStatus function 
void Game::clockStatus(TimerState Status) 
{ 
    do {        /* Infinite Loop */ 
     t2->getTimefromSeconds(getCurrentSysTime()); 
     break; 
    } while (1); 
    while (1) {      /* Another infinite loop */ 
     t_inter->getTimefromSeconds(getCurrentSysTime()); 
     t1 = (Timer*)(t_inter - t2); 
    } 
} 

:明確にするため

t1.display(); 

、TimeStateはストップウォッチの状態を管理する列挙である(ON/OFF)タイマです。実際のストップウォッチクラス。私はプレイヤーがストップウォッチをオフトリガーゲーム、に彼らの最初の入力を行ったとき、私はこのための新しいスレッドを作成するべきであると結論している研究の後

。このように、メイン関数は正常に実行され、セカンダリスレッドはゲーム時間を計算できます。これを実装する方法について私が読むことができるチュートリアルやpdfやエクササイズはありますか?また、すべての有益な提案を歓迎します。

+0

Surmisingあなたはこのような状況では、 'threads'を必要とする、あなたは途中でそこにいます。ディスプレイ/レンダリングに使用しているプラ​​ットフォームの種類を知ることは役に立ちます。たとえば、Qtを使用している場合は、QtのTimerクラスを簡単に使用できます。それはウィジェット表示システムがそのままマルチスレッドです。 – Quirk

+0

'Timer'は何か、そしてどのようなタイプは、' t1'、 't2'、と' t_inter'ですか? – qxz

+0

OpenGLとGLFWを使用しています。しかし、私はC++ – MagnusHimmler

答えて

1

私が理解から、あなたはストップウォッチを開始し、それを開始してからの経過時間を表示することができるようにしたいです。これを行う最も簡単な方法は、開始時刻を保存してから(通常のレンダーループで)現在の時刻との差分を見つけ出すことです。

#include <chrono> 

inline auto currentTime() { 
    return std::chrono::high_resolution_clock::now(); 
} 

struct Timer { 
    Timer() { reset(); } 
    void reset() { // reset the stopwatch to 0 
     startTime = currentTime(); 
    } 
    double getElapsed() { // get the elapsed time (in seconds) 
     return std::chrono::duration_cast<std::chrono::nanoseconds>(
        currentTime() - startTime 
       ).count()/1000000000.0; 
    } 
    std::chrono::time_point<std::chrono::steady_clock> startTime; 
}; 

使用例:あなたはこのヘルパークラスを使用でき

// global 
Timer stopwatch; 

// when the player does first input (or whenever) 
stopwatch.reset(); 

// in your loop 
double stopwatchSeconds = stopwatch.getElapsed(); 
// display the value... 
+0

はあなたの例では、うまく機能いくつかの変更後、qxzありがとうございました! – MagnusHimmler

+0

@MagnusHimmler qxzの答えがあなたの問題を解決するならば、それを忘れないでください。 –

関連する問題