我的网格移动太快了。这个问题是由于速度,但我无法改变它。因为那时网格不起作用。
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/