11/03/2010

WP7 TrainingKit のサンプルをXBOX360で動かす

Windows Phone 7 のマーケットプレイスや実機で動作させるために、APP HUBのメンバーシップになったものの、実機もないのでTraining Kit のサンプルの動作も完全に動作させることができない状態です。

そんな中、APP HUBのメンバーシップで Creators Club にも同時に入るので、XBOX360のアプリ開発も行えることを知り、WP7の実機が待ち遠しいので我慢できず、Windows Phone 7 の Training Kit を XBOX360 (実機)で動かしてみることにしました。

一応、実機です・・・。WP7じゃないけど。

試したのは、Training Kit の「Exercise 1: XNA Game Studio Games on the Windows Phone 7」です。

ちなみに、Windows Phone 7 のエミュレータで動かした画面は以下のような感じです。


では、XBOX360のXNA用にコードを修正していきます。

「Microsoft Visual Studio 2010 Express for Windows Phone」を起動して、「New Project」を選択します。プロジェクトのテンプレートは、「Xbox 360 Game (4.0)」です。




\End\AlienGame\AlienGame 配下のファイルとフォルダを、AlienGameのプロジェクト①にドラック・アンド・ドロップして、\End\AlienGame\AlienGameContent配下のファイルをAlienGameContentのプロジェクト②にドラック・アンド・ドロップします。ドラック・アンド・ドロップでコピーするファイルは、以下の画面を参考にしてください。


Xbox 360はTouchクラスが存在しないようなので、少しコードを変更します。主にエラーになっている箇所です。

Program.cs
static void Main(string[] args)
        {
            using (AlienGame.AlienGame game = new AlienGame.AlienGame())
            {
                game.Run();
            }
        }

GameplayScreen.cs の using
using System.IO;
using Microsoft.Xna.Framework.Input;
#if !XBOX
using Microsoft.Xna.Framework.Input.Touch;
using Microsoft.Devices.Sensors;
#endif

GameplayScreen.cs の GameplayScreen クラス
//Input Members
#if !XBOX
        AccelerometerReadingEventArgs accelState;
        TouchCollection touchState;
        Accelerometer Accelerometer;
#endif

GameplayScreen.cs の GameplayScreen() コンストラクタ内
alienBullets = new List();
#if !XBOX
            Accelerometer = new Accelerometer();
            if (Accelerometer.State == SensorState.Ready)
            {
                Accelerometer.ReadingChanged += (s, e) =>
                {
                    accelState = e;
                };
                Accelerometer.Start();
            }
#endif
        }

GameplayScreen.cs の HandleInput(InputState input) メソッド内
if (input.PauseGame)
            {
                if (gameOver == true)
                    finishCurrentGame();
            }
            else
            {
#if XBOX
                if (input.MenuSelect)
                {
                    buttonTouched = true;
                }
                if (input.MenuUp)
                {
                    movement = 1.0f;
                }
                if (input.MenuDown)
                {
                    movement = -1.0f;
                }
#else
                touchState = TouchPanel.GetState();

                //interpret touch screen presses
                foreach (TouchLocation location in touchState)
                {
                    switch (location.State)
                    {
                        case TouchLocationState.Pressed:
                            buttonTouched = true;
                            break;
                        case TouchLocationState.Moved:
                            break;
                        case TouchLocationState.Released:
                            break;
                    }
                }
                if (accelState != null)
                {
                    if (Math.Abs(accelState.X) > 0.10f)
                    {
                        if (accelState.X > 0.0f)
                            movement = 1.0f;
                        else
                            movement = -1.0f;
                    }
                }
#endif

                player.Velocity.X = movement;

これで、プログラムの変更は完了です。

あとは、XBOX360に「XNA Creators Club」をインストールするのですが・・・。なかなか見つからない。

場所は、「ゲーム マーケットプレイス」→「ゲームストア」→「追加コンテンツ&その他」→「ゲーム追加コンテンツ」→「タイトル順」→「え」→「XNA Creators Club」です。

では、XBOX360とPCを接続します。

XBOX360の「XNA Creators Club」のインストールが完了したら、「ゲームライブラリ」→「全て」から「XNA Creators Club」を実行します。
PC側は、「スタート」→「Microsoft XNA Game Studio 4.0」→「XNA Device Center」を実行します。
あとは、画面の指示に従って、XBOX360に表示されているキーをPC側に入力します。
※「Microsoft Visual Studio 2010 Express for Windows Phone」が動作しているPCとXBOX360は同一セグメントのネットワークに接続されていないといけません。

そして、「Microsoft Visual Studio 2010 Express for Windows Phone」から実行を行うと、XBOX360にプログラムが送られて実機(WP7じゃないけど)で、ゲームが遊べます。


同じコードでXBOX360向けのゲームも作れてしまうのは素晴らしい。(本当は逆ですね)
早く日本に実機(WP7)上陸してほしいです。