2016-01-27 57 views
0

我剛開始使用SDL,並在窗口上移動了一個小方塊。 我使用了DL_GetKeyboardState,並且讓它移動了一種流暢。然而,當我按住一個鍵開始向一個方向移動時,它會移動一點,停下來,然後像我想要的那樣移動。這會弄亂光滑度。我最好的猜測是它等待鼠標雙擊,但我不確定。有什麼建議麼?C SDL對象移動流程

代碼:

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

int main(int argc, char * argv[]) 
{ 
    SDL_Window *window; 
    SDL_Renderer *renderer; 
    SDL_Event event; 

    SDL_Init(SDL_INIT_VIDEO); 
    window = SDL_CreateWindow("Yelda!", SDL_WINDOWPOS_UNDEFINED,  SDL_WINDOWPOS_UNDEFINED, 1600, 1200, 0); 
    renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); 

    const Uint8 *state; 
    int run = 1; 
    int xpos=300; 
    int ypos=300; 
    int projectileYPos; 
    int projectileXPos; 
    int loop; 
    int lanceLength = 10; 

    while(run) 
    { 
     while(SDL_PollEvent(&event)) 
     { 
     state=SDL_GetKeyboardState(NULL); 

     if(state[SDL_SCANCODE_ESCAPE]) 
      run=0; 
     if(state[SDL_SCANCODE_W]) 
      ypos-=10; 
     if(state[SDL_SCANCODE_S]) 
      ypos+=10; 
     if(state[SDL_SCANCODE_A]) 
      xpos-=10; 
     if(state[SDL_SCANCODE_D]) 
      xpos+=10; 

     SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); 
     SDL_RenderClear(renderer); 
     SDL_SetRenderDrawColor(renderer, 255, 255, 255 ,255); 
     SDL_Rect rect = {xpos, ypos, 20, 20 }; 
     SDL_RenderFillRect(renderer, &rect); 
     SDL_RenderPresent(renderer); 

     SDL_Delay(20); 
     } 
    } 

    SDL_DestroyWindow(window); 
    SDL_DestroyRenderer(renderer); 
    SDL_Quit(); 
    return 0; 
} 
+2

您的'SDL_PollEvent'循環在每個事件上進行迭代,因此您正在爲系統中的每個事件更新/繪圖。基本上,如果我密集地移動鼠標,你的代碼將嘗試繪製每一個移動,事件如果它發生在一段時間以前(繪圖需要時間,特別是vsync,加上強制延遲)。這個循環應該用來收集事件;更新和繪圖應該在事件循環之外進行(在頂層'while(run)')。 – keltar

+0

這一行:'int main(int argc,char * argv [])'(因爲在發佈的代碼中都沒有使用任何參數)將導致編譯器對未使用的參數提出兩個警告:'argc'和'argv [ ]'。建議將主函數簽名更改爲:'int main(void)' – user3629249

回答

0

SDL wiki說,你應該使用SDL_PumpEvents()更新鍵盤狀態陣列。

事實上,如果我們

  • while(run)循環(數組的地址之前刪除while(SDL_PollEvent(&event))循環(而不是其內容),因爲它是不必要的,
  • 舉動state=SDL_GetKeyboardState(NULL);「將適用於整個該應用程序」,所以它總是返回相同的指針)的一生中,只有
  • 調用SDL_PumpEvents()內循環,

然後運動平穩。

+1

實際上,'SDL_PollEvent'調用'SDL_PumpEvents'。 – keltar