Menambahkan Tulisan dengan SDL_TTF

Library utama SDL tidak menyediakan fungsi untuk menampilkan tulisan dari string. Kita hanya bisa menampilkan tulisan dalam gambar jika kita hanya menggunakan SDL tanpa library tambahan lainnya. Untuk bisa menambahkan tulisan, kita perlu menginstal SDL_TTF. Jika kalian ingin menggunakan SDL_TTF di Code::Block, kalian perlu menambahkan "-lSDL_ttf" di Linker Settings setelah setting-setting lainnya.


Untuk pengguna Linux, kalian perlu menginstall library-nya lewat terminal sebelum bisa menggunakannya library tersebut. Jika kalian menggunakan Ubuntu, kalian bisa mengetikkan "sudo apt-get install libsdl2-ttf-dev". Tekan enter dan lanjutkan prosesnya. Kebetulan saya sudah menginstall library-nya. Kalau kalian belum menginstall library-nya, setelah penekanan enter, seharusnya akan ada pilihan "ya atau tidak".

 

Kalau kalian pengguna windows, kalian perlu mengatur letak folder library (*.lib) dan header(*.h) lewat "Search Directories => Linker". Kalian juga perlu menambahkan file "dll" dari library tersebut di folder project jika program akan dijalankan lewat "Code::Block". Kalau kalian menjalankan program dari luar IDE, kalian perlu memindahkan dll-nya di folder program, dan bukan di folder project-nya.

Contoh kode programnya?

#include <SDL2/SDL.h>
#include <SDL2/SDL_ttf.h>
#include <math.h>
#define playar 640
#define tlayar 480
#define grad 3.14285714286/180

SDL_Renderer *trender=NULL;

struct tulisanku{
    int lebar, tinggi;
    SDL_Texture *texture=NULL;
    char tulisan[256];
}teks;

int buat_tulisan(tulisanku *teks, const char *tulisan, TTF_Font *huruf, SDL_Color warna){
    strcpy(teks->tulisan, tulisan);
    if(teks->texture!=NULL)SDL_DestroyTexture(teks->texture);
    SDL_Surface *textSurface = TTF_RenderText_Blended(huruf, tulisan, warna);

    if( textSurface == NULL ){
        printf( "error: %s\n", TTF_GetError() );
    }else{
        teks->texture = SDL_CreateTextureFromSurface( trender, textSurface );
        if( teks->texture == NULL ){
            printf( "////error: %s\n", SDL_GetError() );
        }else{
            teks->lebar = textSurface->w;
            teks->tinggi = textSurface->h;
        }

        SDL_FreeSurface( textSurface );
    }

    return teks->texture != NULL?1:0;//berhasil==1, gagal=0
}

int main(int argc, char* args[]){
    SDL_Window* window = NULL;
    SDL_Event evt;
    SDL_Rect rct={0, 0, 0, 0};
    TTF_Font *huruf=NULL;
    int gagal=0;

    if( SDL_Init( SDL_INIT_VIDEO ) < 0){
        printf( "Error: %s\n", SDL_GetError() );
    }else{
        if( TTF_Init() == -1 ){
            gagal = 1;
        }

        if(gagal==0){
            window = SDL_CreateWindow( "SDLku", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, playar, tlayar, SDL_WINDOW_SHOWN );
            if( window == NULL ){
                printf( "Error : %s", SDL_GetError() );
            }else{
                trender = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
                if(trender!=NULL){
                    huruf=TTF_OpenFont( "FreeSans.ttf", 28 );

                    if( huruf == NULL ){
                        gagal = 1;
                    }else{
                        SDL_Color warna = { 0, 0xFF, 0 };

                        if( buat_tulisan(&teks, "Halo Dunia!", huruf, warna)==0 ){
                            gagal=1;
                        }
                    }

                    while(evt.type!=SDL_QUIT){
                        while(SDL_PollEvent(&evt)){
                        }

                        SDL_SetRenderDrawColor(trender, 0xFF, 0xFF, 0xFF, 0xFF);
                        SDL_RenderClear(trender);
                        rct.x=playar/2-teks.lebar/2;
                        rct.y=tlayar/2-teks.tinggi/2;
                        rct.w=teks.lebar;
                        rct.h=teks.tinggi;
                        SDL_RenderCopy(trender, teks.texture, 0, &rct);
                        SDL_RenderPresent(trender);
                    }
                }
            }

            SDL_DestroyTexture(teks.texture);
            TTF_CloseFont(huruf);
            TTF_Quit();
        }
    }

    SDL_DestroyWindow( window );
    SDL_Quit();

    return 0;
}

Sama seperti library SDL lainnya, kita perlu menggunakan satu fungsi untuk mengawali penggunaan library. Untuk menggunakan SDL_TTF, fungsi yang perlu kita gunakan sebelum bisa menggunakan fungsi-fungsi lainnya adalah "TTF_Init()". TTF_Init akan mengembalikan nilai lebih dari -1 jika library berhasil dimuat. Jika library gagal dimuat, program tidak akan bisa menggunakan function-function lain dalam library SDL_TTF.

Setelah berhasil memuat library-nya, kalian perlu memuat font yang akan digunakan menggunakan function TTF_OpenFont(). Pada kode program di atas, font yang digunakan bernama "FreeSans.ttf". Kalian bisa menggunakan file font berformat true type yang diletakkan di folder project atau folder program kalian. Sebaiknya, gunakan font gratisan atau font yang kalian buat sendiri.

Jika font sudah berhasil dimuat, kalian bisa membuat tulisan yang disimpan dalam Surface dengan beberapa function dari SDL_TTF. Beberapa function yang bisa kalian gunakan untuk mengisi surface dengan "tulisan", yaitu :

  • TTF_RenderText_Solid : Hasilnya cepat, tapi tulisan terlihat kasar.
  • TTF_RenderText_Shaded : Sedikit lebih lambat dengan tulisan yang cukup halus, tapi disertai dengan kotak di sekelilingnya dengan warna sesuai parameter ke-4.
  • TTF_RenderText_Blended : Lebih lambat dari Solid maupun Shaded, tapi dengan hasil yang cukup halus tanpa kotak di sekelilingnya, di atas warna polos maupun bitmap.

SDL_RenderTextSolid dan SDL_RenderTextBlended sama-sama menggunakan 3 parameter. Semua function di atas digunakan untuk teks biasa dengan tipe char. Untuk menampilkan teks unicode, kalian perlu menggunakan function lainnya yang dikhususkan untuk text unicode.

  • TTF_RenderUnicode_Solid : Menampilkan tulisan seadanya tanpa filter.
  • TTF_RenderUnicode_Shaded : Menampilkan tulisan yang diperhalus dengan kotak.
  • TTF_RenderUnicode_Blended : Menampilkan tulisan yang diperhalus sisi-sisinya tanpa kotak.

Jika kalian ingin mengunakan renderer, kalian perlu mengubah surface menjadi texture yang bisa digunakan oleh renderer. Kalian sebaiknya membuat function untuk membuat tulisan di surface, dan mengubah surface-nya menjadi texture. Dalam kode program di atas, saya menggunakan function bernama "buat_tulisan" untuk membuat tulisan dengan menggunakan texture.

Untuk mengubah warnanya, kalian bisa mengubah variabel warna yang bertipe SDL_Color. SDL_Color menggunakan 3 nilai yang mewakili warna RGB.

Kalau kalian malas mengetik atau bingung, kalian bisa mendownload source codenya di sini.