XNA:如何衡量按键被关闭的时间量?

时间:2012-11-10 21:11:41

标签: c# xna sprite

我正试图在我的游戏中制作一个跳跃机制,它将起到这样的作用:

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

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

我认为这可能是一个简单而优雅的解决方案,让我的精灵跳,但如果不可能像这样只是这样说,它回到绘图板。

3 个答案:

答案 0 :(得分:1)

我建议不要将物理直接连接到播放器输入,它不是一个非常可扩展的架构。

有一个接口,用于定义物理属性,例如由角色对象实现的速度。当玩家按下向上键时,你应该检查玩家是否在地上,如果他们是,那么他们的加速度就会向上移动。然后让物理系统迭代每个对象的列表,这些对象在移动实体之前应用重力和其他力来实现物理界面。这样,您就可以为游戏中的每个实体使用相同的物理代码。

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

如果你认真对待游戏编程,

Game Coding Complete是一本精彩的书。

我还可以推荐Game Engine Architecture

在使用XNA时,您应该考虑使用Game Components

答案 1 :(得分:0)

XNA没有内置的方法来检测印刷机与按住;它只能告诉您键是否当前被按下。

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

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

如果你想根据按下按键的时间长度来确定跳跃的持续时间,你可以通过设置一个上限来更好地服务,之后进一步按住按键无效。

答案 2 :(得分: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