我正试图在我的游戏中制作一个跳跃机制,它将起到这样的作用:
// velocity.Y是我想跳的精灵的速度
if (keystate.IsKeyDown(Keys.W))
{
velocity.Y = 3 - (time elapsed since start of jump);
}
我认为这可能是一个简单而优雅的解决方案,让我的精灵跳,但如果不可能像这样只是这样说,它回到绘图板。
答案 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;
}
更多