スプライトベースのゲームの作成

2D アクション ゲームの作成は、さまざまなプラットフォーム上で開発を行うための通過儀礼です。

2D ゲームの作成

2D ゲームを作り始める方法はいくつもありますが、結局のところ、最も基本的な要件は、画面上の特定の位置に画像を表示し、ユーザー入力に対応できるということだけです。

iOS の開発者であれば、UIImage コントロールだけを使ってゲームを作ったことや、OpenGL ES で独自のスプライト ルーチンを動かしたことがある可能性があります。アプリを Windows 8 に移植する場合、iOS と Windows のテクノロジ間には直接的な関連付けがないので、いくつかの移植方法の長所と短所を比較評価する必要があります。たとえば、XAML canvas や HTML canvas ソリューションを使うゲームはすばやく簡単に開発できますが、複雑な操作で必要となるパフォーマンスに欠ける場合があります。一方、DirectX と C++ は、単純なアプリのためには機能が豊富過ぎます。

次の表は、一般的な iOS 開発パターンに最も近い Windows 8 テクノロジを簡単にまとめたものです。完全に一致するわけではありませんが、大まかな対応を把握できます。

iOS テクノロジWindows 8 テクノロジ
UIKit (UIImage、UIButton、UILabel など)。XAML canvas または HTML canvas
OpenGL ES コード (スプライトはクワッドまたはポイント スプライトとして表示)。DirectX (スプライトはテクスチャとして表示)。
SpriteKitDirectX (スプライトはテクスチャとして表示)。
Cocos2D などのサード パーティ フレームワーク。Cocos2D-X などのサード パーティ フレームワーク。
Unity3D などのサード パーティ ゲーム作成ツール。Unity3D などのサード パーティ ゲーム作成ツール。

 

MonoGame の紹介

MonoGame は、iOS 開発から Windows 開発に移ってきたユーザーが基本的なスプライト ライブラリを必要とする場合に適しているソリューションです。MonoGame は DirectX 用のオープン ソース C# ラッパーであり、2D スプライト ベースのゲームを簡単に記述できるように設計されています。パフォーマンスと使いやすさのバランスが取れています。

Windows、Windows Phone、または Xbox 用のカジュアル ゲームを作った経験があるユーザーは、XNA ゲーム フレームワークについてご存知のことと思われます。XNA は Windows または Windows Phone でサポートされなくなりましたが、その代わりに MonoGame を使うことができます。 MonoGame は、当初は XNA のクロスプラットフォーム バージョンであると考えられていました。現在では、MonoGame を使うと、既にある XNA プロジェクトを完成させることができるだけでなく、ゼロから Windows 用ゲームを作って、Windows Phone、iOS、Android で実行することができます。

MonoGame でのアプリのビルド

MonoGame は、Visual Studio Express エディションをサポートしています。そのため、Windows 8 用のスプライト ベースのゲームは、完全に無料で作り始めることができます。MonoGame をインストールすると、Visual Studio にはいくつかの新しいプロジェクト テンプレートが用意されます。最高のパフォーマンスを得るには、MonoGame Windows ストア プロジェクト テンプレートを使います。ただし、XAML コントロールを利用する場合は (通常はテキスト オーバーレイ、ボタン、その他のコントロールを提供するため)、MonoGame Windows ストア (XAML) プロジェクトを使うこともできます。

MonoGame プロジェクト テンプレート

テンプレートを使って作られた C# プロジェクトは理解しやすく、ユーザーが実装できるように、LoadContent()Update()Draw() のようなメソッドが用意されています。

MonoGame はスプライトを表示しますが、問題点があります。MonoGame では、描画する画像を .xnb という形式にする必要があります。単に PNG ファイルを含めても、表示されません。以前の XNA では、コンテンツ パイプライン技法によってプロジェクトに PNG を含めることができ、.xnb ファイルは自動的に作成されました。MonoGame は、独自のコンテンツ パイプラインをサポートするようになりました (詳しくは、GitHub のこのページをご覧ください)。または、次の技法を使います。

Visual Studio 2012 Express for Phone をインストールします。この Visual Studio では、まだ Windows Phone 7 用の XNA アプリの構築がサポートされています。確かにこのプロセスは格好が悪く感じられますが、うまく機能します。必要な作業は、新しい Windows Phone 7 XNA プロジェクトを作り、PNG アートワークをドロップして、プロジェクトをビルドし (ビルドするだけで、実行する必要はありません)、.xnb ファイルを新しい Windows 8 プロジェクトにコピーすることだけです。同じ手法が効果音やシェーダーに使われます。

C# コードの例

