忍者ブログ

Memeplexes

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

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。


かんたんXNA4.0 その4 画像ファイルを表示

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

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

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

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

以下がXNA Game Studioでビルドしたコードです。
(Mainメソッドは別のクラスに移動しました)
 

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

class MyGame : Game
{
    GraphicsDeviceManager graphics;
    SpriteBatch spriteBatch;
    Texture2D texture;

    public MyGame()
    {
        graphics = new GraphicsDeviceManager(this);
    }

    protected override void LoadContent()
    {
        spriteBatch = new SpriteBatch(GraphicsDevice);
        texture = Content.Load<Texture2D>("Content/Penguins");
    }

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


xna4.0SimplestTexturePenguins.jpg

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

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

 

拍手[0回]

PR

かんたんXNA4.0 その3 2D画像の表示

前回はウィンドウの背景を塗りつぶしました。
しかしこれだけでは華がありません。
もう少しましにしましょう。

今回は1×1の画像(Texture2D)を作り、それを表示することにします。
黒い四角を表示するのです。

まず、2Dの描画を行うには、2D描画を全てカプセル化しているSpriteBatchクラスを使います。
このクラスはTexture2Dを表示するSpriteBatch.Drawメソッドや、ここでは扱いませんが、文字列を表示するDrawStringメソッドを持っています。

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

class MyGame : Game
{
    GraphicsDeviceManager graphics;
    SpriteBatch spriteBatch;
    Texture2D texture;

    public MyGame()
    {
        graphics = new GraphicsDeviceManager(this);
    }

    protected override void LoadContent()
    {
        spriteBatch = new SpriteBatch(GraphicsDevice);
        texture = new Texture2D(GraphicsDevice, 1, 1);
        texture.SetData<Color>(new Color[] { Color.Black });
    }

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

    static void Main()
    {
        using (MyGame game = new MyGame())
        {
            game.Run();
        }
    }
}

xna4.0SimplestTexture.jpg 
※左上に、黒い1x1のTexture2Dを、 100x100に拡大して描画しています。

前回と比べて新しく出てきたのが、LoadContentメソッドです。
これは、グラフィックスを表すデータ(例えば今回のようにTexture2Dだったり、あるいは3Dのモデルだったりです)をロードすべきときに自動的に呼ばれます。
このメソッドの中で、SpriteBatchのコンストラクタを呼んでいます。
引数にGraphicsDeviceがあるのは、SpriteBatchがGraphicsDeviceを カプセル化しているからでしょう。(多分)

その後Texture2Dの1×1インスタンスをを作成しています。
その後、その1×1のマスを黒で埋めています。
1×1の黒いTexture2Dができあがったというわけです。
もちろん、サイズを変えてもうちょっとカラフルにすることもできます。

        texture = new Texture2D(GraphicsDevice, 3, 1);
        texture.SetData<Color>(new Color[] { Color.Navy, Color.White, Color.Red });

xna4.0SimplestTextureTriColor.jpg

MyGame.Drawメソッドに目を転じましょう。
背景をCornflowerBlueで塗りつぶした後、 左上に100×100に拡大したTexture2Dを描画しています。
そのとき、頭と後ろにSpriteBatch.Beginメソッドと SpriteBatch.Endメソッドを呼んでやる必要があります。
呼ばなければ例外が発生し強制終了です。
これは、2D画像を表示するときだけではなくて、文字を表示するときも同じです。
ちなみに、もちろん、BeginとEndの間にDrawメソッドは何回呼んでもかまいません。


        spriteBatch.Begin();
        spriteBatch.Draw(texture, new Rectangle(0, 0, 100, 100), Color.White);
        spriteBatch.Draw(texture, new Rectangle(200, 200, 80, 80), Color.White);
        spriteBatch.End();

xna4.0SimplestTextureTwoRectangle.jpg
(※2回呼べばとうぜん2つの四角が表示されます)

ちなみにこのColor.Whiteというのは描かれるテクスチャに色付けされる色のことです。
ここに指定する色が青ならばテクスチャは青みがかって描かれます。

さて、今回のこの方法はあまりスマートではありません。
画像はなるべく外部のファイルにしておきたいものです。
次回はその方法について扱います。

 

拍手[2回]


かんたんXNA4.0 その2 背景のクリア

前回では、ウィンドウが全く描画を行っていませんでした。
そのため、XP以前の環境だと他のウィンドウに隠されると跡が残ってたいへん見苦しいものでした。

これではいけません!

このような跡はすぐに消せるようにならなければなりません。
それが出来るようになったのが、以下のコードです:

using Microsoft.Xna.Framework;

class MyGame : Game
{
    GraphicsDeviceManager graphics;

    public MyGame()
    {
        graphics = new GraphicsDeviceManager(this);
    }

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

