SDL程式設計入門(23)高階定時器

2021-10-12 13:58:07 字數 3263 閱讀 9656

現在我們已經做了乙個用sdl做的基本計時器,是時候做乙個可以啟動/停止/暫停的計時器了。

class

ltimer

;對於這些新功能,我們將建立乙個定時器類。 它具有啟動/停止/暫停/取消暫停計時器並檢查其狀態的所有基本功能。在資料成員方面,我們有像之前一樣的開始時間,有乙個變數來儲存暫停時的時間,還有狀態標誌來跟蹤定時器是在執行還是暫停。

ltimer::

ltimer()

我們的建構函式初始化內部資料成員。

void ltimer::

start()

start函式設定啟動和暫停標誌,獲取定時器的啟動時間,並將暫停時間初始化為0,對於這個定時器,如果我們想重新啟動它,只需再次呼叫start即可。由於我們可以在定時器暫停和/或執行的情況下啟動它,所以我們應該確保清除暫停的資料。

void ltimer::

stop()

stop函式基本上重新初始化了所有的變數。

void ltimer::

pause()

}

暫停時,我們要檢查定時器是否在執行,因為暫停乙個沒有啟動的定時器是沒有意義的。如果定時器正在執行,我們設定暫停標誌,將定時器暫停的時間儲存在mpausedticks中,並重新設定啟動時間。

void ltimer::

unpause()

}

因此,當我們取消暫停定時器時,要確保定時器正在執行和暫停,因為我們不能取消乙個停止或執行的定時器。我們將暫停標誌設定為false,並設定新的啟動時間。

比如說,如果你在sdl_getticks()報告5000毫秒時啟動定時器,然後在10000毫秒時暫停。這意味著暫停時的相對時間是5000ms。如果我們要在sdl_getticks為20000時取消暫停,則新的開始時間將為20000-5000ms或15000ms。 這樣,相對時間仍將與當前sdl_getticks時間相距5000ms。

uint32 ltimer::

getticks()

else

}return time;

}

獲取時間是有點棘手的,因為我們的定時器可以執行、暫停或停止。如果定時器是停止的,我們只是返回初始的0值。如果定時器暫停,我們返回暫停時儲存的時間。如果定時器正在執行而不是暫停,我們返回相對於它開始時的時間。

bool ltimer::

isstarted()

bool ltimer::

ispaused()

在這裡,我們有一些訪問函式來檢查定時器的狀態。

//main loop flag

bool quit =

false

;//event handler

sdl_event e;

//set text color as black

sdl_color textcolor =

;ltimer timer;

//in memory text stream

std::stringstream timetext;

在進入主迴圈之前,我們宣告乙個定時器物件和乙個字串流來將時間值變成文字。

else

if( e.type == sdl_keydown )

else

}//pause/unpause

else

if( e.key.keysym.sym == sdlk_p )

else

}}

當我們按s鍵時,我們檢查定時器是否啟動。如果啟動了,我們就停止它。如果沒有,我們就啟動它。當我們按p鍵時,我們檢查定時器是否暫停。如果是,我們就取消暫停。否則,我們將暫停它。

//set text to be rendered

timetext.

str("")

;timetext <<

"seconds since start time "

<<

( timer.

getticks()

/1000.f);

//render textif(

!gtimetexttexture.

loadfromrenderedtext

( timetext.

str().

c_str()

, textcolor )

)//clear screen

sdl_setrenderdrawcolor

( grenderer,

0xff

,0xff

,0xff

,0xff);

sdl_renderclear

( grenderer )

;//render textures

gstartprompttexture.

render

(( screen_width - gstartprompttexture.

getwidth()

)/2,

0);gpauseprompttexture.

render

(( screen_width - gpauseprompttexture.

getwidth()

)/2, gstartprompttexture.

getheight()

);gtimetexttexture.

render

(( screen_width - gtimetexttexture.

getwidth()

)/2,

( screen_height - gtimetexttexture.

getheight()

)/2)

;//update screen

sdl_renderpresent

( grenderer )

;

在渲染之前,我們將當前時間寫入乙個字串流。我們之所以將其除以1000,是因為我們要的是秒,而每秒有1000毫秒。

之後我們將文字渲染成紋理,最後將所有的紋理繪製到螢幕上。

2 3 定時器和時間物件

一 定時器分為兩種 開啟定時器 setinterval function 時間 返回定時器id settimeout function 超時時間 返回定時器id 清楚定時器 cleartimeout 定時器id clearinterval 定時器的id 傳送驗證碼 button var btn do...

linux 定時器程式設計

在編寫應用程式的時候,經常需要用到定時器。根據使用情況,定時器的基本行為分為2種 single shot timer和repeating timer single shot timer 從註冊到終止只執行一次。repeating timer每次終止後自動執行。linux 在定時程式設計有以下幾種介面...

Windows定時器程式設計

一般時控函式 vc程式設計師都會利用windows的wm timer訊息對映來進行簡單的時間控制 1.呼叫函式settimer 設定定時間隔,如settimer 0,200,null 即為設定200毫秒的時間間隔 2.在應用程式中增加定時響應函式ontimer 並在該函式中新增響應的處理語句,用來完...