Certamente. O mais estranho é que sempre enfrentei isso. E meus amigo que fazem o jogo comigo também enfrentam. Olhei no Windows ontem e notei a mesma tremedeira, ao contrário do que inicialmente havia dito. Porém o loop ainda é mais rápido. Este, eu creio que não é um problema em si, mas a tremedeira sim.
Abaixo, um exemplo de código que testo:
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#define SCREEN_W 800
#define SCREEN_H 600
SDL_Surface* my_surf;
SDL_Surface* base;
SDL_Surface* press;
SDL_Rect rect;
SDL_Rect recbase;
SDL_Rect recpress = {10, 10, 0, 0};
int incy1;
void update_positions(int max_w, int max_h)
{
rect.y += incy1;
if(rect.y <= 0) incy1 = -incy1;
}
int main(int argc, char** argv)
{
int move = 0;
SDL_Surface* screen;
SDL_Event event;
int quit = 0;
Uint32 cor_fundo;
SDL_Init(SDL_INIT_VIDEO);
screen = SDL_SetVideoMode(SCREEN_W, SCREEN_H, 16, SDL_SWSURFACE);
my_surf = IMG_Load("yoda3d.gif");
base = IMG_Load("nave.jpg");
press = IMG_Load("press.jpg");
rect.x = (SCREEN_W/2) - (my_surf->w /2);
recbase.x = (SCREEN_W/2) - (base->w /2);
recbase.y = SCREEN_H - base->h;
rect.y = SCREEN_H -(base->h)/2 - my_surf->h;
cor_fundo = SDL_MapRGB(screen->format, 255, 255, 255);
while(!quit)
{
while(SDL_PollEvent(&event))
{
if(event.type == SDL_QUIT)
{
quit = 1;
}
if(event.type == SDL_KEYDOWN)
{
if (event.key.keysym.sym == SDLK_UP)
{
incy1 = -1;
move = 1;
}
}
}
if (move)
{
update_positions(SCREEN_W, SCREEN_H);
}
if(rect.y + my_surf->h == SCREEN_H-(base->h)/2)
{
move = 0;
}
SDL_FillRect(screen, NULL, cor_fundo);
SDL_BlitSurface(base, NULL, screen, &recbase);
SDL_BlitSurface(my_surf, NULL, screen, &rect);
SDL_BlitSurface(press, NULL,screen, &recpress);
SDL_Flip(screen);
}
SDL_Quit();
return 0;
}
Se quiser compilar, pressione a seta para cima para fazer o boneco andar (no caso, teria que colocar três imagens disponíveis com os mesmos nomes escritos no código no mesmo diretório).