1

300x300 のウィンドウ内に 800x600 のキャンバスがあります。特定のキーを押すと、キャンバスがその方向に移動するようにします。
ウィンドウのコードビハインド内でこれを行いました:

protected override void OnKeyDown(KeyEventArgs e)
{
    base.OnKeyDown(e);
    キー keyPressed = e.Key;

    if (keyPressed == Key.W)
    {
        gcY += 5;
    }
    if (keyPressed == Key.S)
    {
        gcY -= 5;
    }
    if (keyPressed == Key.A)
    {
        gcX += 5;
    }
    if (keyPressed == Key.D)
    {
        gcX -= 5;
    }

    gameCanvas.RenderTransform = new TranslateTransform(gcX, gcY);
}

動作はしますが、動きがガクガクします。たとえば、キーを押したままにすると、W移動する前に一瞬停止します。
動きをよりスムーズにし、キーを押したときの一時停止をなくす方法はありますか?
ありがとう。

4

2 に答える 2

3

現在、セットアップはスパムのキー入力を受け入れています(キーを押したままにします)。イベントベースの入力を使用するほとんどのゲームで私が見た方法は、ブール配列を使用してkeydown[256]、キーボードをマッピングすることです(インデックスがキー値です)。すべての値がに初期化されfalseます。

キーが押されたらtrue、keydownメソッドで適切なインデックスを設定し、ゲーム/レンダリングループgameCanvas.RenderTransform = new TranslateTransform(gcX, gcY);で、配列内のキーに応じて呼び出しますtrue。キー値falseは、keyreleaseイベントメソッドでキーが解放されたときに設定します(C#で何であるかはわかりません)。

これにより、スムーズなスクロールが可能になり、起動が遅れることはありません。

于 2009-01-06T00:15:34.747 に答える
1

はい、計算に時間を組み込むことができます。現在、イベントが発生するたびに 5 を加算/減算しますが、これは実際には予測できません。

動きを滑らかにするために、DateTime を使用して、1 秒間に X 回を超える頻度で発火しないようにします。

お気に入り:

private static DateTime nextUpdate

if (nextUpdate <= DateTime.Now)
{
//Move
nextUpdate = DateTime.Now.AddMilliseconds(100);
}

私は現在VSを持っていないので、構文については完全にはわかりませんが、アイデアはわかります.

于 2008-11-03T23:12:49.460 に答える