You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用方向键/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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 11:03:01