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()
,
那么运动就顺畅了
我刚开始使用 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()
,
那么运动就顺畅了