あなたは、あなたがそれを押したときにキーを繰り返しキーボードコントローラに依存しています。別のキーを押すと、動作が停止します。これには異なるアプローチが必要です。
まず、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..
}
必要でない限り、WinFormsではなくゲームやグラフィックス重視のアプリケーションを作成するには、XNA、DirectX、または代替方法を使用する必要があります。彼らはあまりにもダイナミックに作られていないし、あなたの途中で多くの壁を打つでしょう。例えば、XNAはIsKeyDownのようなメソッドを持つKeyboardクラスを持っているので、時間を大幅に節約することができます。 –
私はより快適に感じるとき、将来私はXNAに移動するリプレイmybeeをありがとう。 – samy