    static void Main()
    {
        using (MyGame game = new MyGame())
        {
            game.Run();
        }
    }
}

xna4.0SimplestClearable.jpg

このプログラムは、一秒間に60回背景を空色で塗りつぶしています。
それをやっているのがDrawメソッドですが、こいつは一秒間に大体60回呼ばれるのです。

これだけひんぱんに背景を消しているので、もう他のウィンドウに隠されても大丈夫です。
(Vista以降だと何もしなくても大丈夫ですが)

さて、注目すべきは一秒間に60回塗りつぶしているという部分です。
XP以前の普通のプログラム、WindowsFormsなどでは、他のウィンドウに隠れたときなど、描画すべきときにしか描画しませんでした。
しかし、XNAではそのようにはしません。
狂ったように、何も変化が無くても、とりあえず60回描画します
ゲームプログラミングとは、そのようなものだということです。

もう少し細かいところに注目してみましょう。
このプログラムでは、まずMicrosoft.Xna.Framework.GraphicsDeviceManagerのインスタンスを作成しています。
これは、ゲームのウィンドウのサイズやフルスクリーン、それと描画全般を行うGraphicsDeviceを管理するマネージャーです。
(管理(マネージ)するマネージャーとは変な表現ですが、まぁ大目に見てください)

重要なのはこのクラスというよりも、そのプロパティからアクセスできる、GraphicsDeviceです。
このGraphicsDeviceは役割としてはちょうどWin32でいうHDCやWindowsFormsやJavaのGraphicsクラスのようなものです。
つまり、描画はこれを通じて行うのです。
点を表示するにも、線を表示するにも、2D画像を表示するにも、3Dのモデルを表示するにもこのGraphicsDeviceが必要です。
(もっとも、2Dの場合はカプセル化されていて、描画の時には意識する必要はありませんが)

このプログラムではGraphicsDevice.Clearを使って、ウィンドウのクライアント領域を空色で塗りつぶしています。
もちろん色は別に空色でなくてもかまいません。
でもでも黒でもかまいませんが、Xnaの多くのサンプルでは、空の色に似ているからでしょうか、Color.CornflowerBlueを使っています。
多数決の原則(?)により、次回からもColor.CornflowerBlueを使うことにします。

 

拍手[2回]


かんたんXNA4.0 その1 ウィンドウの表示

XNAを簡単なレベルから少しずつ整理していこうと思います。
まずは一番簡単なプログラムから。
class MyGame : Microsoft.Xna.Framework.Game
{
    static void Main()
    {
        using (MyGame game = new MyGame())
        {
            game.Run();
        }
    }
}

これはおそらくXNAの最も簡単なプログラムで、
Gameクラス(を継承したMyGameクラス)のオブジェクトを作り、Runメソッドを呼んでいます。
実行すると(ゲームの)ウィンドウが表示されるだけです。

xna4.0Simplest.jpg

Vista以降では何の面白みもないウィンドウですが、XP以前だと面白い現象が見られます。
他のウィンドウで覆い隠すとこんな風に跡が残ってしまうのです。
これは描画を全くしていないからですね。

xnaSimplestCovered.JPG

※ちなみに(どうでもいいことですが)、このウィンドウのタイトルはMyGameとなっていますが、これはクラスの名前ではなくて実行ファイルの名前に関係しているようです。
というのも、このコードをコンパイルして出来たプログラムは"MyGame.exe"だったのですが、この名前を"Game.exe"に変更するとタイトルはGameになったからです。

ただ、これはコマンドラインから普通にコンパイルした場合の話で、VisualC#を使った場合には、AssemblyInfo.csのAssemblyTitleがタイトルを表しているようです。

拍手[0回]


かんたんXNA4.0 (XNA入門)

XNA入門:かんたんXNA
をXNA4.0用に書きなおそうと思います。
  1. ウィンドウの表示
  2. 背景のクリア
  3. 2D画像の表示
  4. 画像ファイルを表示
  5. 三角形の表示
  6. 3D三角形の表示
  7. アニメーション
  8. 3Dカメラのアニメーション
  9. キーボード入力
  10. 3D四角形
  11. VertexBuffer
  12. Game.Initializeメソッド
  13. IndexBuffer
  14. テクスチャ三角形
  15. 簡単なライティング
  16. ワイヤーフレーム
  17. 透過パーティクル
  18. BasicEffectで平行光
  19. マテリアル
  20. 深度バッファ
  21. 深度バッファへの書き込み
  22. 深度バイアス
  23. 深度バッファ関数
  24. アルファ・ブレンディング
  25. ブレンド関数
  26. ステンシル・バッファ
  27. ビューポートで分割スクリーン
  28. テクスチャへの描画 RenderTarget
  29. カスタム頂点
HLSL編
  1. エフェクトファイル
  2. 構造体
  3. スカラーとベクトル型
  4. フロー制御文
  5. グローバル変数
  6. マトリックス
  7. テクスチャ

拍手[12回]