キーを押したままにすると、キーボードコントローラーがキーを繰り返すことに依存しています。別のキーを押すと、それは機能しなくなります。これには別のアプローチが必要です。
まず、NotMoving、MovingLeft、MovingRightなどの値で宇宙船のモーション状態を示す列挙型が必要です。そのタイプの変数をクラスに追加します。KeyDownイベントとKeyUpイベントの両方が必要になります。たとえば、Keys.LeftのKeyDownを取得したら、変数をMovingLeftに設定します。Keys.LeftのKeyUpイベントを取得したら、最初に状態変数がまだMovingLeftであるかどうかを確認し、残っている場合はNotMovingに変更します。
ゲームループで、変数値を使用して宇宙船を移動します。いくつかのサンプルコード:
private enum ShipMotionState { NotMoving, MovingLeft, MovingRight };
private ShipMotionState shipMotion = ShipMotionState.NotMoving;
protected override void OnKeyDown(KeyEventArgs e) {
if (e.KeyData == Keys.Left) shipMotion = ShipMotionState.MovingLeft;
if (e.KeyData == Keys.Right) shipMotion = ShipMotionState.MovingRight;
base.OnKeyDown(e);
}
protected override void OnKeyUp(KeyEventArgs e) {
if ((e.KeyData == Keys.Left && shipMotion == ShipMotionState.MovingLeft) ||
(e.KeyData == Keys.Right && shipMotion == ShipMotionState.MovingRight) {
shipMotion = ShipMotionState.NotMoving;
}
base.OnKeyUp(e);
}
private void GameLoop_Tick(object sender, EventArgs e) {
if (shipMotion == ShipMotionState.MovingLeft) spaceShip.MoveLeft();
if (shipMotion == ShipMotionState.MovingRight) spaceShip.MoveRight();
// etc..
}