درس 12 : نوشتن بازیهای تحت شبکه با SDL_net قسمت دوم

حال قدری عمیق تر به SDL_net نگاه می کنیم .

 

شبیه SDL , SDL_net هم باید قبل از استفاده اماده شود بوسیله تابع SDLNet_Init :

int SDLNet_Init(void);

شما در صورت درست آماده شدن مقدار غیر صفر بر می گرداند.

 

و اما ساختار IPaddress :

typedef struct {

Uint32 host; /* 32-bit IPv4 host address */

Uint16 port; /* 16-bit protocol port */

} IPaddress;

Host به عنوان یک Uint32 تعریف شده و نگه دارنده 4 بایت شناسه یک کامپیوتر است.البته یک مقدار ثابتهایی هم براش در نظر گرفته شده است مثل :

 INADDR_ANY(0) و INADDR_NONE(0xFFFFFFFF)

شما از INADDR_ANY برای سوکت های سرور استفاده می کنید و از INADDRE_NONE هم برای موقعی که نمی خواهید در شبکه دیده شوید.

 

Port هم به عنوان یک Uint16 تعریف شده است که نمایند مدخل ورود و خروج اطلاعات بر روی کامپیوتر است شبیه یک در در نظر بگیرید که روش یه شماره دارد وشماره چون 2 بایتی پس از صفر می تواند باشد تا 65535.

 

حال دو تابعی که با IP ادرس کار می کنند را به شما می گم

اولیش SDLNet_ResolveHost است شما از این تابع برای پیدا کردن IP سرور ی که می خواهید به ان وصل شوید استفاده می کنید مثلا اسمش و دارید gamedev.net می خواهید IP اش را بدانید . یا می توان با این تابع یک سرور بسازیم

int SDLNet_ResolveHost(IPaddress *address, char *host, Uint16 port);

این تابع یک int بر می گرداند در صورت پیش امدن اشکال مقدار صفر بر می گرداند پارامتر اول یک ساختار IPaddress می گیرد و ان را پر می کند پارامتر بعدی یک رشته بع عنوان اسم می گیرد اگر Lan بود مثلا 192.168.0.1 یا اینترنت phyton.org به هر معرفی کننده جایی که می خوایم به ان وصل شویم و پارامتر اخر هم مشخص کننده مدخلی است که سرور برای ما باز گذاشته است و خود داره روش Listen می کند.

وقتی بخواهید یک سوکت سرور بنویسید شما باید host را NULL قرار دهید معادل قرار دادن هاست به INADDR_ANY است

اگر شما IP ماشینی را دارید و اسمش را بخواهید کافی است IP ان را به یک اشاره گر به ساختار IPaddress بدهید وسپس از این تابع استفاده کنید.

char * SDLNet_ResolveIP(IPaddress *ip);

اگر host را به INADDR_ANY ست کنید اسم کامپیوتر خود را بر می گرداند در غیر اینصورت می گردد و اسم را پیدا می کند.

یک sample از اینچیزای که گفتم تا اینجا  (اسم کامپیوتر من Anothername !):

 

#include "sdl/sdl.h"

#include "sdl/sdl_net.h"

#include

int main(int argc,char* argv[])

{

            if(SDL_Init(SDL_INIT_EVERYTHING)==-1)

            {

            return(0);

            }

            atexit(SDL_Quit);

            if(SDLNet_Init())

            {

            return(0);

            }

            atexit(SDLNet_Quit);

            IPaddress ip;

            SDLNet_ResolveHost(&ip,NULL,16);

            fprintf(stdout,"Local Host: %s ",SDLNet_ResolveIP(&ip));

            SDLNet_ResolveHost(&ip,"www.gamedev.net",16);

            fprintf(stdout,"Remote Host: %s ",SDLNet_ResolveIP(&ip));

            return(0);

}

 

 

TCPScocket:

یک TCPsocket یک اشاره گر است به ساختار _TCPsocket :

typedef struct _TCPsocket *TCPsocket;

تعریف ساختار _TCPsocket از برنامه نویس ها مخفی شده است چون نیازی به دانستن کارش نیست اگرم خواستین می توانید source code , SDL_net را از libsdl.org/projects دانلود کنید و ببینید.

