我试图做一个跳跃机制在我的比赛,这将工作是这样的:XNA:如何衡量一个按键被按下的时间量?
// velocity.Y是我想这个我想跳
if (keystate.IsKeyDown(Keys.W))
{
velocity.Y = 3 - (time elapsed since start of jump);
}
精灵的速度可能是一个简单而优雅的解决方案,使我的精灵跳跃,但如果这是不可能的,只是这样说,它回到了绘图板。
我试图做一个跳跃机制在我的比赛,这将工作是这样的:XNA:如何衡量一个按键被按下的时间量?
// 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如果您认真对待游戏编程,是一本很棒的书。
我也可以推荐Game Engine Architecture
当你使用XNA你应该考虑使用Game Components
感谢您的信息,很高兴知道我是否可以更高效和我的方法专业。我会看看那本书。而且你肯定是对的,一个影响整个游戏的物理系统在长远看来会更有帮助,然后只是暂时的修正,让玩家跳跃。 –
没问题,我刚刚为你添加了几个链接。 – Joel
XNA没有内置的方法来检测印刷机与按下并保持;它只能告诉你,如果密钥是目前被按下。
然后,您需要做的是存储两个KeyboardState-s,“旧”和“当前”。一旦你有这个,你可以检测到按键开始时(old.isKeyDown == false && current.isKeyDown == true;
)和结束时间(old.isKeyDown == true && current.isKeyDown == false;
所以一旦你有这个,当你记录一个基于GameTime的“jumpStart”变量是一件简单的事情检测到按键,以及当你检测到按键释放时发现一个“jumpEnd”变量。
如果你希望根据按键被按下的时间长度来确定跳跃的持续时间,你可以通过设置增加一个上限,之后再按下该键不起作用
不是如果你正在寻找换句话说速度函数正在执行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;
}
更这里
这会触发stopWatch.Start()每按一次键。这很重要吗? (我不熟悉秒表) –
我相信新实例应该在每次按下时启动,因此它可能是新的时间,但您可以随时为每次迭代提供时间 –
给它最初的冲动,以及不断增加的速度高达只要按下按键。当然,你添加的速度低于重力。无需计算时间或任何东西。除此之外,无论如何,速度或加速度总是与时间有关。 – LightStriker
你是什么意思的初始冲动? –
最初的impusle是您按下跳转键时的速度。基本上,你给速度= 10(向上),只是保持重力下降。就这样,角色跳了起来。如果你想让你在拿着钥匙的时候跳到空中控制或者更大的范围,你可以继续增加一小部分向上的速度。 – LightStriker