忍者ブログ

Memeplexes

プログラミング、3DCGとその他いろいろについて

かんたんXNA その4 画像ファイルを表示

このページは古いです
最新版はこちら

ここでは画像ファイルをウィンドウに表示します。

外部のファイルをあつかうには、ContentManagerを使います。
これは、画像ファイルや3Dモデル、フォントなどをゲームにロードするときに使います。
なお、このクラスを使うときには、XNA Game Studioを使わないと死にます
というのも、それらのファイル一つ一つに対応するxnbファイルを作らなければならないからです。
(しかもこいつはバイナリファイルです)

例えば、image.jpgというファイルを直接使うことはできません。
"image.xnb"というファイルを"image.jpg"から作って、それを使わなければならないのです。

XNA Game Studioはそれを自動で行ってくれます。
このことを全く気にする必要はありません。
ただ"image.jpg"ファイルをソリューションエクスプローラーにペーストするだけでいいのです。

以下がXNA Game Studioでビルドしたコードです。
 


using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;


public class MyGame : Microsoft.Xna.Framework.Game
{
    GraphicsDeviceManager graphics;
    Microsoft.Xna.Framework.Content.ContentManager content;
    SpriteBatch spriteBatch;
    Texture2D texture;

    public MyGame()
    {
        graphics = new GraphicsDeviceManager(this);
        content = new Microsoft.Xna.Framework.Content.ContentManager(Services);
    }

    protected override void LoadGraphicsContent(bool loadAllContent)
    {
        if (loadAllContent)
        {
            spriteBatch = new SpriteBatch(graphics.GraphicsDevice);
            texture = content.Load<Texture2D>("FlyingSpaghettiMonster");
        }
    }

    protected override void UnloadGraphicsContent(bool unloadAllContent)
    {
        if (unloadAllContent)
        {
            content.Unload();
        }
    }

    protected override void Draw(GameTime gameTime)
    {
        graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
        spriteBatch.Begin();
        spriteBatch.Draw(texture, new Rectangle(0, 0, 200, 150), Color.White);
        spriteBatch.End();
    }
}



xnaSimplestTextureLoadedByContentManager.JPG

このプログラムは、
"FlyingSpaghettiMonster.jpg"(から作られた"FlyingSpaghettiMonster.xnb")
をゲームにロードして表示しています。

まずContentManagerのインスタンスを作ります。
このときコンストラクタの引数としてGameのServicesプロパティを入れてやります。
(引数の型はSystem.IServiceProviderです)

どうしてこういうことをするのかというとGraphicsDeviceが欲しいからです(多分)
しかし、疎結合にするため、かわりに間接層、
System.IServiceProviderをコンストラクタの引数に取っているのでしょう(多分)。
そしてここから、IGraphicsDeviceServiceを手に入れ、
さらにそこからGraphicsDeviceを手に入れます。

(※Game.Servicesのかわりに、以下のサービスプロバイダのインスタンスを引数に入れることで
ContentManagerがどんなサービスを要求しているのかがわかります。

class MyServices : System.IServiceProvider
{
    Game game;

    public MyServices(Game game)
    {
        this.game = game;
    }

    public object GetService(System.Type serviceType)
    {
        game.Window.Title += " " + serviceType.ToString();
        return game.Services.GetService(serviceType);
    }
}
これによるとContentManagerは
Microsoft.Xna.Framework.Graphics.IGraphicsDeviceService
を要求していました。
このインターフェースを使うと、GraphicsDeviceの生成、ロスト、リセットなどのイベントや
GraphicsDeviceのインスタンスを手に入れることが出来ます。)


次にLoadジェネリックメソッドを使って"FlyingSpaghettiMonster.jpg"をロードしています。
(正確にはそれから作られたxnbファイルですが)

ここでロードしたリソースは、Game.UnloadGraphicsContent
メソッド内でContentManager.Unloadメソッドを使って解放しなければなりません。

 

拍手[1回]

PR