我刚开始使用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;
}
答案 0 :(得分:0)
SDL wiki表示您应该使用SDL_PumpEvents()
来更新键盘状态数组。
事实上,如果我们
while(SDL_PollEvent(&event))
循环(不是其内容),因为它不需要,state=SDL_GetKeyboardState(NULL);
循环之前移动while(run)
(数组的地址“将在应用程序的整个生命周期内有效”,因此它总是返回相同的指针),并且SDL_PumpEvents()