قبل از این که بتوانید اطلاعاتی را به کامپیوتر های دیگر بفرستید باید اول یک سوکت باز کنید و اون کامپیوتری که روش سوکت باز می کنید باید یک سوکت سرور هم داشته باشد  پس در یک زمان شما نیازمند باز کردن یک سوکت سرور هم هستید شما با استفاده از یک تابع هر دو تا کار و انجام می دهید.

TCPsocket SDLNet_TCP_Open(IPaddress *ip);

این تابع یک اشاره گر به IP ادرس می گیرد و یک TCPSocket می سازد اگر NULL برگرداند یعنی اشتباهی رخ داده است. اگر ip.host به INADDR_ANY یا INADDR_NONE تنظیم شده باشد یک سوکت سرور می سازد و اگر نه تلاش می کند که به ان سرور وصل شود.

 

معمولا اگر یک سوکت باز کنید بعدا باید ببندینش تابع انجام دادنش هم :

void SDLNet_TCP_Close(TCPsocket sock);

حالا چند کلمه در مورد فرق بین سوکت های سرور و سوکت های کلاینت فرض کنید مثلا بخواهید یک برنامه چت بنویسید که می تونید انتخاب کنید برنامه تون سرور باشد یا به یک سرور وصل شود برای قسمت سرور شما لازمه یک سوکت سرور داشته باشید به تعداد سوکت های کلاینت که به سرور شما وصل شده اند و در نقش یک کلاینت شما فقط نیاز به یک سوکت کلاینت دارید برای ارتباط با سرور, سوکت سرور در حال listen کردن کامپیوترهای دیگه هست که به session اضافه می وند و شما یک سوکت سرور را برای send و receive اطلاعات لازم نداریدوقتی یک سوکت سرور اطلاعاتی اماده خوندن دارد شما از تابع SDLNet_TCP_Accept استفاده می کنید.

TCPsocket SDLNet_TCP_Accept(TCPsocket server);

این تابع یک سوکت TCP می گیرد و حتما هم باید از نوع سرور باشد و یک TCPSocket بر می گرداند که مقدار برگشتی یک کانکشن است به کامپیوتر مقصد که از SDLNet_TCP_Open استفاده کرده بودیم که با ان ارتباط بر قرار کنیم.

بعد از اینکه این کار را برای اتصال به یک ماشین جدید کردیم می توانیم IP کامپیوتر را به وسیله تابع SDLNet_GetPeerAddress بدست اوریم.

IPaddress * SDLNet_TCP_GetPeerAddress(TCPsocket sock);

و تابعی دیگر که برای ارصال اطلاعات از ان استفاده می شود SDLNET_TCP_SEND است.

int SDLNet_TCP_Send(TCPsocket sock, void *data, int len);

این تابع یک TCPsocket غیر سرور می گیرد یک Void * هم که اشاره دارد به دادهای ما و طول داده ومقدار داده ای که فرستاده شد را بر می گرداند که اگر برابر باlen نباشد یعنی خطایی رخ داده است.

تابعی هم برای  دریافت اطلاعات هست :

int SDLNet_TCP_Recv(TCPsocket sock, void *data, int maxlen);

که مثل بالای است ومقدار بازگشتی 1 یعنی کار درست انجام شده است.

باور بکنید یا نه SDL_net با 8 تابع و 2 ساختار می تواند تقریبا هر نوع برنامه شبکه ای را بنویسد.

 

SDL_net توابعی برای UDP هم دارد که من در اینجا توضیح نمی دم چون فکر می کنم TCP همه کارهای شما را می تواند راه بیاندازد.

 

یک ساختار SDLNET_SocketSet هم هست برای نگه داری ارایه از سوکت ها اول باید با دستور SDLNET_AllocSocketSet اماده شود.

Net_SocketSet SDLNet_AllocSocketSet(int maxsockets);

برای add کردن سوکت :

int SDLNet_AddSocket(SDLNet_SocketSet set, SDLNet_GenericSocket sock);

