XNAを使用したシンプルな3Dゲームの作成/コントロールの追加

出典: フリー教科書『ウィキブックス(Wikibooks)』

キーボード入力の受け取り[編集]

ゲームへの入力を処理するために、キーボードからの入力を受け取れるようにし、その後これを使用して魚に地形を動きまわらせて、ゲームを脱出させます。

始めはGame1ファイルに 'HandleInput' という名前の新しいメソッドを作成し、新しい keystate変数を作成します。 このメソッドが呼び出されると、キーボードの現在の状態が keystate変数の一部として格納され、ゲームロジックによってアクセスできるようになります。

//Handles input
private void HandleInput(GameTime gameTime)
{
    KeyboardState currentKeyboardState = Keyboard.GetState();
}

次に以下の条件式を追加します。

// Check for exit.
if (currentKeyboardState.IsKeyDown(Keys.Escape))
{
    Exit();
}

このプロセスがどのように機能するか説明するには、これが最も簡単な方法で、条件式の一部として構築することで、キーの位置を監視することができます。 'gameTime'変数を引数 (後で使用します )として使用して、このメソッドへの呼び出しをupdateコードに配置し​​ます。 このコードがあると、エスケープコードをプッシュすることで、いつでもコードを終了することができます。

次に、矢印キーを使用するために、同様の条件式を配置していきます。 あなたの 'HandleInput'メソッドに次の行を追加しましょう。

//Move the fish with the arrow keys
float speed = 0.02f; //Dictates the speed
if (currentKeyboardState.IsKeyDown(Keys.Left))
{
    FishMen.Translation.Y -= speed * (float)gameTime.ElapsedGameTime.TotalMilliseconds;
}
if (currentKeyboardState.IsKeyDown(Keys.Right))
{
    FishMen.Translation.Y += speed * (float)gameTime.ElapsedGameTime.TotalMilliseconds;
}
if (currentKeyboardState.IsKeyDown(Keys.Up))
{
    FishMen.Translation.X += speed * (float)gameTime.ElapsedGameTime.TotalMilliseconds;
}
if (currentKeyboardState.IsKeyDown(Keys.Down))
{
    FishMen.Translation.X -= speed * (float)gameTime.ElapsedGameTime.TotalMilliseconds;
}

効果がより見えやすくなるように、Updateメソッドの次の行を変更しましょう。

cameraPosition = cameraTarget = FishMen.Translation;
cameraPosition.Z += 20.0f;

to

cameraPosition = cameraTarget = FishMen.Translation / 2;
cameraPosition.Z -= 20.0f;

そしてコードを実行しましょう。 こうすると、魚が動き回るときに、肩越しの視野になります。 使用する 'ElapsedGameTime' 変数の裏側にあるロジックは、updateメソッドの呼び出しの間の時間差を監視して、フレーム間の処理時間のあらゆる変化を補償します。 このときにそれがない場合、コンピュータが高速なほど、コントロールが不安定になったり速くなったりしてしまいます。 というわけで、それはコンピュータ間で一貫している必要があります。 コー​​ドを実行して、矢印キーを押すと、動きまわるところが表示されるはずです。

最後に、魚の境界域を規定するために、 'boundarys'という名前の 'Vector2'変数を新しく作成して、2次元空間での魚の最大位置を規定します。 次のように矢印のハンドラのコードを変更します。

//Move the fish with the arrow keys
float speed = 0.02f; //Dictates the speed
Vector2 boundarys = new Vector2(14f);

if (currentKeyboardState.IsKeyDown(Keys.Left) && FishMen.Translation.Y > -boundarys.Y)
{
    FishMen.Translation.Y -= speed * (float)gameTime.ElapsedGameTime.TotalMilliseconds;
}
if (currentKeyboardState.IsKeyDown(Keys.Right) && FishMen.Translation.Y < boundarys.Y)
{
    FishMen.Translation.Y += speed * (float)gameTime.ElapsedGameTime.TotalMilliseconds;
}
if (currentKeyboardState.IsKeyDown(Keys.Up) && FishMen.Translation.X < boundarys.X)
{
    FishMen.Translation.X += speed * (float)gameTime.ElapsedGameTime.TotalMilliseconds;
}
if (currentKeyboardState.IsKeyDown(Keys.Down) && FishMen.Translation.X > -boundarys.X)
{
    FishMen.Translation.X -= speed * (float)gameTime.ElapsedGameTime.TotalMilliseconds;
}

こうすることでゲームは、魚が特定の位置まで移動すると停止するようになっているはずです。 'boundary' と 'speed' の変数をみながら、動きを調整して、自由に味見してみましょう。