我太近了!我正在使用XNA游戏状态管理示例找到here并尝试修改它处理输入的方式,以便我可以延迟键/创建输入缓冲区。
在GameplayScreen.cs中,我声明了一个名为elapsedTime的double,并将其设置为0。
在HandleInput方法中,我已将Key.Right按钮更改为:
if (keyboardState.IsKeyDown(Keys.Left))
movement.X -= 50;
if (keyboardState.IsKeyDown(Keys.Right))
{
elapsedTime -= gameTime.ElapsedGameTime.TotalMilliseconds;
if (elapsedTime <= 0)
{
movement.X += 50;
elapsedTime = 10;
}
}
else
{
elapsedTime = 0;
}
伪代码:
如果未按下右箭头键,则将elapsedTime设置为0.如果按下,则elapsedTime等于自身减去自上一帧以来的毫秒数。如果差值等于0或更小,则移动对象50,然后将elapsedTime设置为10(延迟)。
如果按下了键,则应该通过else将Time设置为0。相反,在成功检查后elapsedTime设置为10之后,elapsedTime应该越来越低,因为它被TotalMilliseconds减去。当它达到0时,它再次成功通过检查并再次移动对象。
问题是,每次按下它会移动一次对象,但如果按住它则不起作用。任何人都可以提供任何类型的提示/示例/一点知识吗?在此先感谢,这让我疯了。从理论上讲,我认为这肯定会有效。
澄清
当您考虑我希望块移动时,请考虑网格。它不是仅仅在屏幕上流畅地移动,而是通过它的宽度(有点跳跃)移动到下一个位置。如果我按住键,它会在屏幕上竞争。我希望减慢整个过程的速度,以便按住键可以在“跳跃”/移动它的宽度之间产生X毫秒的延迟。
编辑:结果gameTime.ElapsedGameTime.TotalMilliseconds一直返回0 ...我不明白为什么。
已解决:发现gameTime.ElapsedGameTime.TotalMilliseconds返回0 ...将其移动到其他地方。
答案 0 :(得分:1)
发现gameTime.ElapsedGameTime.TotalMilliseconds返回0 ...使用Update方法中的GameTime参数设置名为GameT的公共双变量。然后在HandleInput方法中使用GameT并返回有效时间。这不是最合法的方式,但它现在有效。
答案 1 :(得分:0)
所以问题是,您希望您的实体有什么行为?
movement.X += 50 * .05;
这样的东西。您可以上下调整它,直到每帧的移动与您想要移动的速度相匹配答案 2 :(得分:0)
如果您使用的是固定游戏时间,则根本不需要按时间延迟。您可以保留一个跟踪“框架”的变量,并根据该变量进行更新:
int elapsedFrames = 10; //<- Set up somewhere higher than the function call
if (keyboardState.IsKeyDown(Keys.Right))
{
elapsedFrames++;
if (elapsedFrames >= 10)
{
movement.X += 50;
elapsedTime = 0;
}
}
else
{
elapsedTime = 10;
}
这样你就不用处理gameTime了。