شما تا کنون با برنامه هایی که توسط رویداد ها کنترل می شوند اشنا شدید حالا وقت اشنایی شما با برنامه هایی است که توسط زمان کنترل می شوند در این درس یاد می گیرید که یک کلاس 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 نمی دهد منم تعریف نمی کنم!!
می شود در به در واژه بازار نبود
می توان تقدیم کرد و پشیزی به پشیزی نفروخت
می توان عشق به آنها آموخت
این هم یک مقایسه که نشان دهنده قدرت OpenGL در برابر DirectX
Feature: |
OpenGL |
DirectX |
Vertex Blending |
N/A |
Yes |
Multiple Operating Systems |
Yes |
No |
Extension Mechanism |
Yes |
Yes |
Development |
Multiple member Board |
Microsoft |
Thorough Specification |
Yes |
No |
Two-sided lighting |
Yes |
No |
Volume Textures |
Yes |
No |
Hardware independent Z-buffers |
Yes |
No |
Accumulation buffers |
Yes |
No |
Full-screen Antialiasing |
Yes |
Yes |
Motion Blur |
Yes |
Yes |
Depth of field |
Yes |
Yes |
Stereo Rendering |
Yes |
No |
Point-size/line-width attributes |
Yes |
No |
Picking |
Yes |
No |
Parametric curves and surfaces |
Yes |
No |
Cache geometry |
Display Lists |
Vertex Buffers |
System emulation |
Hardware not present |
Let app determine |
Interface |
Procedure calls |
COM |
Updates |
Yearly |
Yearly |
Source Code |
Sample |
SDK Implementation |
قبل از شروع درس این را بگویم که تا امروز این پروژه دارای چند فایل است
1. main.cpp
2. object.h
3. functions .h
4. definations.h
5. timer.h
البته تا الان شما هیچ کدام از این فایل هارا ندیدید ! اگر کمی صبر کنید توضیحات همه این ها را می اورم.
1.این که main برنامه هست و فعلا کار خاصی انجام نمی دهد
2.این هم در این درس توضیح می دهم
3.این یکی شامل توابع عمومی هست که در برنامه استفاده می شود
4.شامل تعریف متغییر ها و ثابت های کلی است
5.در درس بعد توضیح می دهم
خوب حالا وقت توضیح کلاس object رسیده شکل اولیه این کلاس به شکل زیر است
class object
{
private:
int x;//mokhtasaate X
int y;//mokhtasaate Y
int xVel;//sorat object dar raastaaie x
int yVel;//sorat object dar raastaaie y
SDL_Surface *pic;//axe object
public:
//taabe saazandeh
object(int p1,int p2,SDL_Surface *p3,int p4,int p5);
//Move Object baa greftane parameter
//RIGHT LEFT UP DOWN in harkathaaraa
//anjaam midahad
void moveO(const int);
//Object raa be screen michasbaanad
void show();
//be noghte baa X,Y delkhaah miravad
void moveToPoint(int,int);
};
xوy مختصات مبدا شی هست xVelوyVel هم همان velocity یا سرعت شی در راستاهای xوy است pic هم یک سطح است که عکس شی را در ان قرار می دهیم به ساختار SDL_Surface در درس های قبل نگاهی بیاندازید
کار moveO و moveToPoint هم تکان دادن شی است
object::object(int p1,int p2,SDL_Surface *p3,int p4,int p5)
{
xVel = p1;
yVel= p2;
pic = p3;
x = p4;
y = p5;
}
تابع سازنده با گرفتن 5 پارامتر متغییر ها را تنظیم می کند.
void object::moveO(const int p1)
{
switch(p1)
{
case LEFT :
if(x>xBoundLeft) // check mikonad ke az chap mahdoodeh khaarej nashavad
x-=xVel;
break;
case RIGHT :
if(x+pic->w<xBoundRight)// check mikonad baraie raast
x+=xVel;
break;
case UP :
if(y>yBoundUp) // vaase baalaa
y-=yVel;
break;
case DOWN :
if(y+pic->h<yBoundDown) // vaase paain
y+=yVel;
break;
}
}
خوب یکسری از این ها در Definations.h تعریف شده اند با فرستادن پارامتر مناسب شی را حرکت می دهد و متغییر های Bound هم محدوده حرکت اشیا را تعیین می کنند
void object::show()
{
apply_surface(x,y,pic,screen,NULL);
}
تابع show هم کار چسباندن به screen را انجام می دهد
void object::moveToPoint(int p1,int p2)
{
if((x != p1)||(y !=p2))
{
if(x<p1)
x += xVel;
else
x -= xVel;
if(y<p2)
y += yVel;
else
y -= yVel;
}
}
تابع moveToPoint هم که فعلا BUG دارد با گرفتن نقطه تا وقت برابری X,Y شی با آن نقطه یکی یکی به x,y اضافه می کند.
پروژه را امروز شروع می کنم
شاید به این لیست بعدا یه چیزایی اضافه بشود.
حداقل چیزایی که لازم داریم :
1.اسم و طرح بازی ( هر دوشون طراحی کردم بعدا می گم )
2.یک کلاس object برای تکان دادن سطوح در صفحه
3.یک کلاس timer که شبیه این ساعت های ورزشی عمل کند واسه تنظیم فرم و نمایش FPS (Frame Per Second) بازی
4.یک کلاس برای مدیریت موس
5.یک کلاس camera برای scroll کردن map و دنبال یک شی رفتن
6.یک تابع برای تشخیص بر خورد دوشی یا دو مربع با هم
7.کار با SDL_Mixer برای صدا گزاری رو بازی
8.ارائه روشی برای دریافت ورودی string از keyboard مثلا IP سرور
9. کار با شبکه به وسیلهSDL_Net
10.طراحی منو و شخصیت های بازی
11. چگونه دکمه های منو را شفاف کنیم که زیرشون دیده بشود
12.شاید از Multi-Threading هم استفاده کردیم
13.روشی برای خواندن map بازی
14. ...
این لیستی از کارهای مورد نیاز برای ساختن هر بازی بعدا لیست تخصصی بازی خودم می گم اگر شما هم می خواهید چیزی به لیست اضافه کنید می توانید