方法: XNA Framework アプリケーションに試用エクスペリエンスを追加する

2012/02/09

このトピックでは、XNA Framework アプリケーションに試用エクスペリエンスを実装する方法について説明します。このシリーズで作成するゲームには、試用エクスペリエンスを効果的に示すために必要なすべての機能が含まれています。ゲームのインフラストラクチャは整っています。画面内をバウンドする正方形のグラフィック オブジェクトをユーザーがタップしたことを検出する衝突検出機能を追加しました。ゲームに複数のレベルを追加し、現在の得点とレベを表示するスコアボードを追加しました。最後の手順では、試用エクスペリエンスを追加します。このトピックで実装する試用エクスペリエンスでは、現在のライセンスが試用ライセンスの場合にユーザーがプレイできるレベル数を制限します。アプリケーションの実行モードの決定は、Guide.IsTrialMode プロパティを使用して行います。

この手順の続きを行う前に、以下のトピックを完了してください。

  1. 方法: XNA Framework アプリケーションを作成する

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

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

  4. 方法: XNA Framework アプリケーションのスコアボードを表示する

注注:

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

この例では、レベルベースの試用の制限を使用します。つまり、プレーヤーがプレイできるレベル数は、ゲームが試用ライセンスであるかフル ライセンスであるかによって異なります。ライセンスの種類をチェックするには、Guide クラスの Guide.IsTrialMode プロパティを使用します。