次に示すのは、ゲームの開始部分です。このゲームでは、プレーヤーのスプライトがターゲットのスプライトにぶつかり、それを破壊するとポイントが得られます。これで、ゲームの世界が変わります。まず、ターゲット スプライトの位置を格納するリストと、プレーヤーのオブジェクトの位置を格納する変数を作ります。


        private List<Vector2> ball_locations;
        private Vector2 player;

次に、Initialize() メソッドで、それらを初期化します。


        protected override void Initialize()
        {
            // TODO: Add your initialization logic here

            base.Initialize();

            ball_locations = new List<Vector2>();

            for (float y = 40; y < 700; y += 60)
                for (float x = 100; x < 500; x += 60)
                {
                    ball_locations.Add(new Vector2(x,y));
                }

            player = new Vector2(1000, 400);
        }

名前からわかるように、Vector2 は X 座標と Y 座標を含む、新しいデータ型です。これは、Vector3 と同様に、ゲームを作るときに非常に便利です。

LoadContent() メソッドでは、必要な画像が含まれている .xnb ファイルを読み込みます。これらの .xnb ファイルは、既に説明したように、別の Windows Phone XNA プロジェクトでビルドされました。この例では、2 枚の画像を使います。背景の宇宙空間の画像と、1 つの白色ボールの画像です。MonoGame では描画時に画像の色を設定できるため、使う色ごとのボールを作る必要はありません。


        protected override void LoadContent()
        {
            // Create a new SpriteBatch, which can be used to draw textures.
            _spriteBatch = new SpriteBatch(GraphicsDevice);

            // TODO: use this.Content to load your game content here

            _backgroundTexture = Content.Load<Texture2D>("starfieldImage");
            _ball = Content.Load<Texture2D>("ballImage");

        }

ここで、オブジェクトを描画してみましょう。MonoGame では、XNA と同様に、SpriteBatch と呼ばれるオブジェクトを使って、スプライトを表示します。SpriteBatch を作り、その Begin() メソッドと End() メソッドを呼び出す必要があります。この 2 つのメソッドの間で、スプライトが描画されます。フレームごとに画面をクリアすることも重要です。この例では、画面全体を埋めるために宇宙空間の画像が描画されます。


        protected override void Draw(GameTime gameTime)
        {
            _spriteBatch.Begin();

            // Draw backgound (also clears screen)
            _spriteBatch.Draw(_backgroundTexture, GraphicsDevice.Viewport.Bounds, Color.White);

            // Draw the target balls in alternating colors
            int i = 0;
            foreach (Vector2 v in ball_locations)
            {
                switch (i)
                {
                    case 0: _spriteBatch.Draw(_ball, new Rectangle((int)v.X, (int)v.Y, 50, 50), Color.Red); break;
                    case 1: _spriteBatch.Draw(_ball, new Rectangle((int)v.X, (int)v.Y, 50, 50), Color.Green); break;
                    case 2: _spriteBatch.Draw(_ball, new Rectangle((int)v.X, (int)v.Y, 50, 50), Color.Blue); break;
                    case 3: _spriteBatch.Draw(_ball, new Rectangle((int)v.X, (int)v.Y, 50, 50), Color.Yellow); break;
                }
                i++; if (i > 3) i = 0;
            }

            // Draw player's ball
            _spriteBatch.Draw(_ball, new Rectangle((int)player.X, (int)player.Y, 50, 50), Color.White);

            _spriteBatch.End();

            base.Draw(gameTime);
        }
    }
}

このアプリを実行すると、次のようになります。

MonoGame プロジェクト テンプレート

もちろん、まだ多くの作業が残っています。さまざまな画面上のオブジェクトの位置の更新は、 Update() メソッドで行われます。このメソッドは、各フレームで自動的に呼び出されます。テキストの表示も、少し手間のかかる作業です。XAML プロジェクトを使って TextBlock コントロールと Button オブジェクトを重ね合わせることも、MonoGame SpriteBatch テキスト レンダリングを使うこともできます。SpriteBatch レンダリングを使う場合はテキスト レンダリングの方が高速ですが、PNG ファイルから .xnb 画像を作ったときと同じ方法で、フォント オブジェクトを XNA プロジェクトで作る必要があります。

MonoGame でのゲームの作成に関心がある場合は、MonoGame.net Web サイトに多数のチュートリアルとヘルプ ファイルがあります。Adam Dawes による書籍『 Windows 8 and Windows Phone 8 Game Development』は、優れたガイドです。

関連トピック

XNA ゲーム フレームワーク
MonoGame
XNA から MonoGame へ (Gamasutra)
役立つコード ライブラリ、ツールキット、その他のリソース
Windows ストア ゲーム "リバーシ" (XAML、C#、C++)
DirectX ゲーム開発とサンプルのチュートリアル

 

 

表示:
© 2015 Microsoft