شما تا کنون با برنامه هایی که توسط رویداد ها کنترل می شوند اشنا شدید حالا وقت اشنایی شما با برنامه هایی است که توسط زمان کنترل می شوند در این درس یاد می گیرید که یک کلاس Timer بسازید که بتواند چند کار ساده ولی اساسی ساعت های معمولی را انجام بدهد شما می توانید این کلاس را به دلخواه خود ارتقا دهید.
اساس کار این کلاس دستور SDL_GetTicks() از سیستم time از SDL است که مقدار وقتی که از اماده شدن time می گذرد را در فرمت میلی ثانیه و ثانیه بر می گرداند. اگر شما مثلا برای کاری در برنامه نیازمند دو ثانیه زمان باشید باید زمان فعلی را در متغییری قرار دهید و منتظر شوید اختلاف زمانی که می گذرد از مقدار موجود در ان متغییر برابر2000 شود.
class timer
{
private:
int start_time; // zamani ke timer shoro bekaar kard
int pause_time; // vaghti pause shod zaman paused negah midaare
//vaziat timer
bool paused;
bool started;
public:
timer();//taabe saazandeh
void start();
void stop();
void pause();
void play();
/*
meghdaar saanieh va milisaanieh ke az shooroo kaar gozashte raa
bar migardaanad dar soorat pause boodan pause_time o barmigardoone
*/
int get_time();
// vaziate timer pause ya play boodanesh o ba 1 o sefr neshoon mide
int vaziat();
};
این تعریف اولیه کلاس timer است. Start_time زمان شروع را در خود نگه می دارد زمانی که timer استارت خورد مقدار دهی می شود تابع سازنده کار set کردن متغییرها را انجام میدهد وstart وstop و pause و play هم از اسمشان معلوم است get_time مقدار زمان را به میلی ثانیه بر می گرداند و vaziat وضعیت timer را در صورت pause بودن مقدار 0 را بر می گرداند
timer::timer()
{
paused = false;
started = false;
start_time = 0;
pause_time = 0;
}
اینجا هم تابع سازنده کلاس کار تنظیم متغییرها را انجام می دهد .چیز بیشتری واسه توضیح نیست
void timer::start()
{
//start mizaneh
started = true;
//Unpause mikoneh
paused = false;
//tedaad milisaanihaa va saaniehaai gozashte az shoro
//barnaameh raa migirad
//hamaan vaght shooroo maaraa set mikonad
start_time = SDL_GetTicks();
}
وقتی timer استارت می خورد ما وضعیت started را true می کنیم timer را unpause می کنیم و start_time را به مقدار زمان فعلی ست می کنیم
void timer::stop()
{
//timer o stop va unpause mikonad
started = false;
paused = false;
}
وقتی هم تایمر stop شد وضیعت started را false می کنیم و تایمر را unpause می کنیم.
void timer::pause()
{
if(started && (paused==false))
{
paused = true; //timer o pause mikone
//pause time o mohaasebeh mikoneh
pause_time = SDL_GetTicks() - start_time;
}
}
حال وقتی می خواهیم تایمر را pause کنیم اول چک می کنیم که تایمر در حال کار کردن است و چک می کنیم که pause نباشد .اگر می توانستیم تایمر را pause کنیم flag اش را true می کنیم و وقت را در pause_time نگه می داریم.
int timer::get_time()
{
if(started)//agar start khorde baasheh
if(paused)//age pause shode baashe
return pause_time;
else//age nashode baashe time feli menhaaie time shooroo bar migardoone
return SDL_GetTicks()-start_time;
else
return 0;//agar nakhorede bashe sefr bar migardooneh
}
این تابع زمان را بر می گر داند در اول کار چک می کنیم که تایمر در حال اجرا است اگر هست چک می کنیم pause هست اگر pause بود ما مقدارpause_time را بر می گردانیم اگر pause نبود ما اختلاف زمان فعلی و و زمان شروع را بر می گردانیم به عنوان مثال اگر در 15000 تایمر استارت خورده باشد و الان 21500 باشد مقدار 6500 را بر می گرداند که به معنی 6.5 ثانیه است.در صورت استارت نخوردن هم مقدار 0 را بر می گرداند.
void timer::play()
{
if(paused)
{
//unpause mikone
paused = false;
//dobaareh start_time o set mikonad
start_time = SDL_GetTicks() - pause_time;
pause_time = 0;
}
}
این تابع کار unpause کردن را به عهده دارد اول چک می کنیم تایمر pause هست یا نه اگر بود flag (نشان) ش را false می کنیم. در اینجا هم ما start_time را دو باره ست می کنیم و pause_time هم بدون دلیل 0 می کنیم به خاطر این که نم خواهیم متغییر هامون ولگرد باشند!
تابع vaziat هم تعریف نکنیم error نمی دهد منم تعریف نمی کنم!!