برای پاک کردن سوکت :

int SDLNet_DelSocket(SDLNet_SocketSet set, SDLNet_GenericSocket sock);

و دستور :

int SDLNet_CheckSockets(SDLNet_SocketSet set, Uint32 timeout);

 

Resource Focus On SDL

ISBN :  1592000304 

درس 12 : نوشتن بازیهای تحت شبکه با SDL_net قسمت اول

درس 12 : نوشتن بازیهای تحت شبکه با SDL_net

 

در این درس شما  با SDL_net اشنا می شوید کتابخانه الحاقی مورد علاقه من. حتی اگر با برنامه نویسی شبکه اشنا نیستید می توانید sdl_net را به عنوان یک کتابخانه بشناسید ولی پیشنهاد من این است که قبل از خواندن این بخش اطلاعاتی در مورد شبکه پیدا کنید

 

همانطور که با دانستن اینکه چگونه می توانید یک pixel را در صفحه مقدار دهی کنید می توانید تمام دنیای گرافیک (بر روی مانیتور خود) را در دستان خود بگیرید از 2 بعدی تا 3 بعدی (3 بعدی هم نوعی دو بعدی است بر روی مانیتور)  در شبکه هم وقتی فهمیدید چگونه می توانید packet (بسته)(منظور چند بایتی است که به عنوان اطلاعات در نظر گرفته می شود) را از کامپیوتری به کامپیوتر دیگر منتقل کنید تمام دنیای شبکه در دستان شماست!! .

 

مقدمات برنامه نویسی شبکه :

چند تا چیز هست که قبل از شروع با SDL_net باید یاد بگیرید. اگر شما معتاد اینترنت باشید یا با بازیهای تحت اینترنت خودتون سرگرم میکنید ( مثل من!) بعضی واژه ها باید واسه شما اشنا باشد.

 

اولیشون واژه IP , IP مخفف کلمه Internet Protocol و فقط مشخص کننده یک راه استاندارد و مورد تایید همه است برای مشخص کردن یک کامپیوتر بر روی اینترنت است ip شما مجموعه ای از 4 شماره است که با نقطه از هم جدا شدند شبیه 127.0.0.1 هر شماره بین دو عدد 0 تا 255 است این به این معنی که هر IP ادرس حاوی 4 بایت است هر عدد یک بایت IP شما مشخص کننده ادرس شماست بر روی شبکه واین که شما کجای این کره خاکی هستید.

 

دومی اش واژه Socket است یک سوکت یک کانکشن ساده است است از یک کامپیوتر به کامپیوتر دیگر یا از یک IP به IP دیگر بر قرار می شود . سوکت به شما اجازه می دهد که با کامپیوتر های دیگر ارتباط برقرار کنید و به گشت و گزار در اینترنت بپردازید ( راستی این اینترنت ملی چی شد!؟ )

 

2 تا واژه بعدی واژه هم Client و Server هستند اینها هم در اصل مشخص می کند کامپیوتر شما چه رولی را در بازی ایفا می کند معمولا پشت سرور های بازی کسی نمی شیند و بازیکنا پشت کلاینت می شینند. نقش سرور پروسس کردن وعکس العمل نشان دادن نسبت به اطلاعاتی است که کاربران می فرستند client هم همان کامپیوتر کاربر هست که اطلاعات به سرور ارسال میکند

 

کلمه اخر هم کلمه Host است هاست ماشینی است که اطلاعات ارسالی از کلاینت ها را در خود هاست می تواند خود یک کلاینت باشد.

 

خوب حالا می رویم به سراق اینکه چگونه شبکه ها کار می کنند ساده ترین نوع شبکه شبکه ایست که در زیر می بینید که شامل دو کامپیوتر A و B است که به هم وصل شده اند

Yoho

 

در شکل بالا AوB می توانند هر دو یک سرور باشند یا کلاینت باشند وفقط یک اتصال بین این دو است که تمام نیاز هارا بر طرف می کند برای سادگی فرض می کنیم هر دو کلاینت باشند بنابر این یک ارتباط P2P (Peer-to-Peer ) یا نقطه به نقطه به ما می دهد که عبارت است یک ارتباط ساده که سروری در ان وجود ندارد شما می تونید کامپیوتر های بیشتری هم به این شبکه اضافه کنید مثل شکل زیر که شدند 4 تا کامپیوتر A,B,C و   D

 

 

