C SDL对象移动流程

时间:2016-01-27 01:49:42

标签: c sdl

我刚开始使用SDL并在一个窗口上移动了一个小方块。 我使用了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;
}

1 个答案:

答案 0 :(得分:0)

SDL wiki表示您应该使用SDL_PumpEvents()来更新键盘状态数组。

事实上,如果我们

  • 删除while(SDL_PollEvent(&event))循环(不是其内容),因为它不需要,
  • state=SDL_GetKeyboardState(NULL);循环之前移动while(run)(数组的地址“将在应用程序的整个生命周期内有效”,因此它总是返回相同的指针),并且
  • 仅在循环内调用SDL_PumpEvents()
然后运动顺利。