SDL-Ekrana Resim Basmak

Artık bir penceremiz olduğuna göre sırada ona bir resim koymakta.

Not: Bu dersten itibaren sadece önemli noktaların kodlarını işleyeceğiz.


//Starts up SDL and creates window
bool init();

//Loads media
bool loadMedia();

//Frees media and shuts down SDL
void close();

İlk dersimizde tüm kodları main fonksiyonumuzun içine yazmıştık. Küçük bir program için sorun oluşturmadı fakat bildiğiniz üzere bu yanlış bir yaklaşım. Programımızı olabildiğince modüler yazıyoruz ki debug ve reuse(yeniden kullanım) daha kolay yapabilelim.

initialization, loadingmedia ve close için ayrı fonksiyonlar yazdık. Fonksiyon deklarasyonlarını yukarıda yaptık sonra içlerini dolduracağız.

C dilinde overload olmadığı için close diye bir fonksiyon oluşturmak sorun yaratacaktır. C++ da böyle bir sıkıntımız bulunmamakta.

//The window we'll be rendering to
SDL_Window* gWindow = NULL;
    
//The surface contained by the window
SDL_Surface* gScreenSurface = NULL;

//The image we will load and show on the screen
SDL_Surface* gHelloWorld = NULL;

Bazı global değişkenler tanımladık. Global değişken tanımlamak çok iyi bir metod olmasa da işleri basite indirgemek için bunu yaptık. Zaten şuanlık tek bir dosyadan oluştuğu için sorun yaratmayacaktır.

SDL_Surface adındaki veri türümüzü yakından tanıyalım. SDL_Surface sadece bir resmin piksel verisini ve render için gereken tüm bilgileri içeren veri türüdür. SDL_Surface software rendering kullanır, yani render alabilmek için CPU’yu kullanıyor. Hardware rendering mümkündür ama zordur. Bu sebeple ilk önce kolay yolu öğreneceğiz. İlerleyen derslerimizde GPU hızlandırmalı render’ın nasıl yapıldığını anlatacağız.

Burada pointer kullandık çünkü bellekte dinamik olarak yer ayırmak istiyoruz. Ayrıca bir resmi birden fazla kere kullanmak istediğinden her bir nesne için bellekte yeni bir resim tutmaktansa. Aynı resme sahip nesnelerin bellekte tek bir resmi kullanmasını sağlayabiliriz.

Pointerlarınızı tanımlarken veya kullanmadığınız zamanlarda NULL atamayı unutmayın.

bool init()
{
    //Initialization flag
    bool success = true;

    //Initialize SDL
    if( SDL_Init( SDL_INIT_VIDEO ) < 0 )
    {
        printf( "SDL could not initialize! SDL_Error: %s\n", SDL_GetError() );
        success = false;
    }
    else
    {
        //Create window
        gWindow = SDL_CreateWindow( "SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN );
        if( gWindow == NULL )
        {
            printf( "Window could not be created! SDL_Error: %s\n", SDL_GetError() );
            success = false;
        }
        else
        {
            //Get window surface
            gScreenSurface = SDL_GetWindowSurface( gWindow );
        }
    }

    return success;
}

initialization ve


Comments

Leave a Reply

Your email address will not be published. Required fields are marked *