C++和 SDL2 网格移动太快
C++ and SDL2 Grid movement is too fast
我的网格移动太快了。这个问题是由于速度造成的,但我无法改变它。因为那样网格就不工作了。
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()
函数中,你需要在你完成使用它后将你的速度矢量归零,这将使它只步进一次,但你还必须检查event.key.repeat
并且只在它为 0 时才接受事件,以避免重复事件 ~30 次/秒只要按住键。如果您希望步进在给定延迟后重复,则需要存储收到SDL_KEYUP事件时所SDL_GetTicks();
的返回值(如果您愿意,可以uint32_t
或Uint32
)(忽略重复),然后检查是否经过了足够的毫秒来重复步进,然后将时间阈值添加到存储的时间值中以正确等待下一次重复。
此外,每次释放任何键时,您都会将速度矢量归零,在某些情况下您不希望这样做。最好为每个SDL_KEYDOWN事件添加到向量中,并为每个SDL_KEYUP减去 under,当然是为了匹配键。此外,如果你打算使用WASD,你应该使用扫描码而不是keysym,否则你的控制方案在非QWERTY布局上会非常尴尬。
也不需要SDL_Delay()
,只需使用Vsync,这是在您使用类似renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_PRESENTVSYNC);
初始化渲染器时设置的。
相关文章:
- 将对象移动到std::shared_ptr
- 何时在引用或唯一指针上使用移动语义
- 如何从具有移动语义的类对象中生成共享指针
- 将shared_ptr移动到<StructA>shared_ptr<变体<结构A、结构 B>>
- C / C++ 移位/偏移/向左或向右移动位图?
- MSVC将仅移动结构参数解释为指针
- 自定义先决条件对移动分配运算符有效吗
- 返回值优化:显式移动还是隐式
- 当有分配器意识的容器被复制/移动时,反弹分配器是否被复制/移走
- 为什么复制而不是移动数据元素?
- 可以使用移动语义更改或改进此C++代码吗?
- 使用 SDL2 平滑网格移动?
- C++和 SDL2 网格移动太快
- 在网格中找到大多数K移动和最高分数的路径
- 将网格与VTK相机对齐(相机的视觉表示,随之移动和旋转的网格)
- 2D 阵列/网格中的对象移动
- 有人能建议我如何在网格游戏中移动士兵时解决一个牢房中的旁路问题吗
- 在 4x4 网格上打印出C++的移动步骤
- 沿着二维网格移动一个值
- 如何在c++中操纵/移动一个网格中的对象