ゲームに試用エクスペリエンスを追加するには

  1. このセクションでは、ユーザーにアプリケーションの購入を案内します。ユーザーへの案内を行う間、ゲームを一時停止することをお勧めします。Game1 クラスで、次のコードを追加します。これらのメソッドは、ゲームが一時停止されているかどうかを示すフラグを設定します。このフラグは、次の手順で説明する Update メソッドで使用されます。

    
            private bool paused = false;
            private bool pausedForGuide = false;
    
            private void BeginPause(bool UserInitiated)
            {
                paused = true;
                pausedForGuide = !UserInitiated;
            }
    
            private void EndPause()
            {
                pausedForGuide = false;
                paused = false;
            }
    
    
  2. Game1.cs 内の Update メソッドで、ゲームが一時停止されているかどうかを確認するためにチェックが行われます。ここで、前の手順で定義した paused フラグが使用されます。Game1.cs メソッド内の Update を次のコードに置き換えます。

    
            /// <summary>
            /// Allows the game to run logic such as updating the world,
            /// checking for collisions, gathering input, and playing audio.
            /// </summary>
            /// <param name="gameTime">Provides a snapshot of timing values.</param>
            protected override void Update(GameTime gameTime)
            {
                // Allow the game to exit.
                if (GamePad.GetState(PlayerIndex.One).Buttons.Back ==
                    ButtonState.Pressed)
                    this.Exit();
    
                // If the game is paused, there is no need to update the game.
                if (!paused)
                {
                    while (TouchPanel.IsGestureAvailable)
                    {
                        GestureSample gs = TouchPanel.ReadGesture();
                        if (gs.GestureType == GestureType.Tap)
                        {
                            CheckForTouchCollision(gs.Position);
                        }
                    }
    
                    // Move the sprite around.
                    UpdateSprite(gameTime, ref spritePosition, ref spriteSpeed);
                    base.Update(gameTime);
                }
            }
    
    

    上記のコードに示されるように、ジェスチャのチェックおよび Update コマンドは paused フラグのチェックにラップされています。ゲームが一時停止される場合は、ゲームが引き続き更新されないようにします。

  3. Game1 クラス内の GoToNextLevel メソッドのコードを次のコードに置き換えます。

    
            private void GoToNextLevel()
            {
                // Are all levels completed?
                if (currentLevel == levels.Count)
                {
                    // The game is over.
                    // In this example, we just let the user continue to replay the last level.
                    ResetGameCounters();
                }
                else
                {
                    if (Guide.IsTrialMode)
                    {
                        // Pause the game while the user is prompted.
                        BeginPause(false);
    
                        // MessageBox will have "OK" and "Cancel" buttons.
                        List<String> mbList = new List<string>();
                        mbList.Add("OK");
                        mbList.Add("Cancel");
                            
                        // BeginShowMessageBox is asynchronous. We define the method PromptPurchase as the callback.
                        Guide.BeginShowMessageBox("Level 1 Complete", "Click OK to buy the game.", mbList, 0, 
                                                    MessageBoxIcon.None, PromptPurchase, null);
                    }
                    else
                    {
                        // A Full license was found, so move to the next level
                        currentLevel++;
                        spriteSpeed = levels[currentLevel - 1];
                        ResetGameCounters();
                        
                    }
                }
            }
    
    
    

    上記のコードは次の処理を行います。

    • 最初に、ユーザーがゲームのすべてのレベルを完了したかどうかを確認するためにチェックを行います。ゲームのすべてのレベルが完了すると、ゲーム カウンターがリセットされ、ユーザーは引き続き最後のレベルをプレイできます。この例では、ゲーム終了エクスペリエンスは定義されていません。

    • ユーザーがプレイするレベルがまだある場合は、Guide.IsTrialMode の呼び出しが行われて、現在のライセンスの種類が判断されます。ゲームがフル ライセンスの場合、else コード パスが走査され、ゲームは次のレベルに移行します。

    • ゲームで試用ライセンスが実行されている場合、ユーザーはゲームの購入を案内されます。そのためには、前に追加した BeginPause メソッドを使用して、まずゲームが一時停止されます。次に、[OK] と [Cancel] という 2 つのボタンを持つメッセージ ボックスが構築されます。Guide.BeginShowMessageBox メソッドが呼び出され、次のセクションで定義する PromptPurchase メソッドが渡されます。BeginShowMessageBox は非同期であるため、ユーザーから応答を受け取るまでゲームを一時停止することをお勧めします。PromptPurcahse は、BeginShowMessage のコールバック メソッドです。このメソッドは、BeginShowMessageBox の呼び出しが完了する (つまり、ユーザーが画面で MessageBox を閉じる) と呼び出されます。

  4. Game1 クラスで、次のメソッドを追加します。このメソッドは、前の手順で説明した Guide.BeginShowMessageBox の呼び出しからのコールバックです。ここで MessageBox 操作が完了し、結果に値が含まれるかどうかがチェックされます。結果に値が含まれる場合、この値はユーザーが押したボタンのインデックスと等しくなります。この例のメッセージ ボックスには 2 つのボタンがあるため、結果に使用できる値は 0 (OK) と 1 (Cancel) になります。ユーザーが [OK] をクリックした場合、ゲームをはじめさまざまな商品を購入できるゲームの Marketplace ページに移動します。ユーザーがメッセージ ボックスで [Cancel] をクリックした場合、ゲーム カウンターがリセットされ、ユーザーは引き続きゲームの最初のレベルをプレイできます。

    注注:

    Windows Phone Marketplace にまだ公開されていないアプリケーションでメソッド Guide.ShowMarketplace が呼び出されると、エラーが表示されます。このエラーのエラー コードが 805a0194 である場合、呼び出しは正常に行われており、アプリケーションが公開されると正しく動作します。アプリケーションが公開されると、Guide.ShowMarketplace はアプリケーションの一意の ID を自動的に検出し、Windows Phone Marketplace クライアント アプリケーションの正しい詳細ページを起動します。

    
            private void PromptPurchase(IAsyncResult ar)
            {
                // Complete the ShowMessageBox operation and get the index of the button that was clicked.
                int? result = Guide.EndShowMessageBox(ar);
    
                // Clicked "OK", so bring the user to the application's Marketplace page to buy the application.
                if (result.HasValue && result == 0)
                {
                    Guide.ShowMarketplace(PlayerIndex.One);
                }
                else
                {
                    // User did not want to go to the Marketplace to buy the application.
                    // Stay at level one.
                    ResetGameCounters();
                }
    
                // Resume the game if it had been paused.
                if (paused || pausedForGuide)
                    EndPause();
            }
    
    
    

