Tweet

SDL kütüphanesi ile sprite kullanımı

Bu bölümde bir resim dosyasının parçalanması ve her bir parçasının ayrı ayrı kullanılabilmesi işlenecektir.
Bir çok resim dosyası ile ayrı ayrı uğraşmak yerine , oluşturulan bir resim dosyasının parçalanması (yani belli kısımlarının alınması) ve her bir parçasının yeni bir resim dosyası gibi kullanılabilmesi
münkündür.Bunu gerçekleştirmek için bir resim dosyasının alınmak istenen pixel değerleri belirlenmeli (w,h olarak ) ve bunun uygulanacağı yüzeyinde belirlenmesi ardından yapıştırma işleminin gerçeklenmesi[...]
gerekir.Bu bölüme kadar kullanılan örneklerde SDL_BlitSurface fonksiyonlarında ikinci parametre NULL olarak kullanılmaktdaydı.Bu parametre source yüzey için clip (w,h aralığı ) verilerini tutar.Yani
source surface in hangi kısmı alınacaksa o kısmı gösteren bir SDL_Rect * bilgisidir.

Örnek tede görüldüğü gibi oluşturulan ekrana(screen) yapıştırılacak source dosyamız için SDL_Rect[4] dizisi belirlenmiştir.Her bir alan için belirlenen x,y,w ve h değerleri belirlendikten sonra
apply_surface de bu kısımların screen için girilen x,y noktalarından itibaren uygulanması sağlanmıştır.Böylece bir source file ın belli bir kısmı bir yüzeyin belli bir kısmına yapıştırılmış olur.

[SDL_FillRect: bu fonksiyon ile yüzey alanımız belli bir renkle oluşturuluyor.]

Kaynak Kod:

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

using namespace std;

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

typedef SDL_Surface * SurfacePtr;

SurfacePtr dots = NULL;
SurfacePtr screen = NULL;


SDL_Event _event;

SDL_Rect clip[4];

SurfacePtr imageLoad(string filename)
{
SurfacePtr old = NULL;
SurfacePtr newSurface = NULL;

old = IMG_Load(filename.c_str());

if(old == NULL)
return newSurface;

newSurface = SDL_DisplayFormat(old);
SDL_FreeSurface(old);

if(newSurface != NULL)
{
Uint32 key = SDL_MapRGB(newSurface->format,0,0xFF,0xFF);

SDL_SetColorKey(newSurface,SDL_SRCCOLORKEY,key);
}

return newSurface;
}

void apply_surface(int x,int y,SurfacePtr src,SurfacePtr dest,SDL_Rect* clip = NULL)
{
SDL_Rect offset;
offset.x = x;
offset.y = y;

SDL_BlitSurface(src,clip,dest,&offset);
}

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

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

if(screen == NULL)
return false;

SDL_WM_SetCaption("Pencere",NULL);

return true;
}

bool loadfiles()
{
dots = imageLoad("dots.png");

if(dots == NULL)
return false;

return true;
}

void clean()
{
SDL_FreeSurface(dots);

SDL_Quit();
}

int main(int argc, char *argv[])
{
bool quit = false;

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

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

clip[0].x = 0;
clip[0].y = 0;
clip[0].w = 100;
clip[0].h = 100;


clip[1].x = 100;
clip[1].y = 0;
clip[1].w = 100;
clip[1].h = 100;

clip[2].x = 0;
clip[2].y = 100;
clip[2].w = 100;
clip[2].h = 100;

clip[3].x = 100;
clip[3].y = 100;
clip[3].w = 100;
clip[3].h = 100;

SDL_FillRect(screen,&screen->clip_rect,SDL_MapRGB(screen->format,0xFF,0xFF,0));

apply_surface(0,0,dots,screen,&clip[0]);
apply_surface(540,0,dots,screen,&clip[1]);
apply_surface(0,380,dots,screen,&clip[2]);
apply_surface(540,380,dots,screen,&clip[3]);

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

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

clean();

return 0;
}


hgedek
hgedek@gmail.com
29 Agustos 2007 20:22

İlgili Olabilecek Makaleler


Yorumlar (2)





Oguzz
29 Aralik 2008 19:07
Sıralayarak eklemeniz çok güzel olmuş.Teşekkürler.


Dia
7 Subat 2009 23:18
Hakan kardeş çalışmaların çok başarılı teşekkür ediyorum.
Bence bölümün başlığıda yer almalı bölüm 5 ama bu neyle ilgili olduğu başlıkta yazmalı bana bölümlerin başlıklarının özel mesaj ile atarsan ben düzeltirim.

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