我正在尝试用XNA制作一个基于2D瓦片的自上而下的游戏。它是16x16瓦片,每个瓦片是25像素。
我有一个从(0,0)第一个磁贴开始的字符子画面,我正试着用键盘将它从磁贴移动到磁贴。因此,在Update方法中,当按下箭头键时,我尝试向x或y添加或减去25的位置向量。它在移动时似乎是在瓷砖上对齐的,但它移动的是4-5个瓷砖,而不是一次只移动一个瓷砖。我尝试过将其与gameTime.TotalGameTime.TotalSeconds相乘,但似乎无济于事。
我对使用XNA还是个新手。有没有人有任何教程或可以帮助如何计算运动?提前谢谢。
发布于 2011-03-06 22:16:29
如果你只是检查每一帧的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;
}
}发布于 2011-11-18 16:17:12
当您使用IsKeyDown时,您不必使用计时器。
public void HandleInput(KeyboardState keyState)
{
if (keyState.IsKeyDown(Keys.Left))
{
//go left...
}
}https://stackoverflow.com/questions/5206132
复制相似问题