我正在尝试在我的游戏中创建一个跳跃机制,它的工作原理如下:
//velocity.Y是我要跳跃的精灵的速度
if (keystate.IsKeyDown(Keys.W))
{
velocity.Y = 3 - (time elapsed since start of jump);
}
我认为这可能是让我的精灵跳跃的一个简单而优雅的解决方案,但如果这样不可能,那就这么说吧,它又回到了绘图板上。
我建议不要将物理直接连接到玩家输入,这不是一个非常可扩展的架构。
具有定义物理属性的接口,例如由角色对象实现的速度。当玩家按下向上键时,您应该检查玩家是否在地面上,如果他们将加速度设置为向上移动。然后让物理系统遍历每个对象的列表,这些对象实现物理接口,在移动实体之前应用重力和其他力。通过这种方式,您可以为游戏中的每个实体使用相同的物理代码。
我还建议不要将键盘输入直接连接到播放器的移动。您可以有一个名为“ICharacterController”的接口,它定义了一个“nextInstruction”方法,该方法返回“CharacterInstructions”,该方法定义了角色可以采取的各种动作,例如跳跃和移动,这可以通过输入类来实现。然后,您的角色类包含对 CharacterController 的引用,因此它只调用 nextInstruction,这样角色可以由玩家输入、AI 或通过网络通信控制,但仍与玩家共享相同的行为。
如果您对游戏编程很认真,那么Game Coding Complete是一本很棒的书。
我也可以推荐游戏引擎架构
当您使用 XNA 时,您应该考虑使用游戏组件
XNA 没有内置方法来检测按压与按住;它只能告诉您当前是否正在按下该键。
那么,您需要做的是存储两个 KeyboardState-s,“Old”和“Current”。一旦你有了这个,你就可以检测到按键何时开始(old.isKeyDown == false && current.isKeyDown == true;
)以及何时结束(old.isKeyDown == true && current.isKeyDown == false;
所以一旦你有了这个,当你检测到按键时,根据 GameTime 记录一个“jumpStart”变量,并在检测到按键释放时记录一个“jumpEnd”变量是一件简单的事情。
如果您想根据按住键的时间来确定跳跃的持续时间,最好设置一个上限,之后再按住键没有任何效果。
如果在您按住按钮时正在执行速度功能,则不是您正在寻找的内容,而是您可以使用 stopwath 来测量
Stopwatch stopWatch = new Stopwatch();
if (keystate.IsKeyDown(Keys.W))
{
velocity.Y = 3 - (time elapsed since start of jump);
stopWatch.Start();
}
if (keystate.IsKeyUp(Keys.W))
{
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
}
更多在这里