C#中使用WSAD键移动PictureBox释放按键后延迟如何解决
问题原因
你现有代码的KeyUp逻辑存在缺陷:只要松开任意一个WASD方向键,就会直接清空移动方向、停止hero的移动定时器。即便此时还有另一个方向键处于长按状态,也需要等待系统内置的按键重复触发机制再次触发KeyDown事件才能重启移动,系统默认的首次按键重复延迟就是你感受到的移动卡顿来源。
修复方案
核心思路是新增一个有序集合记录所有当前处于按下状态的方向键,按键按下时将对应按键加入集合,松开时从集合移除对应按键,每次按键状态变化后直接从集合取最早按下的按键更新移动方向,不需要等待KeyDown重新触发,即可消除延迟,同时保留你要求的「优先响应最先按下的按键」的逻辑。
修改后的代码
窗体类代码
// 新增字段:记录当前按下的方向键,顺序为按下的先后顺序 private readonly List<Keys> _pressedDirectionKeys = new List<Keys>(); private void Form1_KeyDown(object sender, KeyEventArgs e) { Keys[] directionKeys = { Keys.W, Keys.A, Keys.S, Keys.D }; // 只处理方向键,避免重复添加同一按键 if (directionKeys.Contains(e.KeyCode) && !_pressedDirectionKeys.Contains(e.KeyCode)) { _pressedDirectionKeys.Add(e.KeyCode); UpdateHeroDirection(); hero.heroTimer.Start(); } e.SuppressKeyPress = true; } private void Form1_KeyUp(object sender, KeyEventArgs e) { Keys[] directionKeys = { Keys.W, Keys.A, Keys.S, Keys.D }; if (directionKeys.Contains(e.KeyCode)) { _pressedDirectionKeys.Remove(e.KeyCode); UpdateHeroDirection(); } e.SuppressKeyPress = true; } // 新增辅助方法:更新hero的移动方向 private void UpdateHeroDirection() { if (_pressedDirectionKeys.Count == 0) { // 没有按下的方向键,停止移动 hero.SetDirection(""); hero.heroTimer.Stop(); return; } // 取最早按下的方向键设置移动方向,符合原有需求 Keys currentKey = _pressedDirectionKeys[0]; switch (currentKey) { case Keys.W: hero.SetDirection("up"); break; case Keys.S: hero.SetDirection("down"); break; case Keys.A: hero.SetDirection("left"); break; case Keys.D: hero.SetDirection("right"); break; } }
Hero类代码
原有Hero类的逻辑不需要做任何修改,可以直接复用。
内容的提问来源于stack exchange,提问作者Tomass Galvans
相关产品推荐
相关产品推荐

