C SDL对象移动流程

C SDL Object movement flow

我刚开始使用 SDL,并在 window 上制作了一个四处移动的小方块。 我用了 DL_GetKeyboardState,让它移动起来很顺利。然而,就在我通过按住一个键开始向一个方向移动时,它移动了一点,停止,然后按照我想要的方式移动。这会破坏平滑度。我最好的猜测是它等待鼠标双击,但我不确定。有什么建议么?

代码:

#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;
}

SDL wiki 说你应该使用 SDL_PumpEvents() 来更新键盘状态数组。

事实上,如果我们

  • 删除 while(SDL_PollEvent(&event)) 循环(不是它的内容),因为它不需要,
  • while(run)循环之前移动state=SDL_GetKeyboardState(NULL);(数组的地址"will be valid for the whole lifetime of the application",所以它总是returns相同的指针),并且
  • 只在循环内调用SDL_PumpEvents()

那么运动就顺畅了