یک وبلاگ خوب در زمینه OpenGL که توسط اقا ساسان مدیریت می شود
از این به بعد این وبلاگ به عنوان برادر وبلاگ من معرفی می شود
به امید موفقیت ایران . . .
از اقا ساسان هم متشکریم
می خوام یک بازی استراتژی متن باز بنویسم این وبلاگم راهنمای خوبی واسه توسعه دهنده اش می شه
ولی فعلا به علت فقدان نظرات شما وبلاگ تعطیل ...
درس 8 : مدیریت کردن صفحه کلید
شما قبلا با رویداد SDL_QUIT کار کردید در این درس یاد می گیرید که آیا کلیدی فشرده شده است یا خیر و اگر فشرده شده چه کلیدی فشرده شده است
//Generate the message surfaces
up = TTF_RenderText_Solid( font, "Up was pressed.", textColor );
down = TTF_RenderText_Solid( font, "Down was pressed.", textColor );
left = TTF_RenderText_Solid( font, "Left was pressed", textColor );
right = TTF_RenderText_Solid( font, "Right wa pressed", textColor );
بعد از اماده کردن همه ملزومات ما 4 سطح را تعریف می کنیم که حاوی 4 پیغام ما به کار بر است
البته یادتون باشد یک برنامه نویس حرفه ای باید همیشه چک کند که این UPو DOWN و... اینها همه درست ایجاد شده باشند با یک if و چک کردن NULL نبودن سطوح ولی اینجا من اینکار را نکردم
;)
//If there's an event to handle
if( SDL_PollEvent( &event ) )
{
//If a key was pressed
if( event.type == SDL_KEYDOWN )
{
حال اگر بخواهیم بفهمیم کلیدی فشرده شده است از SDL_KEYDOWN استفاده می کنیم
//Set the proper text
switch( event.key.keysym.sym )
{
case SDLK_UP: message = up; break;
case SDLK_DOWN: message = down; break;
case SDLK_LEFT: message = left; break;
case SDLK_RIGHT: message = right; break;
}
}
//If the user has Xed out the window
else if( event.type == SDL_QUIT )
{
//Quit the program
quit = true;
}
}
حال باید بفهمیم که چه کلیدی فشار داده شده است SDL_PollEvent اطلاعات را از نوع ساختار SDL_KeyboardEvent به نام key درون event قرار می دهیم و درون keyساختار دیگری به نام keysym وجود دارد و درون keysym ساختار دیگری قرار دارد به نام key قرار دارد که در ان یک SDL_Key قرار دارد (فراموش نکنید که event یک union است)
مثال : اگر دکمه بالا را فشار دهیم SDLK_UP را بر می گرداند
//If a message needs to be displayed
if( message != NULL )
{
//Apply the images to the screen
apply_surface( 0, 0, background, screen );
apply_surface( ( SCREEN_WIDTH - message->w ) / 2, ( SCREEN_HEIGHT - message->h ) / 2, message, screen );
//Null the surface pointer
message = NULL;
}
//Update the screen
if( SDL_Flip( screen ) == -1 )
{
return 1;
}
SDL_FillRect( screen, &screen->clip_rect, SDL_MapRGB( screen->format, 0, 0, 0 ) );
سر اخر پیغام را در وسط صفحه ست می کند و جمله اخر برای سیاه کردن صفحه است
بحث تکمیلی :
ساختار SDL_KeyboardEvent مطابق شکل روبرو است
typedef struct{
Uint8 type;
Uint8 state;
SDL_keysym keysym;
} SDL_KeyboardEvent;
type – می تواند SDL_KEYDOWNیا SDL_KEYUP باشد
state- می تواند SDL_PRESSED یا SDL_RELEASED باشد
keysym – ساختار ی که محتوی اطلاعات کلید فشرده شده است
در صورتی که تکرار فعال باشد SDL_KEYDOWN باSDL_PRESSED فرقی ندارد
int SDL_EnableKeyRepeat(int delay, int interval);
در صورت صفر کردن delay غیر فعال می شود
ساختار SDL_kesym :
typedef struct{
Uint8 scancode;
SDLKey sym;
SDLMod mod;
Uint16 unicode;
} SDL_keysym;
sym : کلیدی که فشرده شده است
mod : کلید ALT-Control-shift را چک می کند
typedef enum {
KMOD_NONE = 0x0000,
KMOD_LSHIFT= 0x0001,
KMOD_RSHIFT= 0x0002,
KMOD_LCTRL = 0x0040,
KMOD_RCTRL = 0x0080,
KMOD_LALT = 0x0100,
KMOD_RALT = 0x0200,
KMOD_LMETA = 0x0400,
KMOD_RMETA = 0x0800,
KMOD_NUM = 0x1000,
KMOD_CAPS = 0x2000,
KMOD_MODE = 0x4000,
} SDLMod;
واسه وبلاگرها : از Internet Explorer برای update استفاده کنید چون بلاگ اسکای فقط IE را کامل ساپورت می کنه
واسه بینندها! : ! JUST FIREFOX بخاطر این که صفحه ها سنگینند و FireFox ذره ذره لود می کنه
فقط همین...!
درس 7 :True Type Font (TTF)
SDL_ttf یک کتاب خانه الحاقی است که به وسیله ان می توانیم سطوحی از فونتهای TTF بسازیم
شما می توانید SDL_ttf را از اینجا دانلود کنید here
طبق درس 3 شما می توانید SDL_ttf را نصب کنید
//The surfaces
SDL_Surface *background = NULL;
SDL_Surface *message = NULL;
SDL_Surface *screen = NULL;
//The event structure
SDL_Event event;
//The font that's going to be used
TTF_Font *font;
//The color of the font
SDL_Color textColor = { 255, 255, 255 };
در اینجا ما متغییر ها را تعریف می کنیم backgroung . screen والبته message که مسئول نگهداری متن ما است
در اینجا دو نوع ساختار جدید می بینید SDL_Color که ساختاری برای نگهداری رنگ است و TTF_Font فونت است که ما می خواهیم استفاده کنیم
bool init()
{
//Initialize all SDL subsystems
if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 )
{
return false;
}
//Set up the screen
screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE );
//If there was in error in setting up the screen
if( screen == NULL )
{
return false;
}
//Initialize SDL_ttf
if( TTF_Init() == -1 )
{
return false;
}
//Set the window caption
SDL_WM_SetCaption( "TTF Test", NULL );
//If everything initialized fine
return true;
}
این تابع هم خیلی شبیه تابع قبلی است با فرق این که TTF_Init در آن کار اماده کردن محیط TTF را بر عهده دارد قبل از کار کردن با هر تابع TTF باید این دستور نوشته شود
bool load_files()
{
//Load the background image
background = load_image( "background.png" );
//Open the font
font = TTF_OpenFont( "artro.ttf", 28 );
//If there was a problem in loading the background
if( background == NULL )
{
return false;
}
//If there was an error in loading the font
if( font == NULL )
{
return false;
}
//If everything loaded fine
return true;
}
این تابع بارگزاری فایل هاست قبل از استفاده از هر TTF باید بوسیله TTF_OpenFont اماده شود
اولین پارامتر مسیر و اسم فونت است دومین پارامتر سایز نوشته است در صورت بروز خطا مقدار NULL را بر می گرداند
//Render the text
message = TTF_RenderText_Solid( font, "The quick brown fox jumps over the lazy hound", textColor );
//If there was an error in rendering the text
if( message == NULL )
{
return 1;
}
//Apply the images to the screen
apply_surface( 0, 0, background, screen );
apply_surface( 0, 200, message, screen );
//Update the screen
if( SDL_Flip( screen ) == -1 )
{
return 1;
}
سریعترین را برای نمایش فونت استفاده از تابع TTF_RenderText_Solid است که بی کیفیت ترین هم هست 3 پارامتر می گیرد فونت . متن و رنگ راههای دیگر هم هست که در Document TTF موجود است
void clean_up()
{
//Free the surfaces
SDL_FreeSurface( background );
SDL_FreeSurface( message );
//Close the font that was used
TTF_CloseFont( font );
//Quit SDL_ttf
TTF_Quit();
//Quit SDL
SDL_Quit();
}
این تابع هم کار تمیز کردن حافظه را انجام می دهد
مباحث تکمیلی :
تابع دیگری به نام
SDL_Surface *TTF_RenderText_Blended(TTF_Font *
font, const char *
text, SDL_Color
fg)
که کیفیت فوق العاده ای دارد
تابع دیگری به نام :
SDL_Surface *TTF_RenderText_Shaded(TTF_Font *
font, const char *
text, SDL_Color
fg, SDL_Color
bg)
که 4 پارامتر می گیرد که یکی هم رنگ پس زمینه است و یک کادر دور ان می کشد
تابع دیگری به نام
void TTF_SetFontStyle(TTF_Font *
font, int
style)
که کار زیر خط دار کردن و توپر کردن و زیر خط دار کردن فونت را تعیین می کند
TTF_STYLE_BOLD
TTF_STYLE_ITALIC
TTF_STYLE_UNDERLINE
Example :
TTF_SetFontStyle(font, TTF_STYLE_BOLD|TTF_STYLE_ITALIC);