2

私は今このような関数を持っています:

public static bool IsKeyDownWithDelayPassed(Keys key, int delay)
{
    bool timeElapsed = stopWatch.ElapsedMilliseconds > delay;

    bool isKeyDown = currentKeyboardState.IsKeyDown(key);

    if (timeElapsed && isKeyDown)
    {
        stopWatch.Restart();
    }

    return timeElapsed && isKeyDown;
}

これは完全に機能しますが、一度に1つのキーでのみ機能します。たとえば、矢印キーを使用して斜めに移動したい場合(右矢印キーと下矢印キーを同時に押したまま)、機能しません。

DictionaryesにマッピングされKeysたソリューションを考えましたStopwatchが、それは少し複雑すぎるように見えました。このタスクを簡素化できるものがありませんか?

ありがとう。

4

1 に答える 1

1

これを使って:

Dictionary<Keys, DateTime> keytimes = new Dictionary<Keys, DateTime>();

public bool IsKeyDownWithDelayPassed(Keys key, long delay)
{
    if(!keytimes.Keys.Contains(key) || keytimes[key] == DateTime.MinValue)
        return false;
    long elapsed = DateTime.Now.Ticks - keytimes[key].Ticks;    
    return delay < elapsed;
}

private void KeyDownEvent(object sender, KeyEventArgs e)
{
    keytimes[e.KeyData] = DateTime.Now;
}

private void KeyUpEvent(object sender, KeyEventArgs e)
{
    keytimes[e.KeyData] = DateTime.MinValue;
}
于 2012-10-21T20:47:06.143 に答える