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
相关产品推荐
相关产品推荐

