یک وبلاگ خوب در زمینه OpenGL :

یک وبلاگ خوب در زمینه  OpenGL که توسط اقا ساسان مدیریت می شود

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

   به امید موفقیت ایران . . .

 

از اقا ساسان هم متشکریم

ساخت یک بازی استراتژی OpenSource

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

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

مرجع کلیدها :

http://opengl.8k.com/refer.txt

نظرات خود را در مورد بهبود Weblog بگویید

درس 8 : مدیریت کردن صفحه کلید

 

فایلها استفاده شده :

font

source

درس 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)

درس 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);