Animasi dan Vsync

Untuk membuat animasi kita bisa menggunakan timer maupun VSYNC. Untuk kali ini, kita akan menggunakan Vsync. VSYNC bisa digunakan sebagai argumen parameter ketiga dari SDL_CreateRenderer. Kalian perlu menggunakan bitwise or (|) jika sudah menggunakan konstanta lain sebagai nilai argumen parameter tersebut.
  • SDL_CreateRenderer( window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC );
Untuk menampilkan animasi, tentunya kita butuh beberapa gambar. Untuk lebih praktisnya, kita sebaiknya menggunakan spritesheet yang terdiri dari beberapa gambar yang disatukan. Gambar-gambar yang sudah disatukan dalam spritesheet akan kita pisahkan lagi saat ditampilkan. Untuk kali ini, kita akan menggunakan gambar di bawah ini.
Jika kita menggunakan VSYNC untuk menampilkan animasi, kecepatannya akan tergantung pada refresh rate monitor yang biasanya sekitar 60 fps(frame per second). Tapi, karena refresh rate tiap monitor mungkin berbeda, animasi yang ditampilkan mungkin akan lebih cepat atau lebih lambat tergantung refresh rate-nya.
#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
#define jpotongan 3
#define jframe 10
#define tframe jpotongan*jframe

int main(int argc, char* args[]){
    SDL_Window* window = NULL;
    SDL_Event evt;
    int pos=0;

    if( SDL_Init( SDL_INIT_VIDEO ) < 0 && IMG_Init(IMG_INIT_JPG|IMG_INIT_PNG)){
        printf( "Error: %s\n", SDL_GetError() );
    }else{
        window = SDL_CreateWindow( "SDLku", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_SHOWN );
        if( window == NULL ){
            printf( "Error : %s", SDL_GetError() );
        }else{
            SDL_Renderer *trender = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);

            SDL_Surface *tmp=IMG_Load("animasi.png");

            if(tmp){
                int panjang=tmp->w/jpotongan;
                int tinggi=tmp->h;

                SDL_SetColorKey(tmp, SDL_TRUE, SDL_MapRGB(tmp->format, 0x00, 0xFF, 0xFF));
                SDL_Texture *bmp=SDL_CreateTextureFromSurface(trender, tmp);
                SDL_FreeSurface(tmp);

                if(bmp){
                    SDL_Rect rct;
                    rct.x=0;
                    rct.w=0;
                    while(evt.type!=SDL_QUIT){
                        while(SDL_PollEvent(&evt)){
                        }

                        SDL_SetRenderDrawColor(trender, 0xFF, 0xFF, 0xFF, 0xFF);
                        SDL_RenderClear(trender);

                        rct.x=0;
                        rct.w=panjang;
                        rct.h=tinggi;
                        SDL_RenderSetViewport(trender, &rct);

                        rct.x=panjang*(pos/jframe);
                        SDL_RenderCopy(trender, bmp, &rct, NULL);
                        SDL_RenderPresent(trender);
                        pos++;
                        if(pos>=tframe){
                            pos=0;
                        }
                    }
                }
            }
        }
    }

    SDL_DestroyWindow( window );
    SDL_Quit();

    return 0;
}
Supaya lebih akurat, kalian sebenarnya perlu memperhitungkan frame-ratenya. Perhitungan framerate bisa dilakukan dengan menghitung berapa kali loop per detik. Kalian bisa menggunakan function SDL_GetTick untuk mengetahui waktu yang sudah berlangsung setelah program dijalankan.