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

MonoGame中如何实现KeyboardInput类与Game1类联动完成玩家移动?

问题修复:拆分键盘输入逻辑后玩家无法移动的解决方法

你的代码存在两个核心问题,导致玩家无法移动,以下是具体修复方案:


问题1:KeyboardState未实时更新

在KeyboardInput类中,keyboardState是类级字段,仅在对象初始化时获取一次键盘状态,后续Update循环中不会更新,导致永远检测不到按键的按下状态。

修复方法:在Update方法内部每次获取最新的键盘状态,替换原有的类级字段:

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Input;

namespace rpg_game
{
    internal class KeyboardInput
    {
        public int player_X;
        public int player_Y;

        public void Update(GameTime gameTime)
        {
            // 每次Update都获取最新的键盘状态
            KeyboardState keyboardState = Keyboard.GetState();

            if (keyboardState.IsKeyDown(Keys.W)) { player_Y -= 1; }
            if (keyboardState.IsKeyDown(Keys.A)) { player_X -= 1; }
            if (keyboardState.IsKeyDown(Keys.S)) { player_Y += 1; }
            if (keyboardState.IsKeyDown(Keys.D)) { player_X += 1; }
        }
    }
}

问题2:坐标修改未同步回Game1类

Game1的Update方法中,仅将自身的player_X/Y传递给KeyboardInput,但没有将KeyboardInput修改后的坐标同步回来,Draw方法依然使用原始的player_X/Y值,所以玩家位置不会变化。

修复方法:在调用input.Update后,将输入类修改后的坐标同步回Game1:

protected override void Update(GameTime gameTime)
{
    // 传递当前玩家坐标到输入类
    input.player_X = player_X;
    input.player_Y = player_Y;

    input.Update(gameTime);

    // 将输入类修改后的坐标同步回Game1
    player_X = input.player_X;
    player_Y = input.player_Y;

    base.Update(gameTime); // 保留base.Update处理默认游戏逻辑
}

内容的提问来源于stack exchange,提问作者Tiny Designs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 08:52:34