2

我正在尝试在我的游戏中创建一个跳跃机制,它的工作原理如下:

//velocity.Y是我要跳跃的精灵的速度

 if (keystate.IsKeyDown(Keys.W))
         {
             velocity.Y = 3 - (time elapsed since start of jump);
         }

我认为这可能是让我的精灵跳跃的一个简单而优雅的解决方案,但如果这样不可能,那就这么说吧,它又回到了绘图板上。

4

3 回答 3

1

我建议不要将物理直接连接到玩家输入,这不是一个非常可扩展的架构。

具有定义物理属性的接口,例如由角色对象实现的速度。当玩家按下向上键时,您应该检查玩家是否在地面上,如果他们将加速度设置为向上移动。然后让物理系统遍历每个对象的列表,这些对象实现物理接口,在移动实体之前应用重力和其他力。通过这种方式,您可以为游戏中的每个实体使用相同的物理代码。

我还建议不要将键盘输入直接连接到播放器的移动。您可以有一个名为“ICharacterController”的接口,它定义了一个“nextInstruction”方法,该方法返回“CharacterInstructions”,该方法定义了角色可以采取的各种动作,例如跳跃和移动,这可以通过输入类来实现。然后,您的角色类包含对 CharacterController 的引用,因此它只调用 nextInstruction,这样角色可以由玩家输入、AI 或通过网络通信控制,但仍与玩家共享相同的行为。

如果您对游戏编程很认真,那么Game Coding Complete是一本很棒的书。

我也可以推荐游戏引擎架构

当您使用 XNA 时,您应该考虑使用游戏组件

于 2012-11-10T21:49:36.603 回答
0

XNA 没有内置方法来检测按压与按住;它只能告诉您当前是否正在按下该

那么,您需要做的是存储两个 KeyboardState-s,“Old”和“Current”。一旦你有了这个,你就可以检测到按键何时开始(old.isKeyDown == false && current.isKeyDown == true;)以及何时结束(old.isKeyDown == true && current.isKeyDown == false;

所以一旦你有了这个,当你检测到按键时,根据 GameTime 记录一个“jumpStart”变量,并在检测到按键释放时记录一个“jumpEnd”变量是一件简单的事情。

如果您想根据按住键的时间来确定跳跃的持续时间,最好设置一个上限,之后再按住键没有任何效果。

于 2012-11-10T21:28:00.190 回答
0

如果在您按住按钮时正在执行速度功能,则不是您正在寻找的内容,而是您可以使用 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;

}

更多在这里

http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-2

于 2012-11-10T21:28:18.037 回答