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