همانطور که می بینید هر کامپیوتر با 3 کامپیوتر دیگر ارتباط جداگانه ای دارد بوسیله 6 کانکشن جدا از هم هر کامپیوتر دیگری که به این 4 تا اضافه شود کانکشن های زیادی باید به این شبکه باید اضافه شود پس به ازای N تا ماشین N * (N-1) / 2  تا کانکشن لازم داریم مثلا 20 تا ماشین می شود 190 تا کانکشن پس واسه تعداد بالا این مدل جواب نمی دهد .

  

برای شبکه های بزرگتر بهترین کار استفاده از مدل کلاینت سرور هست مثل عکس زیر :

alooo

 

در دریاگرام بالا کامپیوتر A به عنوان سرور است و بقیه کلاینت هستند . کلاینت اطلاعات به کامپیوتر A می فرستد و سرور هم اطلاعات بقیه کامپیوتر ها را در صورت لزوم Update می کند در اینجا 6 کامپیوتر هست و 5 کانکشن اگر Peer to peer بود می شد 15 تا کانکشن.

ولی از این طرف هم برای ارصال یک پیغام از ماشینی به ماشین دیگر باید یک بار  به سرور فرستاده شود و دفعه بعد به ماشین دیگر که می شود 2 تا .  قبلی بود یکی . که این یک مقدار کارایی را پایین می اورد البته در اینجا هاست ما کامپیوتر سرور است اگر خراب شود کل شبکه از کار می افتد به هر حال در این نوع شبکه بندی کامپیوتر های سرور باید قوی انتخاب شوند

 

شما باید نوع خودتون را انتخاب کنید برای بازیهای که دو نفر تحت اینترنت یا شبکه محلی به هم وصل می شوند مثل بیلیارد بهترین انتخاب P2P است و بازیهای مثل counter-strike بهتره از نوع کلاینت سرور باشند .

 

نصب :

برای نصبش هم به درس 3 مراجعه کنید مثل SDL_image است

از قسمت پروژه ها دانلود کنید

http://libsdl.org/projects

 

SDL_net در یک نگاه:

4 قسمت جداگانه در SDL_net وجود دارد که هر کدام ساختاری جدا گانه ای دارد این 4 تا عبارتند از : آدرس IP  ,   سوکت TCP , سوکت UDP و Set Socket .

 

IP Address:

مشخص کننده آدرس کامپیوتر هایی است که با هم ارتباط برقرار می کنند هر کامپیوتر با یک IP   که یک شناسه 4 بایتی است و port هم که یک شناسه 16 بیتی است ( که مشخص کننده این است که از طریق کدام مدخل باید ارتباط برقرار شود مثلا مدخل 80 یا همان پورت 80 ) شناخته می شود

که در SDL_net با استراکچر IPadreess شناخته می شود.

 

TCP Socket:

شما از سوکت TCP (Transfer Control Protocol ) برای ساخت یک کانکشن بین دو کامپیوتر استفاده می کنید TCP یک پروتکل ( شما فکر کنید یک زبان استاندارد مثل عربی ) برای انتقال اطلاعات است ما دو نوع سوکت TCP داریم سرور و کلاینت . استفاده از پرتکل TCP تضمین می کند که اطلاعاتی که شما می فرستید حتما به مقصد درست می رسد سوکت TCP بوسیله ساختار TCPSocket تعریف می شود که بیشتر به عنوان یک اشاره گر تعریف می کنیم.

 

UDP Socket:

UDP(User Datagram Protocol) سوکتی شبیه به سوکت TCP است.فرقشان این است که تضمین نمی کند که اطلاعات سالم برسند ولی سرعت بیشتری دارند چون اطلاعات چک نمی شوند.

مثلا واسه ارسال ویدئو مناسب است. با ساختار UDPSocket شناسایی می شود و معمولا به عنوان اشاره گر تعریف می شوند.

 

