C SDL Движение объекта

Вопрос: Я только начал с SDL и сделал маленький квадрат, передвигающийся по окну. Я использовал DL_GetKeyboardState и получил его плавный переход. Однако, когда я начинаю перемещать его в одном направлении, удерживая одну клавишу, он немного перемещается, останавливается, а затем двигается, как я хочу. Это нарушает гладкость. Лучше всего предположить, что он ждет двойного щелчка мыши,

Вопрос:

Я только начал с 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; } Лучший ответ:

В вики SDL говорится, что вы должны использовать SDL_PumpEvents() для обновления массива состояний клавиатуры.

И действительно, если мы

  • удалите while(SDL_PollEvent(&event)) (а не его содержимое), поскольку он не нужен,
  • move state=SDL_GetKeyboardState(NULL); перед циклом while(run) (адрес массива “будет действителен для всего жизненного цикла приложения”, поэтому он всегда возвращает тот же указатель), и
  • только вызовите SDL_PumpEvents() внутри цикла,

то движение плавное.

Оцените статью
Добавить комментарий