2

私はWPFでテトリスクローンを書いています。右矢印キーを押したままにすると、現在のピースが右にシフトします。プレイアビリティのために、ユーザーが最初に右矢印キーを離さなくても、別のキー(つまり、Fキー)を押して可動ピースを回転できるようにしたいです。現在、これを行うと、ピースのシフトが停止します。

これに対する私の最初の基本的な試みは、フックすることでした

Window_PreviewKeyDown(object sender, KeyEventArgs e)

次に、コントローラー層にメッセージを送信します。

これを可能にするために入力リスニングコードをどのように構成しますか?

私の現在のコードはこちら

4

4 に答える 4

3

ピースを動かし続けるために、キーの自動繰り返しに依存しています。これは適切ではありません。ユーザーのキーボードの繰り返し遅延は可変であり、ゲームのプレイアビリティに影響します。お気づきのとおり、別のキーを押すと自動繰り返しが停止します。

各ゲームオブジェクトをモーションステータスとして指定することで、これを修正します。KeyDownイベントを使用して変更します。そして、モーションステータス値がまだキーと一致する場合は、KeyUpイベントをリセットします。ゲームループで、モーションステータスに基づいてゲームオブジェクトの位置を更新します。タイマーによってトリガーされる固定レートでこれを行います。

モーションステータスも「落下」を示している必要があります。タイマーレートを下げることで、レベルが進むにつれてゲームをより難しくすることができるようになりました。破片はより速く落下します。また、キーボードの応答性が向上し、ユーザーはレベルを獲得することができます。

于 2010-04-06T15:39:11.183 に答える
2

KeyUpイベントも存在する必要があり、KeyDownとKeyUpの両方を使用することで、探している効果を実現できます。それはいくつかの方法で行うことができます。

1つは、KeyDownイベントに繰り返しアクションを開始させ、KeyUpにそれをキャンセルさせることです。

もう1つは、特定のキーが押されているかどうかを保存することです。キーのリストを保持し、KeyDown時にオンに切り替え、KeyUpにオフに切り替えます。ゲームのメインループでは、現在ダウンしているすべてのキーに対応するイベントを発生させます。

例:

bool[] heldDown = new bool[256]; // One index for the keycode of each key

void Window_PreviewKeyDown(object sender, KeyEventArgs e) {
    heldDown[e.KeyCode] = true;
}    
void Window_PreviewKeyUp(object sender, KeyEventArgs e) {
    heldDown[e.KeyCode] = false;
}    

次に、メインループで「heldDown」を実行し、押し下げられているすべての意味のあるキーに対してイベントを発生させます。

if (heldDown[Key.F])
    MainController.TriggerPieceEvent(Constants.PieceEvents.RotateClockwise);
if (heldDown[Key.Left])
    MainController.TriggerPieceEvent(Constants.PieceEvents.ShiftLeft);
// etc...
于 2010-04-06T15:24:33.673 に答える
1

Windowsは、最後に押したキーのイベントのみを繰り返します。さらに、キーが最初に繰り返されるまでの遅延、および繰り返される速度は、ゲームではなくタイピング用に通常最適化されている設定によって異なります。したがって、ゲームの場合、それらを完全に無視し、「繰り返される」キーを実装する独自の方法を用意するのが最善です。

基本的に、関心のあるキーの状態(押された状態または解放された状態)を保持し、KeyDownまたはKeyUpイベントを受信したときにそれらを変更する必要があります。次に、ある種のタイマーで、その時点でダウンしているすべてのキーの状態と起動イベントを確認する必要があります。そのタイマーがコントローラーレイヤーまたはUIで発生するかどうかは、アーキテクチャによって異なります:-)

左右のキーが両方とも下がっているときのように、両方を無視するようにチェックを追加することができます。そうしないと、ピースが左右に繰り返しジャンプします。

于 2010-04-06T15:21:58.507 に答える
1

状態が必要です。'RightArrowPressed'や'RotateButtonPressed'などの変数を作成します

Key_Downで、キーが押されていることを確認します。押されている場合は、対応する変数をtrueに設定します。

key_upで同じことを行いますが、falseに設定します。

これで、いつでも2つの変数を調べて、どちらのキーが押されているかを確認できます。

于 2010-04-06T15:24:43.927 に答える