Если вам нужен только один шаг на нажатие, тогда в вашей функции update()
вам нужно обнулить вектор скорости после того, как вы его используете, это сделает шаг только один раз, но вы также должны проверить event.key.repeat
и принимать события, только когда он равен 0, чтобы избежать повторения события ~ 30 раз в секунду, пока нажата клавиша.Если вы хотите, чтобы шаг повторялся после заданной задержки, вам нужно сохранить возвращаемое значение (uint32_t
или Uint32
, если вы предпочитаете) SDL_GetTicks();
, принятое в момент получения события SDL_KEYUP (повторы игнорируются) затем проверьте, прошло ли достаточно миллисекунд, чтобы повторить шаг, затем добавьте порог времени к сохраненному значению времени, чтобы должным образом ожидать следующего повторения.
Кроме того, вы обнуляете свой вектор скорости каждый раз при отпускании любой клавиши, что в некоторых случаях вы не хотите.Возможно, было бы лучше добавить в вектор для каждого события SDL_KEYDOWN и вычесть в under для каждого SDL_KEYUP, для соответствия ключей, конечно.Кроме того, если вы собираетесь использовать WASD, вы должны использовать скан-коды вместо keysym, или ваша схема управления будет довольно неудобной в макетах, отличных от QWERTY.
Также, вероятно, нет необходимости в SDL_Delay()
, просто используйте Vsync, которыйустанавливается, когда вы инициализируете ваш рендерер чем-то вроде renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_PRESENTVSYNC);
.