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;
}
您的'SDL_PollEvent'循環在每個事件上進行迭代,因此您正在爲系統中的每個事件更新/繪圖。基本上,如果我密集地移動鼠標,你的代碼將嘗試繪製每一個移動,事件如果它發生在一段時間以前(繪圖需要時間,特別是vsync,加上強制延遲)。這個循環應該用來收集事件;更新和繪圖應該在事件循環之外進行(在頂層'while(run)')。 – keltar
這一行:'int main(int argc,char * argv [])'(因爲在發佈的代碼中都沒有使用任何參數)將導致編譯器對未使用的參數提出兩個警告:'argc'和'argv [ ]'。建議將主函數簽名更改爲:'int main(void)' – user3629249