C++ 和 SDL2 网格移动太快

标签 c++ sdl-2

我的网格移动太快了。这个问题是由于速度,但我无法改变它。因为那时网格不起作用。

    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。

最佳答案

如果您希望每次按下仅一步,那么在您的 update() 函数中,您需要在使用完它后将速度 vector 归零,这将使它仅一步,但您还必须检查 event.key.repeat 并且仅在它为 0 时才接受事件,以避免只要按住键就重复事件约 30 次/秒。如果您希望步进在给定的延迟后重复,那么您需要存储 SDL_GetTicks( ); 在接收到 SDL_KEYUP 事件的那一刻(忽略重复)然后检查是否经过了足够的毫秒数来重复步进,然后将时间阈值添加到存储的时间值以正确等待下一次重复。

此外,每次释放任何键时,您都会将速度 vector 归零,这在某些情况下是您不希望的。最好是为每个 SDL_KEYDOWN 事件添加 vector ,为每个 SDL_KEYUP 减去 vector ,当然是为了匹配键。此外,如果您要使用 WASD,则应该使用扫描码而不是键符,否则您的控制方案在非 QWERTY 布局上会非常尴尬。

也可能不需要 SDL_Delay(),只需使用 Vsync,它是在您使用 renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_PRESENTVSYNC);.

关于C++ 和 SDL2 网格移动太快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56463097/

相关文章:

c++ - pthread调度问题

c++ - 3D/FPS 相机问题 - SDL2

c++ - 2D C++ 碰撞检测几近完美,但还不够完美?

c - 使用 SDL2 & Glew,尝试在 OpenGL 中绘制一个简单的白色正方形。只会黑屏

c++ - 使用 lambda 语法的优先级队列令人困惑

c++ - 我如何在键入 "exit"一词的命令提示符中退出?

c++ - 在 make 文件中链接 SDL_image

c++ - 在 xCode 上安装 SDL2

c++ - (如何)当 std::future 准备好时,我可以在 boost::asio::io_service 上获得回调吗?

c++ - 在 TreeView 中进行 "tracking"项选择的最简单方法?