Socket Sets:

عبارت است از مجموعه از سوکت ها و معمولا توسط سرور ها استفاده می شود برای دریافت اطلاعات ورودی از کلاینت ها و بوسیله ساختار SDLNet_SocketSet شناسایی می شوند

 و معمولا به عنوان اشاره گر تعریف می شوند.

 

تشکر

از سایت های تیزهوش و پرشین دیزاینرز و  یک روزه برای لینک دادن به وبلاگم ممنونم و همچنین از مدیر سایت آی آر اسکول به خاطر اهدای یک کرسی استادی و ای-میل و هاستینگ به من ممنونم .

و با تشکر از دوست خوبم حسین روشنی

---

 معرفی خودم :

ایمان شرف الدین دانشجوی سال اول مهندسی کامپیوتر دانشگاه علوم فنون بابل متولد ۲/۱۲/۱۳۶۵ ولی شناسنامه ۱/۱/۱۳۶۶

۳۶ واحدم تو این دو ترم پاس شد

فقط برای اشنایی شما عزیزان.

---

واما یک جواب به شما دوست عزیزی که می گویید C(یا ++C) هیچی ندارد و ارزش بازی نوشتن را ندارد !!!

نمی دانم نمی خواهم ناراحتت کنم ...

ولی شاید اون سه واحد زبان برنامه نویسی پیشرفته ای که پاس کردی

این ذهنیت را در شما ایجاد کرد که ++C هیچی نداره !!! تقصیر استادها ونظام آموزشی دانشگاهای فوق العاده اشغال ایران (منظورم تک تکشون از شریف گرفته تا آزاد شریف ام واسه این خوبه که بعضی نخبه ها توشن که تعدادشون خیلی کمتر از تعداد خرخون هاش خیلی خیلی کمتر) بعد ادعا می کنیم دانشگاهای ما حداقل تا لیسانس عالی ان ( اقا کدوم کشک کدوم دوغ ) من دانشجوهای  دانشگاه اسراییل!! که ما به قول خودمون کشور حسابش نمی کنیم می دیدم این چی game engine 3d می ساختن اون وقت ما هنوز تو win32 console سی پلاس پلاس گیر کردیم...

بر گردیم به بحثمون شاید نظرت عوض بشه اگر بدونی 90 ٪ بازی هایی که بازی می کنی از Need For Speed Underground گرفته تا Quake 4 و Counter-Strike و Prince of persia و... با ++C نوشته شدند

حتی می تونی سرس بازی معروفی مثل Quake 3 که زمانی معروف ترین بازی شبکه بود رو از اینترنت دانلود کنید و SDK بازی Half-life واسه استفاده از engine این بازی (که توسط Counter-Strike هم استفاده می شود) برای ساخت بازی های شبیه Team Fortress و Counter-strike دانلود کنید... 

شاید چیزی از DirectX و OpenGL ندونی ولی base هر دوشون با C نوشتن

حتما از 3d max و Maya استفاده کردی؟یا blender 3dخودمون که دست کمی از این دو تا ندارد هر سه تاشون با ++C نوشتن حتی سرس کد این اخری می تونین از سایتش دانلود کنید و یا سرس نرم افزار gmax که نمونه OpenSource برنامه 3d max است

GIMP و PhotoShop ام با ++C نوشتن (که سرس اولی ام می تونید از سایتش دانلود کنید) و plugin هاشون م با phyton و ++C می نویسند

من نمی دانم دیگه چی بگم ...

در مورد حرف اخر تون که گفتید کاری که پول توش نیست دنبالش نرو؟

؟همین افکار ایران یک کشور عقب مونده کرده که باید عین ... از محصولات کشور های دیگه استفاده کند

برم دنبال چه کاری؟ می دونم جوابت چیه چون این جواب داره حالم بهم می زنه برو دنبال برنامه نویسی database ؟ برنامه حسابداری بنویسم که با crystal report چند تا چیز مزخرف دیگه سرم گرم کنم؟

نمی دونم هر کی نظر خودشو داره

ولی من کار database ام کردم با Visual Basic وDAOوADO

