我在Monogame程序中创建自己的输入系统,现在 我在这里的if语句有问题:
public static void Input()
{
if (IsKeyPressed(Keys.Space))
{
Cursor.X += 25;
}
if (IsKeyPressed(Keys.Back))
{
Words.Last().RemoveLetter();
Cursor.X -= 25;
}
if (IsKeyPressed(Keys.A))
{
Words.Last().AddLetter(new Letter(Letters.A, Cursor));
Cursor.X += 25;
}
}
static bool IsKeyPressed(Keys key)
{
keyState = Keyboard.GetState();
if (keyState.IsKeyDown(key) && prevKeyState.IsKeyUp(key))
{
prevKeyState = keyState;
return true;
}
else
{
prevKeyState = keyState;
return false;
}
}
好的,在我的方法中输入I检查按键,程序中的结果是我在第一个IF语句中放入的任何键,该键都可以工作,所以如果我改变'A'现在是'Space', A会工作而Space不会......
为什么其他ifs总是假的?
修改
好的,实际上,如果我的IsKeyPressed()方法看起来像这样(没有prevKeyState变量):
static bool IsKeyPressed(Keys key)
{
keyState = Keyboard.GetState();
if (keyState.IsKeyDown(key))
{
return true;
}
else
{
return false;
}
}
然后它可以工作:/但是我需要那个preKeyState变量,因为我想,无论我持有多长时间,只需打印一个字母a,直到我释放该键:/
答案 0 :(得分:0)
有类似的问题。通过将新旧KeyboardState传递给函数解决了这个问题。结束这样的工作正常。
public void HandleKeyStroke(KeyboardState ks, KeyboardState oldks)
{
if (ks.IsKeyDown(GameplayButtons.ACTIONBAR_0) && oldks.IsKeyUp(GameplayButtons.ACTIONBAR_0))
UIManager.actionToBeTriggered("actionbar_0");
if (ks.IsKeyDown(GameplayButtons.ACTIONBAR_1) && oldks.IsKeyUp(GameplayButtons.ACTIONBAR_1))
UIManager.actionToBeTriggered("actionbar_1");
if (ks.IsKeyDown(GameplayButtons.ACTIONBAR_2) && oldks.IsKeyUp(GameplayButtons.ACTIONBAR_2))
UIManager.actionToBeTriggered("actionbar_2");
if (ks.IsKeyDown(GameplayButtons.ACTIONBAR_3) && oldks.IsKeyUp(GameplayButtons.ACTIONBAR_3))
UIManager.actionToBeTriggered("actionbar_3");
if (ks.IsKeyDown(GameplayButtons.CHARACTER) && oldks.IsKeyUp(GameplayButtons.CHARACTER))
UIManager.ToggleWindowById("button_Character");
}
可能有一些更清洁的解决方案,特别是如果你有更多按钮需要处理。
答案 1 :(得分:0)
好的,所以解决这个问题并不难,我只是没想到,但是 使用Input方法而不是IsKeyPressed bool方法修改KeyboardStates修复了所有内容:
static bool IsKeyPressed(Keys key)
{
if (keyState.IsKeyDown(key) && prevKeyState.IsKeyUp(key))
{
return true;
}
else
{
return false;
}
}
public static void Input()
{
keyState = Keyboard.GetState();
if (IsKeyPressed(Keys.Space))
{
Cursor.X += 25;
}
else if (IsKeyPressed(Keys.Back))
{
Words.Last().RemoveLetter();
Cursor.X -= 25;
}
else if (IsKeyPressed(Keys.A))
{
Words.Last().AddLetter(new Letter(Letters.A, Cursor));
Cursor.X += 25;
}
prevKeyState = keyState;
}
我不确定它有什么不同,如果有人可以详细解释那会很棒
PS。由于声誉不佳,我无法支持任何人,但感谢大家分享你的想法,这很有帮助