درس 10 : ساخت کلاس Timer

درس 10 : ساخت کلاس Timer

 

شما تا کنون با برنامه هایی که توسط رویداد ها کنترل می شوند اشنا شدید حالا وقت اشنایی شما با برنامه هایی است که توسط زمان کنترل می شوند در این درس یاد می گیرید که یک کلاس 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  نمی دهد منم تعریف نمی کنم!!

نظرات 0 + ارسال نظر
برای نمایش آواتار خود در این وبلاگ در سایت Gravatar.com ثبت نام کنید. (راهنما)
ایمیل شما بعد از ثبت نمایش داده نخواهد شد