استفاده از Access و SQL 2000 ولی کم کم داره حالم از VB بهم می خوره مگر اینکه بخوام به کسی اموزش بدم که اونوقت باید به خودم تلقین کنم که ازش خوشم میاد ۷۰ در صد VB کارهای این کره خاکی فقط کار database انجام می دهند به خاطر همین microsoft سعی کرد از این لحاظ VB رو برای کار database  اسان طراحی کند

به هر حال ایران نیازمند یک رهبر در زمینه IT که ایران را از این فلاکت در بیاره و من هم مثل شما منتظر این رهبر می شینم

به امید خدا ...

 

                     قسم به تک تک چشم های منتظر

                  ما می توانیم بهترین باشیم

                  همانطور که اجدادمان بودند

 

MyGame

می توانید سرس بازی!!! (هنوز هیچیش کامل نشده) را از اینجا دانلود کنید

این سرس حاوی

main.cpp
definations.h
functions.h
artro.ttf
dot.bmp
timer.h
object.h
main.dsw
main.dsp
است که در طول سه درس قبل توضیح دادم.

موفق باشید البته فکر نکنم حتی یک نفر از شما عزیزان داستان را قدم به قدم با من دنبال می کردید !!! ...

نمی دونم چی بگم .

۲۰ قدم برای تبحر در لینوکس

این مقاله از مجله ایران توکس گرفتم

برای حمایت از OpenSource  

-----

