2012-11-10 34 views
2

我试图做一个跳跃机制在我的比赛,这将工作是这样的:XNA:如何衡量一个按键被按下的时间量?

// velocity.Y是我想这个我想跳

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

精灵的速度可能是一个简单而优雅的解决方案,使我的精灵跳跃,但如果这是不可能的,只是这样说,它回到了绘图板。

+1

给它最初的冲动,以及不断增加的速度高达只要按下按键。当然,你添加的速度低于重力。无需计算时间或任何东西。除此之外,无论如何,速度或加速度总是与时间有关。 – LightStriker

+0

你是什么意思的初始冲动? –

+0

最初的impusle是您按下跳转键时的速度。基本上,你给速度= 10(向上),只是保持重力下降。就这样,角色跳了起来。如果你想让你在拿着钥匙的时候跳到空中控制或者更大的范围,你可以继续增加一小部分向上的速度。 – LightStriker

回答

1

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

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

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

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

我也可以推荐Game Engine Architecture

当你使用XNA你应该考虑使用Game Components

+0

感谢您的信息,很高兴知道我是否可以更高效和我的方法专业。我会看看那本书。而且你肯定是对的,一个影响整个游戏的物理系统在长远看来会更有帮助,然后只是暂时的修正,让玩家跳跃。 –

+1

没问题,我刚刚为你添加了几个链接。 – Joel

0

XNA没有内置的方法来检测印刷机与按下并保持;它只能告诉你,如果密钥是目前被按下。

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

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

如果你希望根据按键被按下的时间长度来确定跳跃的持续时间,你可以通过设置增加一个上限,之后再按下该键不起作用

0

不是如果你正在寻找换句话说速度函数正在执行while你按住按钮,但您可以同时使用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

+0

这会触发stopWatch.Start()每按一次键。这很重要吗? (我不熟悉秒表) –

+0

我相信新实例应该在每次按下时启动,因此它可能是新的时间,但您可以随时为每次迭代提供时间 –

相关问题