Tweet

SDL de keyboard event (olayları)

Bu bölümde SDL de klavye - key olaylarının nasıl kullanıldığını kısaca göreceğiz.
Şu ana kadar SDL de olay kavramını görmüş olduk ve mouse olayları da dahil olmak üzeri bir SDL_Event olayının nasıl kullanılabildiği konusunda konuştuk.
Klavye olayları da aynı şekilde SDL_Event nesnesi üzerinden okunur;yani SDL_PollEvent metodu kullanılarak sistemdeki olaylar bu nesneye aktarılır.Ve bizde
istediğimiz türde ise yani klavye olayı ise gerektiği şekilde işleriz.[...]

Klavye olaylarını işlerken iki teknik kullanılabilir.Bunlardan ilki switch mantığına göre olayı bir seçme yapısı içinde kullanmaktır.İkincisi ise olayın state bilgisini kullanarak yani
SDL_GetKeyState(NULL) metodu vasıtasıyla bulmak istediğiniz key bilgisinin değerine bakabilirsiniz.[Not:SDL_GetModState(), SDL_GetMouseState(), SDL_JoystickGetAxis() gibi metodlar da
mevcuttur.]

Aşağıda bu iki tür için ayrı ayrı örnekler verilmiştir.

Kaynak Kod:

CODE:
#include <SDL.h>
#include <SDL_image.h>
#include <SDL_ttf.h>
#include <string>

using namespace std;


typedef SDL_Surface * surfaceptr;

//Klavye tuşlarına göre kullanılacak yüzeyler oluşturuldu.

surfaceptr screen = NULL;
surfaceptr background = NULL;
surfaceptr up_screen = NULL;
surfaceptr down_screen = NULL;
surfaceptr right_screen = NULL;
surfaceptr left_screen = NULL;
surfaceptr message = NULL;
surfaceptr nothing = NULL;

SDL_Color color = {0,130,0};

TTF_Font * font = NULL;

SDL_Event _event;

#define width 640
#define height 480
#define bpp 32


bool init()
{
if(SDL_Init(SDL_INIT_EVERYTHING) == -1)
return false;

if(TTF_Init() == -1)
return false;

screen = SDL_SetVideoMode(width,height,bpp,SDL_SWSURFACE);

if(screen == NULL)
return false;

return true;
}

surfaceptr loadImage(string filename)
{
surfaceptr loaded = NULL;
surfaceptr optimized = NULL;

loaded = IMG_Load(filename.c_str());

if(loaded != NULL)
{
optimized = SDL_DisplayFormat(loaded);
SDL_FreeSurface(loaded);

if(optimized != NULL)
{
SDL_SetColorKey(optimized,SDL_SRCCOLORKEY,SDL_MapRGB(optimized->format,0,0xFF,0xFF));
}
}

return optimized;
}

bool load_files()
{
background = loadImage("background.png");

if(background == NULL)
return false;

font = TTF_OpenFont("lazy.ttf",40);

if(font == NULL)
return false;

return true;
}


void apply_surface(int x,int y,surfaceptr src,surfaceptr dest)
{
SDL_Rect rect;
rect.x = x;
rect.y = y;

SDL_BlitSurface(src,NULL,dest,&rect);
}


void clean()
{
SDL_FreeSurface(background);
SDL_FreeSurface(up_screen);
SDL_FreeSurface(down_screen);
SDL_FreeSurface(left_screen);
SDL_FreeSurface(right_screen);

TTF_CloseFont(font);

TTF_Quit();

SDL_Quit();
}


int main(int argc, char *argv[])
{
if(init() == false)
return 1;

if(load_files() == false)
return 1;

//Her bir tuş için gereken yazılar uygun font ve renkte oluşturuldu.

up_screen = TTF_RenderText_Solid(font,"UPPPPP",color);
down_screen = TTF_RenderText_Solid(font,"DOWNNNN",color);
left_screen = TTF_RenderText_Solid(font,"LEFTTTT",color);
right_screen = TTF_RenderText_Solid(font,"RIGHTTTT",color);
nothing = TTF_RenderText_Solid(font,"NOTHINGGGGGG",color);


bool quit = false;

while(quit == false)
{
while(SDL_PollEvent(&_event))
{
if(_event.type == SDL_KEYDOWN)
{
//Burda _event.key.keysym.sym bilgisi üzerinden hangi tuş basıldıysa onun bilgisine ulaştık ve gereken işlemi gerçekleştireceğiz.
switch(_event.key.keysym.sym)
{
case SDLK_UP:message = up_screen;break;
case SDLK_DOWN:message = down_screen;break;
case SDLK_RIGHT:message = right_screen;break;
case SDLK_LEFT:message = left_screen;break;
default:message = nothing;break;
}
}
else if(_event.type == SDL_QUIT)
{
quit = true;
}
}

//Önce arka plan bilgisi yüzeye yazıldı.
//Sonra yazılacak yazımız yüzeyin ortasına gelecek şekilde ekrana etiketlendi :)))
if(message != NULL)
{
apply_surface( 0, 0, background, screen );
apply_surface((width - message->w)/2,(height-message->h)/2,message,screen);

message = NULL;
}

if(SDL_Flip(screen) == -1)
return 1;
}


clean();

return 0;
}


Kaynak Kod:

CODE:
#include <SDL.h>
#include <SDL_image.h>
#include <SDL_ttf.h>
#include <string>

const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
const int SCREEN_BPP = 32;

SDL_Surface *background = NULL;
SDL_Surface *up = NULL;
SDL_Surface *down = NULL;
SDL_Surface *left = NULL;
SDL_Surface *right = NULL;
SDL_Surface *screen = NULL;

SDL_Event event;

TTF_Font *font = NULL;

SDL_Color textColor = { 0, 0, 0 };

SDL_Surface *load_image( std::string filename )
{
SDL_Surface* loadedImage = NULL;

SDL_Surface* optimizedImage = NULL;

loadedImage = IMG_Load( filename.c_str() );

if( loadedImage != NULL )
{
optimizedImage = SDL_DisplayFormat( loadedImage );

SDL_FreeSurface( loadedImage );

if( optimizedImage != NULL )
{
SDL_SetColorKey( optimizedImage, SDL_SRCCOLORKEY, SDL_MapRGB( optimizedImage->format, 0, 0xFF, 0xFF ) );
}
}

return optimizedImage;
}

void apply_surface( int x, int y, SDL_Surface* source, SDL_Surface* destination, SDL_Rect* clip = NULL )
{
SDL_Rect offset;

offset.x = x;
offset.y = y;

SDL_BlitSurface( source, clip, destination, &offset );
}

bool init()
{
if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 )
{
return false;
}

screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE );

if( screen == NULL )
{
return false;
}

if( TTF_Init() == -1 )
{
return false;
}

SDL_WM_SetCaption( "Press an Arrow Key", NULL );

return true;
}

bool load_files()
{
background = load_image( "background.png" );

font = TTF_OpenFont( "lazy.ttf", 72 );

if( background == NULL )
{
return false;
}

if( font == NULL )
{
return false;
}

return true;
}

void clean_up()
{
SDL_FreeSurface( background );
SDL_FreeSurface( up );
SDL_FreeSurface( down );
SDL_FreeSurface( left );
SDL_FreeSurface( right );

TTF_CloseFont( font );

TTF_Quit();

//Quit SDL
SDL_Quit();
}

int main( int argc, char* args[] )
{

bool quit = false;


if( init() == false )
{
return 1;
}

if( load_files() == false )
{
return 1;
}

up = TTF_RenderText_Solid( font, "Up", textColor );
down = TTF_RenderText_Solid( font, "Down", textColor );
left = TTF_RenderText_Solid( font, "Left", textColor );
right = TTF_RenderText_Solid( font, "Right", textColor );

while( quit == false )
{
while( SDL_PollEvent( &event ) )
{
if( event.type == SDL_QUIT )
{
quit = true;
}
}

apply_surface( 0, 0, background, screen );


Uint8 *keystates = SDL_GetKeyState( NULL );

if( keystates[ SDLK_UP ] )
{
apply_surface( ( SCREEN_WIDTH - up->w ) / 2, ( SCREEN_HEIGHT / 2 - up->h ) / 2, up, screen );
}

if( keystates[ SDLK_DOWN ] )
{
apply_surface( ( SCREEN_WIDTH - down->w ) / 2, ( SCREEN_HEIGHT / 2 - down->h ) / 2 + ( SCREEN_HEIGHT / 2 ), down, screen );
}

if( keystates[ SDLK_LEFT ] )
{
apply_surface( ( SCREEN_WIDTH / 2 - left->w ) / 2, ( SCREEN_HEIGHT - left->h ) / 2, left, screen );
}

if( keystates[ SDLK_RIGHT ] )
{
apply_surface( ( SCREEN_WIDTH / 2 - right->w ) / 2 + ( SCREEN_WIDTH / 2 ), ( SCREEN_HEIGHT - right->h ) / 2, right, screen );
}

if( SDL_Flip( screen ) == -1 )
{
return 1;
}
}

clean_up();

return 0;
}






hgedek
hgedek@gmail.com
8 Eylul 2007 16:25

İlgili Olabilecek Makaleler


Yorumlar (0)




Ziyaretçi olarak yorum yazamazsınız. Üye olmak için tıklayın Üye iseniz giriş yapın.



MENÜ » FORUM
Menü » Takip et
RSS Facebook Twitter Friendfeed
Sık Kullanılanlar Google Yahoo Live
Menü » Paylaş
E-Posta ile gönder Twitter Facebook Friendfeed
Buzz Stumbleupon Delicious Digg