Tweet

SDL ile image yükleme ve gösterme

Bu bölümde sdl de image yükleme ve gösterme konularından bahsedeceğiz.
SDL normalde bmp resim formatını desteklemektedir. (öğrendiğim kadarıyla) Ancak farklı formatları da desteklemesi için SDL_image.lib yüklenebilir. Böylece png gibi formatlar da desteklenir.(ilerde bahsedeceğiz.)[...]
Yüklenen image verilerini tutmak için SDL_Surface struct yapısı kullanılabilir.Bmp formatındaki verileri yüklemek için

--SDL_LoadBMP(dosyaismi)--

fonksiyonu kullanılcaktır.Bu fonksiyona parametre olarak .bmp dosya ismi verilir.[Not:Çalışma dizininde değilse adres yolu ile veriniz...]

CODE:

SDL_Surface * screen = SDL_LoadBMP(filename);



şeklinde bir .bmp verisini kolaylıkla yükleyebilirsiniz.Yüklediğiniz veriniz 24 bit olacaktır.Ancak ekran bilginiz 32 bittir.Bu nedenle bu screen verisi formatında ekran formatına uygun bir ayar yapmak gerekir.

CODE:

SDL_Surface * newScreen = SDL_DisplayFormat(screen) ;

SDL_FreeSurface(screen);



ile kullanılabilir bir format elde etmiş olursunuz.Peki bu format değişimi yapmazsak : SDL bu konuda bir çevrim işlemi yapıyormuş.Ancak bu işlem zaman ve kaynak harcayan bir süreç olduğu için biz en iyisi ona bırakmamalıymışız. Ayrıca SDL_FreeSurface fonksiyonu ile eski screen verisini temizlemiş olduk.

Şimdi elimizde bir yüzeye yapıştırılacak etiketimiz yani yüzeyimiz oldu.Bundan sonrası bir yüzek almak ve üzerine bunu yapıştırmaktır.

CODE:
SDL_Rect offset;

offset.x = x;

offset.y = y;

SDL_BlitSurface( source, NULL, destination, &offset )


Öncelikle bir SDL_Rect (dörtgen) nesnesi oluşturulur.Bunun offset olarak başlangıç x,y lerini veriniz.Ekranda nerden başlanarak yapıştırma yapılacağına dair.(ben böyle anladım :) ) Sonra blitsurface yani yapıştır.
İşte bu kadar.Ancak henüz asıl penceremizi oluşturmadık.
CODE:

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

SDL_WM_SetCaption( "Hello World", NULL );

pencemizi oluşturalim.SetCaption ile de güzel bir başlık verelim.Penceremiz oluşturulduktan ve ayarlandıktan sonra onu update etmeliyiz ki değişikliği görebilelim.İşte flip fonksiyonumuz ve screen imiz.
CODE:

SDL_Flip( screen );

Kaynak kod:
CODE:
#include <SDL.h>
#include <string>

using namespace std;

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

SDL_Surface *message = NULL;
SDL_Surface *background = NULL;
SDL_Surface *screen = NULL;

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

loadedImage = SDL_LoadBMP( filename.c_str() );

if( loadedImage != NULL )
{

optimizedImage = SDL_DisplayFormat( loadedImage );
SDL_FreeSurface( loadedImage );
}
return optimizedImage;
}

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

offset.y = y;

SDL_BlitSurface( source, NULL, destination, &offset );

}

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

{

if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 )

{

return 1;

}

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

{

return 1;

}

SDL_WM_SetCaption( "Hello World", NULL );

message = load_image( "hello_world.bmp" );

background = load_image( "background.bmp" );

apply_surface( 0, 0, background, screen );

apply_surface( 180, 140, message, screen );

if( SDL_Flip( screen ) == -1 )

{
return 1;
}

SDL_Delay(2000 );
SDL_FreeSurface( message );
SDL_FreeSurface( background );

SDL_Quit();



return 0;

}


hgedek
hgedek@gmail.com
14 Agustos 2007 17:13

İlgili Olabilecek Makaleler


Yorumlar (0)




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


Advertisement


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