方法: XNA Framework アプリケーションに競合検出機能を追加する

2012/02/09

このトピックでは、この XNA Framework アプリケーションで画面内を移動する正方形のグラフィック オブジェクトをユーザーがタップしたことを検出する方法を示します。前のトピックでは、基本的なゲームのインフラストラクチャを作成しました。ここでは、このロジックを拡張して、画面をユーザーがタップしたときに正方形のグラフィック オブジェクトにヒット (衝突) したことを検出する機能を追加します。この機能が整ったら、ヒット数を現在の得点として記録できるようになります。このシリーズの以降のトピックでは、このロジックを拡張して、レベルとスコアボードを追加し、現在の得点とレベルを表示します。このシリーズは、アプリケーションに試用エクスペリエンスを実装する機能を追加することによって完了します。

この手順に進むには、まず次のトピックの手順を完了する必要があります。

注注:

次の手順は、Visual Studio 2010 Express for Windows Phone 向けです。 Visual Studio 2010 Professional や Visual Studio 2010 Ultimate のアドインを使用している場合は、メニュー コマンドやウィンドウのレイアウトが多少異なる場合があります。

前のトピック「方法: XNA Framework アプリケーションを作成する」で説明したゲームでは、グラフィック オブジェクトが画面内を一定速度でバウンドします。ゲームをおもしろくするために、画面内をバウンドするグラフィック オブジェクトをプレーヤーがタップした回数を追跡する機能を追加します。

プレーヤーによるグラフィック オブジェクトのタップを検出するには

  1. Game1 コンストラクターで、次のコード行を追加します。これにより、タップ ジェスチャがこのアプリケーションの有効なジェスチャとなります。タップ ジェスチャは、ユーザーが画面の単一ポイントに軽く触れると発生します。

    
       TouchPanel.EnabledGestures = GestureType.Tap;
    
    
  2. Game1 クラス内の Update メソッドで、UpdateSprite の呼び出しの前に次のコードを追加します。タッチ パネルで複数のジェスチャをいつでも登録できるため、while ループ内で TouchPanel.IsGestureAvailable を呼び出します。各ジェスチャが読み取られ、そのジェスチャが GestureType.Tap である場合は CheckForTouchCollision が呼び出されて、タップが記録された画面上の位置を渡します。CheckForTouchCollision は、次の手順で実装します。

    
                   while (TouchPanel.IsGestureAvailable)
                    {
                        GestureSample gs = TouchPanel.ReadGesture();
                        if (gs.GestureType == GestureType.Tap)
                        {
                            CheckForTouchCollision(gs.Position);
                        }
                    }
    
    
    
  3. Game1.cs で、次のコードを追加します。このコードは、グラフィック オブジェクト用とジェスチャ用に 2 つの境界ボックス (四角形) を定義します。このコードは、BoundingBoxIntersects メソッドを使用して、2 つのボックスが重なるかどうかを判断します。このメソッドは、衝突が検出された場合に true を返します。これは、ジェスチャがグラフィック オブジェクトにヒットしたことを意味します。この場合は、衝突回数が増分されます。最後に、衝突のターゲット回数に達したがどうかを確認するためのチェックが行われます。ターゲット回数に達すると、ゲームは次のレベルに移行します。このシリーズの次のトピックでは、この GoToNextLevel メソッドを実装します。

    
            // Number of collisions recorded in this round
            int collisionCount = 0;
    
            // The target number of collisions to detect to complete a level
            const int COLLISION_TARGET = 5;
    
            // A tolerance for the position of the tap gesture, to more accurately detect if 
            // the tap overlapped with the graphic object
            const float TAP_TOLERANCE = 20.0f;
    
            void CheckForTouchCollision(Vector2 position)
            {
                BoundingBox bb1 = new BoundingBox(new Vector3(spritePosition.X - (sprite1Width / 2), spritePosition.Y - (sprite1Height / 2), 0), 
                                                  new Vector3(spritePosition.X + (sprite1Width / 2), spritePosition.Y + (sprite1Height / 2), 0));
                BoundingBox bbG = new BoundingBox(new Vector3(position.X - TAP_TOLERANCE, position.Y - TAP_TOLERANCE, 0), 
                                                  new Vector3(position.X - TAP_TOLERANCE, position.Y + TAP_TOLERANCE, 0));
                           
                if (bb1.Intersects(bbG))
                {
                    // Update collision count and scoreboard
                    collisionCount++;
    
                    // Has the level been completed?
                    if (collisionCount == COLLISION_TARGET)
                    {
                        // Level Complete
                           GoToNextLevel();
    
                    }
                }
    
            }
    
    
    

このシリーズの次のトピックでは、アプリケーションにレベルを追加する方法を示します。これで、画面内を移動する正方形で構成された単純なゲームが作成され、正方形をユーザーがタップしたことを検出し、得点として記録できるようになりました。試用エクスペリエンスをデモンストレーションするには、ゲームに複数のレベルを設定することをお勧めします。次に、試用エクスペリエンス (以降のトピックで説明します) によって、ゲームのライセンス (試用またはフル) に基づいてユーザーがプレイできるレベル数を制限できます。レベルの実装では、各レベルで正方形が画面内を移動する速度を定義します。画面内をバウンドする正方形の動きは、レベルごとに速くなります。

方法: XNA Framework アプリケーションにレベルを追加する

表示: