Anasayfa » C++ » SDL'de colorkey

SDL'de colorkey

7 Nisan 2010  |  Yazar: coders  |  Yorum Yok  |  5 kez okundu
Facebook'da Paylaş Twitter'da Paylas FriendFeed'de Paylaş SDL'de colorkey

Bu bölümde de colorkey konusu açıklanacaktır.

ColorKey işlemi iki resmin birleştirilmesi yani bir yüzey üzerine başka bir resmin yapıştırılması sırasında bu işlemi kolaylaştırmak ve de yapıştırılan resmin arka plan renginin gösterilmesini engelleyerek
yapıştırma işlemini gerçeklemek için kullanılabilir.Bu işlemi bir yüzeyin arka plan rengini transparent yapmak için kullanabilirsiniz.Örneğin arka planı mavi olan bir resim için mavi bir color key oluşturmak.

Colorkey için kullanılacak metodlar SDL_MapRGB ve SDL_SetColorKey dir.SDL_MapRGB ile belli bir formatta ve renkte pixel oluşturursunuz.Ve bu pixeli kullanarak SDL_SetColorKey metodunda bir image için
kullanırsınız.

Uint32 colorkey = SDL_MapRGB( image->format, 0, 0xFF, 0xFF );
SDL_SetColorKey( image, SDL_SRCCOLORKEY, colorkey );

SDL de pixel:

SDL de pixel 32 bit bir int değerdir.Uint32 ile gösterilir.Her bir renk değeri yani red,green ve blue 8 bit veri ile gösterilir.Diğer 8 bit de alpha değeridir.Transparency için kullanılır.
Pixellerin renk değerleri bu 32 bit üzerinden oluşturulur.

Aşağıdaki kodda görüleceği üzere oluşturulan her image için colorkey uygulanmaktadır.

#include

#include

#include

using namespace std;

#define SCREEN_WIDTH 640

#define SCREEN_HEIGH 480

#define BPP 32

typedef SDL_Surface * surfacePtr;

surfacePtr background = NULL;

surfacePtr screen = NULL;

surfacePtr foo = NULL;

SDL_Event _event;

surfacePtr loadImage(string filename)

{

surfacePtr loadimage = NULL;

surfacePtr optimimage = NULL;

loadimage = IMG_Load(filename.c_str());

if(loadimage != NULL)

{

optimimage = SDL_DisplayFormat(loadimage);

SDL_FreeSurface(loadimage);

if(optimimage != NULL)

{

Uint32 colorkey = SDL_MapRGB(optimimage->format,0,0xFF,0xFF);

SDL_SetColorKey(optimimage,SDL_SRCCOLORKEY,colorkey);

}

}

return optimimage;

}

void apply_surface(int x,int y ,surfacePtr src,surfacePtr dest)

{

SDL_Rect offset;

offset.x = x;

offset.y = y;

SDL_BlitSurface(src,NULL,dest,&offset);

}

bool init()

{

if(SDL_Init(SDL_INIT_EVERYTHING) == -1)

return false;

screen = SDL_SetVideoMode(SCREEN_WIDTH,SCREEN_HEIGH,BPP,SDL_SWSURFACE);

if(screen == NULL)

return false;

SDL_WM_SetCaption(“Pencere”,NULL);

return true;

}

bool loadfiles()

{

background = loadImage(“background.png”);

if(background == NULL)

return false;

foo = loadImage(“foo.png”);

if(foo == NULL)

return false;

return true;

}

void cleanup()

{

SDL_FreeSurface(background);

SDL_FreeSurface(foo);

SDL_Quit();

}

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

{

bool quit = false;

if(init() == false)

return 1;

if(loadfiles() == false)

return 1;

apply_surface(0,0,background,screen);

apply_surface(230,169,foo,screen);

if(SDL_Flip(screen) == -1)

return 1;

while(!quit)

{

while(SDL_PollEvent(&_event))

{

if(_event.type == SDL_QUIT)

quit = true;

}

}

cleanup();

return 0;

}

hakan gedek

Facebok'ta Paylaş

Benzer Yazılar

Etiketler: , , , , , , , , , , , , ,
avatar

Ahmet Ates

http://www.coders.gen.tr/ 25 yasindayim. Z.K.U Biyomedikal Cihaz Teknolojisi bölümünü okudum, Programlama dilleri arasindan ilgilendiğim ve profesyonel olarak hizmet verdiğim dil Fortran'dir. Web olarak Php,Css ve hazır sistemler olarak Wordpress ve Vbulletine hayranlık besliyorum.

Bu yazı hakkında birşeyler demek ister misiniz?

RSS üzerinden bu yazıya yapılan yorumları takip edin.

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir.

Şu HTML etiketlerini ve özelliklerini kullanabilirsiniz:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>


Programlama