۱) دلیلی داشته باشید که چرا می‌خواهید لینوکس را یاد بگیرید؟ درباره منشاء و تاریخچه جامعه لینوکس مطالعه کنید. هرگاه بدانید که جامعه لینوکس از کجا آمده و چگونه به جایگاه کنونی خود دست یافته است، بهتر از زحماتی که قبل از شما کشیده شده است، قدردانی خواهید کرد.
۲) تعداد اموری را که مایل هستید در ماه اول قادر به انجام آن باشید را تعیین کنید. ترجیحا آنها را یادداشت کنید و پیشرفتتان را بررسی کنید. در حدی معقول جاه طلب باشید. اگر چیزی که قرار بود یکماهه یاد بگیرید، دو ماه طول کشید، اشکالی ندارد. یادگیری بهتر مطلبی در دوماه بر یادگیری سطحی طی یکماه ارجحیت دارد.
۳) یادداشت کنید، یادداشت کنید و بازهم یادداشت کنید. تمامی اموری را بر روی کامپیوترتان انجام می‌دهید را ثبت کنید. این یکی از وظایف مهم یک مدیر سیستم است. حتی اگر شما تنها کاربر یک کامپیوتر هستید، باز هم مدیر آن سیستم به شمار می‌روید. این یادداشت‌ها شما را در موقع رفع اشکالات سیستم یاری خواهد کرد و در صورتی که لازم باشد کاری را دوباره انجام دهید، انجام دادن آنرا برایتان آسان‌تر خواهد ساخت.
۴) موارد جالبی را که انتظار نداشتید یاد بگیرید، ولی یادگرفته‌اید را یادداشت کنید. سپس وقتی به حد خوبی رسید، آنرا با دیگران به اشتراک بگذارید. با اینکار به جامعه‌ای که به شما خدمت کرده است، خدمت خواهید کرد. حتی اگر در تمامی عمر خود حتی یک خط کد ننوشته‌اید و هرگز سعی نکرده‌اید تا این کار را انجام دهید، می‌توانید دانسته‌های خود را به اشتراک بگذارید، به این وسیله اثری مضاربه‌ای در زنجیره اشتراک دانسته‌ها خواهید داشت. حتی کوچکترین مستنداتی که شما آنرا نوشته‌اید، به دیگران در طی مسیری که شما آنرا پیموده‌اید، کمک خواهد کرد.
۵) سوالات خود را هوشمندانه بپرسید.
۶) در صورتی که امکان دارد، کامپیوتری را بطور جداگانه و دائمی به اجرای لینوکس اختصاص دهید. درصورتی که کامپیوتری dual boot داشته باشید، زیاد علافه‌مند نخواهید بود تا فضای راحت خود را رها نمایید.
۷) باور داشته باشید که در حال توسعه مهارت‌های خود و طبیعتا دارای وابستگی‌هایی به سیستم‌عاملی که قبل از لینوکس استفاده می‌کردید، هستید. هرگاه بتوانید این وابستگی‌ها را بشکنید، خواهید توانست هکر بادانش‌تر و یا حتی انسان بهتری باشید.
۸) باور داشته باشید که تمامی سیستم‌های عامل جایی به مشکل بر می‌خورند و در مورد برخی از آنها این مشکلات بیشتر است.
۹) همانند بند هشتم، فقط بخاطر اینکه شما نمی‌دانید چگونه کاری را انجام دهید، فکر نکنید که نمی‌توان این کار را انجام داد.
۱۰) لینوکس یعنی جامعه. در صورتی که اشکالی مشاهده می‌کنید که نیاز است برطرف شود، خوب دست به کار شوید. بله! شما. ممکن است فکر کنید که کسی قبل از شما به فکر انجام این کار افتاده باشد. موضوع این است که دو نفر ممکن است با شما موافق باشند و خواهید دید که نتیجه این مسئله چه خواهد شد. به نفع تمامی جامعه.
۱۱) هنگامی که تصمیم گرفتید این کار را انجام دهید، باور داشته باشید که بر شانه غول ایستاده‌اید. هنگام که شروع به کار کنید، تعجب خواهید کرد که چه تعداد کمک برای استفاده شما موجود است.
۱۲) سرگرمی را با یادگیری مخلوط کنید. اگر در سرتاسر یک سفر بخندید، از آن مسافرت دو چندان لذت خواهید برد.
۱۳) باور داشته باشید که هر چیز ارزشمندی به کار و فداکاری نیازمند است. توانایی در کنترل بیتهایی که در کامپیوتر شما جریان دارند، هزینه‌ای دارد که باید پرداخت کنید و هرگاه توانستید این توانایی را بدست آورید، خیلی بهتر خواهید بود.
۱۴) با سرعت پیشرفت فناوری در جهان، باور داشته باشید که هیچ مقصدی وجود ندارد. شما در سفری هستید که مسیر آن دائما تغییر می‌کند، باید از آن لذت ببرید.
۱۵) فناوری را برای دلیل فناوری دنبال نکنید. اگر این کار را بکنید، دلاوری و ابزارهای تکنیکی شما، معنایی برای شما و دیگران نخواهد داشت. با تفکر در مورد اینکه چگونه می‌توانید از فناوری برای رفع مشکلات اجتماعی دنیایی که در آن زندگی می‌کنید، استفاده کنید، بر فناوری چهره‌ای انسانی ببخشید. مهمتر از آن فاصله‌ای کافی از فناوری‌تان داشته باشید تا بتوانید درک کنید در برخی موارد مانند رذالت، فناوری بیش از آنچه راه حل باشد، خود یک مشکل است.
۱۶) باور داشته باشید که افرادی در سرتاسر جهان در حال کار هستند تا تجربه کامپیوتری شما را آسان‌تر سازند. این مسئله هر روز بهتر و بهتر می‌شود. زمان به سمت شماست.
۱۷) به عضویت یک گروه کاربری لینوکس در نزدیکی‌تان در آیید. در http://www.linux.org/groups می‌توانید به دنبال یکی از آنها بگردید. اگر اولین گروه برایتان خوشایند نبود، به دنبال گروه دیگری باشید. اگر در نزدیکی شما گروهی وجود ندارد، خودتان یکی درست کنید!
۱۸) از توسعه دهندگان نرم‌افزارهای آزاد پشتیبانی کنید. آنها خانواده‌ای دارند که باید به آنها رسیدگی کنند و همانند شما آرزوهایی. آنها روی هوا زندگی نمی‌کنند.
۱۹) آهسته، ولی پیوسته حرکت کنید. شاید دو سال طول بکشد تا به جایی که باید، برسید، ولی اگر الان شروع نکنید، هیچگاه به آنجا نخواهید رسید.
۲۰) چون صخره‌ای استوار باشید.

