如何使用方向键/WASD控制PictureBox移动?Pong游戏paddle无法移动求助
存在的问题及修复方案
- 按键匹配逻辑错误:
e.KeyCode.ToString()返回的是大写字符,你写的小写"w"、"s"永远无法命中,直接用Keys枚举判断即可,无需转字符串。 - 移动方向写反:控件的
Top属性是控件上边缘到窗体顶部的距离,向上移动需要减小Top值,向下移动需要增大Top值,现有代码的移动逻辑和预期完全相反。 - 键盘事件未触发:WinForm默认
KeyPreview属性为false,键盘事件会被子控件优先捕获,窗体本身的KeyDown/KeyUp事件不会执行,需要在初始化时开启该属性。 - 可选优化:添加边界校验,避免挡板移出窗体可视区域。
修复后完整代码
public partial class Form1 : Form { bool P1Up, P1Down, P2Up, P2Down; int Speed = 12; public Form1() { InitializeComponent(); // 开启窗体键盘事件优先捕获 KeyPreview = true; } private void MoveTriggerTick(object sender, EventArgs e) { // 玩家1移动逻辑 + 边界判断 if (P1Up == true && Player1Paddle.Top > 0) Player1Paddle.Top -= Speed; if (P1Down == true && Player1Paddle.Bottom < ClientSize.Height) Player1Paddle.Top += Speed; // 玩家2移动逻辑 + 边界判断 if (P2Up == true && Player2Paddle.Top > 0) Player2Paddle.Top -= Speed; if (P2Down == true && Player2Paddle.Bottom < ClientSize.Height) Player2Paddle.Top += Speed; } private void Form1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.W) P1Up = true; if (e.KeyCode == Keys.S) P1Down = true; if (e.KeyCode == Keys.Up) P2Up = true; if (e.KeyCode == Keys.Down) P2Down = true; } private void Form1_KeyUp(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.W) P1Up = false; if (e.KeyCode == Keys.S) P1Down = false; if (e.KeyCode == Keys.Up) P2Up = false; if (e.KeyCode == Keys.Down) P2Down = false; } }
内容的提问来源于stack exchange,提问作者Vergil
相关产品推荐
相关产品推荐

