2015-12-09 84 views
0

我已經編寫了一個程序來圍繞一個矩形進行反彈。我使用SDL_RenderFillRect繪製一個矩形和SDL_RenderPresent來呈現該矩形,之後SDL_RenderClear將清除渲染器以再次完成它。我使用SDL_GetTicks和SDL_Delay來每秒更新60次,但不知何故矩形的速度是不規則的,而不是平滑的。過去幾天我嘗試過不同的事情,但沒有任何幫助。有沒有一種特殊的方式可以使用SDL_RenderPresent來定期更新窗口?SDL_RenderPresent()不規則地更新屏幕

#include <SDL.h> 
#include <math.h> 
#include <iostream> 
#include <stdio.h> 

const int width = 1200; 
const int height = 800; 
const double PI = 3.141592653589793; 

void init(); 
void quit(); 

double x = width/2; 
double y = height/2; 
double r = 25; 
double vx = 1; 
double vy = 1; 
double s = 4; 
double tickStart = SDL_GetTicks(); 
double tickEnd = 0; 
double tickDelta = 0; 
double frameTime = 1001.0/60.0; 
double delayTime = 0; 

int c = 0; 

SDL_Window* window; 
SDL_Renderer* renderer; 
SDL_Event *event; 
SDL_Rect rect; 

int main(int argc, char* argv[]) { 
    init(); 

    // main loop 
    bool running = true; 
    while (running) { 
     event = new SDL_Event; 

     while (SDL_PollEvent(event) != 0) { 
      if (event->type == SDL_QUIT) { 
       running = false; 
       break; 
      } 
     } 

     //renderer 
     SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); 
     SDL_RenderClear(renderer); 
     SDL_SetRenderDrawColor(renderer, 0, 0, 255, 255); 

     // update position 
     x = x + vx*s; 
     y = y + vy*s; 

     // check wall collision 
     if (x - r <= 0) { 
      vx = -vx; 
      x = r; 
     } 
     else if (x + r >= width) { 
      vx = -vx; 
      x = width - r; 
     } 

     if (y - r <= 0) { 
      vy = -vy; 
      y = r; 
     } 
     else if (y + r >= height) { 
      vy = -vy; 
      y = height - r; 
     } 

     // rect  
     rect.h = rect.w = 2 * r; 
     rect.x = x - r; 
     rect.y = y - r; 
     SDL_RenderFillRect(renderer, &rect); 

     // present everything at the right time 
     tickEnd = SDL_GetTicks(); 
     tickDelta = tickEnd - tickStart; 
     delayTime = frameTime - tickDelta; 
     std::cout << tickDelta << std::endl; 

     if (delayTime > 0) 
      SDL_Delay(delayTime); 

     tickStart = SDL_GetTicks(); 
     SDL_RenderPresent(renderer); 

     c++; 
    } 

    quit(); 
    return 0; 
} 

void init() 
{ 
    SDL_Init(SDL_INIT_EVERYTHING); 
    window = SDL_CreateWindow("test", 200, 100, width, height, SDL_WINDOW_SHOWN); 
    renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); 
} 

void quit() 
{ 
    SDL_DestroyRenderer(renderer); 
    SDL_DestroyWindow(window); 
    SDL_QUIT; 
} 

回答

0

根據具體情況調用SDL_Delay()似乎需要大約15ms。渲染器可以通過右對齊標誌來進行垂直同步:renderer = SDL_CreateRenderer(window,-1,SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);