2011-04-24 66 views
9

我正在用C++開發一個簡單的遊戲,一個追逐點式的遊戲,你必須在顯示屏上點擊一個繪製的圓圈,然後每次點擊跳轉到另一個隨機位置,但是我想讓遊戲結束在60秒左右之後,將分數寫入文本文件,然後啓動從文本文件讀取的程序並將信息存儲到數組中,並以某種方式重新排列它以創建高分表。 我想我可以自己計算出某個區域的高分和鼠標點擊,但我完全停留在創建一個可能的計時器。 任何幫助表示讚賞,歡呼!在C++中製作計時器?

+3

我想這將是問題的提與平臺類型。時鐘是硬件功能,訪問它是依賴於平臺和庫。例如。 linux,Win32? SDL,控制檯? etc – sehe 2011-04-24 20:39:31

回答

0

通常GUI程序有所謂的「消息泵」循環。檢查該計時器應該是你的循環的一部分:

while(running) 
{ 
    if(current_time() > end_time) 
    { 
    // time is over ... 
    break; 
    } 
    if(next_ui_message(msg)) 
    dispatch(msg); 
} 
+5

可能不是。您應該可以通過您的OS /框架創建一個計時器,並讓它向您發送事件。 – 2011-04-24 21:23:38

+0

對於unapersson:如果你知道OS /框架,那麼 - 「是」,你可以使用OS原語。 在提出問題的方式,我相信我的答案是足夠的。 在SDL中,例如,這是他們如何在那裏執行[空閒]定時器的方式。 – 2011-04-24 22:40:50

+0

事件輪詢可以與SDL一起使用,但GUI程序通常使用回調。 – 2011-04-25 00:11:22

1

沒有參考特定的框架甚至操作系統,這是無法回答的。

在SDL中有適合目的的SDL_GetTicks()

在Linux上,有一般用途clock_gettimegettimeofday應該在任何地方工作(但要注意細節)。

的Win32 API具有與此相關的幾個函數調用,包括定時器回調機制,如GetTickCountTimers等(article

使用定時器通常密切相關的「空閒」處理的模因。所以你也想要搜索這個話題(這是消息泵進來的地方,因爲消息泵決定何時(例如)WM_IDLE消息發送; Gtk有一個類似的空閒鉤子概念,我估計很多每個UI框架)

17

在C++ 11中,可以輕鬆訪問定時器。例如:

#include <chrono> 
#include <iostream> 

int main() 
{ 
    std::cout << "begin\n"; 
    std::chrono::steady_clock::time_point tend = std::chrono::steady_clock::now() 
               + std::chrono::minutes(1); 
    while (std::chrono::steady_clock::now() < tend) 
    { 
     // do your game 
    } 
    std::cout << "end\n"; 
} 

您的平臺可能支持或不支持<chrono><chrono>有一個boost的實現。

+0

回答關於文字操作符的另一個問題:我最初認爲'operator「」_Foo「沒有問題,但是現在看來在第17.6.4.3節的庫中使用」name「似乎包含宏? (而不是3p4的「名稱」的核心定義)。它以「C++標準庫保留以下類型的名稱:...宏,...」開頭。這似乎將用戶限制在下劃線之後的小寫/數字文字後綴,因爲一些隨機宏可能會將'_Foo'替換爲隨機的東西。 – 2011-04-25 15:13:22

+0

同意。他們只能有一個領先的下劃線。真的很遺憾,我們沒有對宏進行某種範圍的確定。 – 2011-04-25 18:01:18

0

試試這個:

//Creating Digital Watch in C++ 
#include<iostream> 
#include<Windows.h> 
using namespace std; 

struct time{ 

int hr,min,sec; 
}; 
int main() 
{ 
time a; 
a.hr = 0; 
a.min = 0; 
a.sec = 0; 

for(int i = 0; i<24; i++) 
{ 
    if(a.hr == 23) 
    { 
     a.hr = 0; 
    } 

    for(int j = 0; j<60; j++) 
    { 
     if(a.min == 59) 
     { 
      a.min = 0; 
     } 

     for(int k = 0; k<60; k++) 
     { 
      if(a.sec == 59) 
      { 
       a.sec = 0; 
      } 

      cout<<a.hr<<" : "<<a.min<<" : "<<a.sec<<endl; 
      a.sec++; 
      Sleep(1000); 
      system("Cls"); 
     } 
    a.min++; 

} 

    a.hr++; 
} 

}