C ++ и SDL2 Grid перемещается слишком быстро - PullRequest
0 голосов
/ 05 июня 2019

Мое движение сетки слишком быстрое.Эта проблема связана со скоростью, но я не могу ее изменить.Потому что тогда сетка не работает.

    if (Game::event.type == SDL_KEYDOWN) {
        if (Game::event.key.keysym.sym == SDLK_w || Game::event.key.keysym.sym == SDLK_UP) {
            transform->velocity.y = -1;
        }
        else if (Game::event.key.keysym.sym == SDLK_s || Game::event.key.keysym.sym == SDLK_DOWN) {
            transform->velocity.y = 1;
        }
        else if (Game::event.key.keysym.sym == SDLK_d || Game::event.key.keysym.sym == SDLK_RIGHT) {
            transform->velocity.x = 1;
        }
        else if (Game::event.key.keysym.sym == SDLK_a || Game::event.key.keysym.sym == SDLK_LEFT) {
            transform->velocity.x = -1;
        }
    } else if (Game::event.type == SDL_KEYUP) {
        transform->velocity.x = 0;
        transform->velocity.y = 0;
    }

И обновление для позиции игрока:

void update() override {
    position.x += round(velocity.x * 32);
    position.y += round(velocity.y * 32);
}

Проблема в обновлении позиции игрока, но если не было * 32 игрока получаетиз сетки.(32 - размер сетки)

Есть идеи, как ее решить?

И да, я использую SDL_Delay.

1 Ответ

1 голос
/ 25 июня 2019

Если вам нужен только один шаг на нажатие, тогда в вашей функции 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);.

...