我正在尝试在XNA中制作基于2D平铺的自上而下的游戏。它是16 x 16个图块,每个图块是25个像素。
我有一个字符精灵从(0,0)第一个拼贴开始,我正在尝试使用键盘从拼贴到拼贴。所以在Update方法中,当按下箭头键时,我尝试在位置向量的x或y上加或减25。它在移动时似乎在瓷砖中对齐,但它一次移动大约4-5个瓷砖而不是仅仅1个瓷砖。我已经尝试将它与gameTime.TotalGameTime.TotalSeconds相乘,但它似乎没有帮助。
我是使用XNA的新手。有没有人有任何教程或可以帮助如何计算运动?提前谢谢。
答案 0 :(得分:8)
如果您只是检查IsKeyDown
每一帧,它会说明每个帧都按下了它。按每秒60帧,按一个键将导致它处于几个帧的向下状态。因此,在每一帧你都在移动你的角色!当你放开钥匙的时候 - 他会搬几个方格。
如果你想检测每个按键(键进入“向下”状态),你需要这样的东西:
KeyboardState keyboardState, lastKeyboardState;
bool KeyPressed(Keys key)
{
return keyboardState.IsKeyDown(key) && lastKeyboardState.IsKeyUp(key);
}
override void Update(GameTime gameTime)
{
lastKeyboardState = keyboardState;
keyboardState = Keyboard.GetState();
if(KeyPressed(Keys.Right)) { /* do stuff... */ }
}
但是如果你想在按住键时添加“重复”效果(就像输入中发生的那样),你需要计算时间 - 就像这样:
float keyRepeatTime;
const float keyRepeatDelay = 0.5f; // repeat rate
override void Update(GameTime gameTime)
{
lastKeyboardState = keyboardState;
keyboardState = Keyboard.GetState();
float seconds = (float)gameTime.ElapsedGameTime.TotalSeconds;
if(keyboardState.IsKeyDown(Keys.Right))
{
if(lastKeyboardState.IsKeyUp(Keys.Right) || keyRepeatTime < 0)
{
keyRepeatTime = keyRepeatDelay;
// do stuff...
}
else
keyRepeatTime -= seconds;
}
}
答案 1 :(得分:0)
使用IsKeyDown时,您不必使用计时器。
public void HandleInput(KeyboardState keyState)
{
if (keyState.IsKeyDown(Keys.Left))
{
//go left...
}
}