WisdomSoft - for your serial experiences.

タイトルストレージ

ゲームタイトルのパッケージに含まれているデータはタイトルストレージと呼ばれる領域に配置されます。任意のファイルをタイトルストレージに配置に、そこからストリームを読み取ることができます。

パッケージに含まれるデータの読み込み

System.IO 名前空間のファイル入出力 API は Windows PC 上であればアクセス権限のある範囲で、自由にパスを指定してファイルを読み書きできます。しかし Xbox 360 や Windows Phone のような、アプリケーションごとに専用のデータ領域が割り当てられる分離ストレージ環境では、パスを用いて自由にアクセスすることはできません。

プログラムコード以外に、ゲームタイトルにパッケージされたデータを読み取り専用ストリームとして読み込むことができます。ゲームのプロジェクトに含まれているソースファイル以外のコンテンツ(コンパイルされないデータ)は、自動的にタイトルストレージと呼ばれる、実行ファイルと同じ領域に含まれます。

タイトルストレージに画像ファイルを追加するには「ソリューション エクスプローラ」からゲームプロジェクトを選択し、右クリックで表示されたドロップダウンメニューから「追加」→「既存の項目」を選択してください。

図1 既存の項目の追加
図1 既存の項目の追加

「既存項目の追加」ダイアログボックスが表示されるので、追加するファイルを選択して「追加」ボタンを押します。右下のコンボボックスで表示するファイル形式を絞り込むことができます。目的のファイル形式が表示されない場合は「すべてのファイル」を選択してください。

図2 追加する画像ファイルの選択
図2 追加する画像ファイルの選択

タイトルストレージに含むファイルはコンパイル対象ではないので、ビルド時にタイトルストレージとなるゲームのパッケージに複製されるように設定しなければなりません。追加したファイルを選択した状態で「プロパティ」ウィンドウを表示し、「ビルド アクション」プロパティの値を「なし」に、「出力ディレクトリにコピー」プロパティの値を「新しい場合はコピーする」に変更してください。

図3 プロパティの設定
図3 プロパティの設定

以上で、ファイルの追加の説明は終了です。

タイトルストレージからファイルを読み込むには Microsoft.Xna.Framework.TitleContainer クラスを用います。

Microsoft.Xna.Framework.TitleContainer クラス
public static class TitleContainer

タイトルストレージからストリームを開くには、TitleContainer クラスの OpenStream() メソッドを提供しています。

TitleContainer クラス OpenStream() メソッド
public static Stream OpenStream (string name)

name パラメータに、タイトルストレージから開くファイル名を指定します。メソッドは、指定したファイルのストリームを返します。タイトルストレージから得たストリームは読み取り専用であり、書き込むことはできません。これは、一般的なゲームが読み取り専用のメディアであることを考えれば自然なことです。

コード1
using System.IO;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

public class TestGame : Game
{
    public static void Main(string[] args)
    {
        using (Game game = new TestGame()) game.Run();
    }

    private GraphicsDeviceManager graphicsDeviceManager;
    private SpriteBatch sprite;
    private Texture2D texture;

    public TestGame()
    {
        graphicsDeviceManager = new GraphicsDeviceManager(this);
    }

    protected override void LoadContent()
    {
        sprite = new SpriteBatch(GraphicsDevice);

        using (Stream stream = TitleContainer.OpenStream("TestImage.png"))
        {
            texture = Texture2D.FromStream(GraphicsDevice, stream);
        }
        base.LoadContent();
    }

    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.White);

        sprite.Begin();
        sprite.Draw(texture, Vector2.Zero, Color.White);
        sprite.End();

        base.Draw(gameTime);
    }
}
実行結果
コード1 実行結果

コード1はタイトルストレージから画像ファイルのストリームを取得し、これを FromStream() メソッドに渡してテクスチャを取得しまいます。