我正在XNA中编写一个简单的游戏,您可以使用WSAD移动精灵。问题是如果同时按下两个相同方向的键,则移动取消并且角色不移动。是否可以手动设置要释放的密钥以避免这种情况?以下是关键的移动代码:
if (newKeyState.IsKeyDown(Keys.W))
{
position.Y -= vel;
}
if (newKeyState.IsKeyDown(Keys.S))
{
position.Y += vel;
}
if (newKeyState.IsKeyDown(Keys.A))
{
position.X -= vel;
}
if (newKeyState.IsKeyDown(Keys.D))
{
position.X += vel;
}
答案 0 :(得分:1)
是否可以手动设置要释放的密钥以避免这种情况?
不。但是,您可以将其更改为else-if。在这种情况下,W&& S被按下然后只有W计数。您可以通过更改首先检查的键来更改此设置。
if (newKeyState.IsKeyDown(Keys.W)) {
position.Y -= vel;
} else if (newKeyState.IsKeyDown(Keys.S)) {
position.Y += vel;
} else if (newKeyState.IsKeyDown(Keys.A)) {
position.X -= vel;
} else if (newKeyState.IsKeyDown(Keys.D)) {
position.X += vel;
}
如果您只想在每个轴上移动一个方向。
if (newKeyState.IsKeyDown(Keys.W)) {
position.Y -= vel;
} else if (newKeyState.IsKeyDown(Keys.S)) {
position.Y += vel;
}
if (newKeyState.IsKeyDown(Keys.A)) {
position.X -= vel;
} else if (newKeyState.IsKeyDown(Keys.D)) {
position.X += vel;
}
答案 1 :(得分:1)
键状态(上面代码中的newKeyState
)表示键盘的实际物理状态,因此当用户仍然按住键时,设置键的状态既不可能也不可取。但是,有一些替代方案可以让您达到预期的最终结果:
1)您可以重新构建代码,例如
if(newKeyState.IsKeyDown(Keys.W))
{
position.Y -= vel;
}
else if(newKeyState.IsKeyDown(Keys.S))
{
position.Y += vel;
}
// etc.
2)您可以维护自己的状态(即newKeyState
的缓存版本)并设置要在其中释放的密钥。