درس 11 : ساخت دو تابع tanzimFPSو ShowFPS

درس 11 : ساخت دو تابع tanzimFPS و ShowFPS

 

ممکن یک بازی بر روی یک کامپیوتر با سرعت 40  فرم در ثانیه(FPS) اجرا شود و روی کامپیوتری دیگر 260فرم بر ثانیه به خاطر پردازنده حافظه گرافیکی و غیره . مثلا اگر دو کامپیوتر رو شبکه  با هم خیلی فرق داشته باشند دچار مشکل می شوید حتی مثال های غیر شبکه . شما در این درس یاد می گیرید FPS بازی خود را خود تعیین کنید

//tedaad e frame haa dar yek saanie

const int FRAMES_PER_SECOND = 20;

timer fps;

این را ما در فایل definations.h می نویسیم که نشانگر مقدار فرمی است که باید در یک ثانیه نشان داده شود و fps هم یک نمونه از کلاس timer هست چون ما  برای تنظیم FPS نیازمند به یک ساعت ثانیه شمار هستیم.

حال میرویم به سراق تعریف تابع tanzimFPS :

void tanzimFPS(int p1,int p2 = FRAMES_PER_SECOND )

{

            if(p1==1)

            {

             //tanzim e frame rate

     while( fps.get_time() < 1000 / p2 )

     {

          //Allaf...  

             }

            }

            else

            ;//Do Nothing

}

این تابع دو متغییر می گیرد و اگر دومی را ندادیم مقدار پیش فرض را می فرستد پارامتر اول تعیین می کند که این تابع فعال باشد یا نه پارامتر دوم هم مقدار FPS را تعیین می کند همه کار این تابع را شرط حلقه while انجام می دهد البته قبلا باید در تابع main ,  fps.start() را نوشته باشیم این حلقه هر مقدار میلی ثانیه که ما بخواهیم تاخیر می اندازد مثلا اگر بخواهیم 20 فرم در ثانیه اجرا شود یعنی هر فرم 1000 تقسیم بر 20 که می شود 50 میلی ثانیه باید تاخیر بیاندازد .این را در فایل functions.h قرار می دهیم.

 

خوب حالا نوبت تابع ShowFPS است :

معمولا این تابع را برای این در بازی ها می گذارند که کاربر با مثلا انتخاب گزینه ای از منو Options بتواند FPS بازی را بر روی کامپیوتر خود ببیند برای اینکه قدرت سخت افزاری کامپیوتر خود را با بقیه بسنجد.

//baraaie mohaasebeie FPS

int frame = 0;

timer update ;

TTF_Font *fpsFont;

SDL_Color textColor = { 0, 0, 0 };

SDL_Surface *fpsSurface = NULL;

این ها را در فایل definations.h می نویسیم frame مقدار فرم ها را در خود نگه می دارد update هم در شمارش به ما کمک می کند fpsFont و fpsSurface هم برای نمایش بر روی صفحه استفاده می شوند textColor هم رنگ سیاه است.

void ShowFPS()

{

         frame++;

        //If a second has passed since the caption was last updated

        if( update.get_time() > 1000 )

        {

            //A temp string

            char charFPS[ 64 ];

           

            //Calculate the frames per second and create the string

            sprintf( charFPS, "%i", frame  );

           

            //Reset the caption

           

   fpsSurface = TTF_RenderText_Blended( fpsFont, charFPS, textColor );

                                   

            //Restart the update timer

            update.start();    frame = 0;

          }

                        apply_surface( 20, 20, fpsSurface, screen );

}

فرم در هر اجرا زیاد می شود درون if بعد از گذشت هر 1 ثانیه اعمالی انجام می دهد در اصل ما می خواهیم بدانیم در هر ثانیه چند فرم اجرا می شود پس در اخر if ما update را reset می کنیم و frame را هم 0 می کنیم در این بین هم ما کار تبدیل frame از integer به char را انجام می دهیم به خاطر این که تابع TTF_RenderText_Blended فقط رشته قبول می کند. سر اخر هم کار چسباندن به screen انجام می شود.