前のセクションでは、ゲームのライセンスをチェックして、ゲームを試用として制限するか、またはユーザーにフル エクスペリエンスを提供するかを判断しました。現在のゲームのライセンスをチェックするには、Guide.IsTrialMode が使用されます。ゲームはまだ公開されていないため、ゲームに関連付けられているライセンスがなく、Guide.IsTrialMode の呼び出しは常に false を返します。アプリケーションを公開する前に試用モードをテストするには、試用モードをシミュレートする必要があります。このために Guide クラスにはプロパティ SimulateTrialMode が含まれており、その使用方法について次の手順で説明します。

ゲームの試用モードをシミュレートするには

  • Game1.cs 内の Game1 コンストラクターで、次のコード行を追加します。SimulateTrialMode プロパティが true に設定されると、Guide.IsTrialMode の呼び出しは常に true を返します。この方法により、ゲームの試用モード機能をテストすることができます。次のコード行は、DEBUG 条件付きコンパイル ディレクティブにラップされています。つまり、このコードは、プロジェクトがビルドされてデバッグ モードで実行される際にのみコンパイルされます。これは、このテスト機能が Windows Phone Marketplace に公開されないようにするための安全策です。

    
    #if DEBUG
                Guide.SimulateTrialMode = true;
    #endif
    
    

ゲームの試用エクスペリエンスをテストするには

  1. [デバッグ]、[デバッグ開始] の順にメニュー コマンドを選択してアプリケーションを実行します。これによってエミュレーター ウィンドウが開き、アプリケーションが起動します。グラフィックが画面内を飛び跳ねているのが表示されます。

  2. ゲームをエミュレーターで実行している場合は、画面内をバウンドするグラフィックをマウスの左ボタンでクリックします。ゲームを実際の電話デバイスで実行している場合は、画面内をバウンドする正方形のグラフィックを指でタップします。グラフィックに触れることに成功するたびに画面の Score フィールドが増分されることを確認します。

  3. 5 ヒットの得点を得るまでグラフィックのタップを続けます。これは、ゲームの各ラウンドに対してハードコーディングされた衝突数です。

  4. これでレベル 1 が完了し、ゲームの購入を求めるメッセージが表示されます。[OK] をクリックします。

  5. 少し遅れて、MARKETPLACE ERROR という新しい画面が表示されます。このページに表示されるエラー コードが 805a0194 である場合は、ゲームで Windows Phone Marketplace クライアント アプリケーションが正常に起動しています。公開されているアプリケーションでは、この画面はゲームの実際の Windows Phone Marketplace ページに置き換えられます。次の画像は、受信するエラー ページを示しています。

    MarketplaceDetailTask.Show() エラー
  6. このページの [閉じる] をクリックします。ゲームがレベル 1 で再開され、試用モードのままになっています。

  7. ゲームをフル ライセンス シミュレーションでテストするには、さまざまなオプションがあります。たとえば、次のオプションがあります。

    • [デバッグ] メニューの [デバッグなしで開始] をクリックしてアプリケーションを実行します。これにより、ゲームがリリース構成でコンパイルされ、Guide.IsTrialfalse を返します。これによってエミュレーター ウィンドウが開き、アプリケーションが起動します。グラフィックが画面内を飛び跳ねているのが表示されます。

    • 一時的に Guide.SimulateTrialMode = false を変更し、[デバッグ] メニューの [デバッグ開始] をクリックしてアプリケーションを実行します。これにより、上記のオプションと同じ効果が得られ、ゲーム内の Guide.IsTrial チェックが false を返すため、フル ライセンスで実行されるゲームがシミュレートされます。

    上記のいずれかの方法を使用してゲームのフル ライセンスをシミュレートすると、続いてゲーム プレイへと進み、ゲームがレベル 1 から 3 へと移行してレベルごとにグラフィックの速度が上昇することを確認できます。

次の画像は、実行中のゲームのスクリーンショットを示しています。ゲームは横向きにプレイされます。画像の右上にスコアボード、画面の下部に正方形のグラフィックがあります。

AP_Con_XNATrialApplicationUI のスクリーンショット

表示: