XNA ことはじめ

先日、個人的な Blog ではお伝えした通り、最終的に到達したい目標を実現するためのフレームワークとして目をつけていた XNA Framework に触れてしまった。
 

れびさんのおうち - XNA Game Studio 2.0β:
 http://myhome.cururu.jp/aquacity/blog/article/91001641605

れびさんのおうち - XNA Game Studio 2.0 β Empty Template:
 http://myhome.cururu.jp/aquacity/blog/article/91001641826

 
で、更にもう少し触れてみた。
Windows 版、XNA サンプルプロジェクト Spacewar を創って動かしてみたり、ソース見てみたり。
それだけでも色々学ぶことがある。
 
Spacewar プロジェクトは MS が提供しているサンプルプロジェクト。
プロジェクト新規作成後、ビルドするだけで動かすことが出来る。
これを元に空のプロジェクトに手を加えて行きながら、C#/XNA を勉強して行けたらいいな、という安易な(しかし期待に充ち溢れた)考えの元、ちまちまといたずらをしていってみようと思う。
(空プロジェクト(WindowsGameプロジェクト)作成直後のソースは Game1.cs 及び Program.cs のみで、内容は前述の別Blog記事参照
 
Program.cs については Game クラスのインスタンスを作成し、Run() するのみ。
Spacewar プロジェクトにおいても流れは同じだが、一つだけ大きな相違を確認。
 
インスタンス作成するクラスが Game クラスではない。
Game クラスを継承した SpacewarGame クラス、となっている。
 
確かに、空プロジェクトで言う Game1.cs が Spacewar プロジェクトでは SpacewarGame.cs となっており、拡張されている。
まずはファイル名の変更から試してみますか。
 
今回作成したソリューション及びプロジェクトは xna_jape という名称であることを事前に明記しておく。
ソリューションエクスプローラで Game1.cs を右クリック「名前の変更」で JapeGame.cs というファイル名に変更してみる。
ダイアログが出てきた。
 
「ファイルの名前を変更しようとしています。このプロジェクトのすべての参照をコード要素 'Game1' に名前を変更しますか?」
 
イマイチわかりにくい表現だが、おそらく名称の変更による影響範囲も自動的に修正しようとしてくれているのだろう。
リファクタの出力ウィンドウが以下を表示した。
(一部ディレクトリなど非公開に
 

プロジェクト 'D:\ほげほげ\xna_jape\xna_jape\obj\x86\Debug\Refactor\xna_jape.exe' でシンボルの参照を探しています
'Game1' から 'JapeGame' へ名前を変更

D:\ほげほげ\xna_jape\xna_jape\JapeGame.cs(17,15): 更新された定義
D:\ほげほげ\xna_jape\xna_jape\JapeGame.cs(22,10): 更新された参照
D:\ほげほげ\xna_jape\xna_jape\Program.cs(12,11): 更新された参照
D:\ほげほげ\xna_jape\xna_jape\Program.cs(12,28): 更新された参照
プロジェクト 'D:\ほげほげ\xna_jape\xna_jape\obj\x86\Debug\Refactor\xna_jape.exe' でシンボルの参照を探しています

 
なるほど。
Game1.cs の Game1 クラスが自動的に JapeGame という名のクラスに変更になっている。
更に、影響範囲を全部リファクタリングしている。
 
ファイル名変更前の Program.cs

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

 
ファイル名変更後の Program.cs から抜粋

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

 
ここまで勉強をしてきたとはいえ、C#も、というか Visual Studio 2005 を扱うレベルですら初心者に近いため、こんな挙動一つでも学ぶことがあったりして。
ちなみに、これだけの変更を行ったプロジェクトのビルドでエラーや警告は発生しなかった。
リファクタリングがバッチリ行われたようだ。
 
と、ここで一つ補足。
JapGame.cs の冒頭の using を紹介しておく。

using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;

 
XNA Game Studio 2.0 からは、System.Windows.Forms をサポートしなくなった。
あくまでも XNA Framework の Window を使うわけであり、ゲームを創る上で通常の Windows アプリの Form 用コントロールを使うべきではない、ということか。
それはある程度納得が行くが、じゃあ実際ラベルやテキストボックスやボタンが使いたくなった場合はどうするんだろう、と。
XBOX360 を主な対象プラットホームとして捉えているが、やっぱり Windows アプリも創れるわけなので。
その辺りもおいおい調べて行きたかったり。
(既にこの辺りで経験や知識の不足を痛感するわけだが…
 
とまあ、それはそれ。
.NET Framework の根幹である System 名前空間は当然のごとく、C#2.0 のジェネリックしょっぱなから using されている。
が、それ以外は XNA Framework が提供する、まさにゲーム用のライブラリ群という感が強い。
もちろん、XNA Framework は .NET Framework の一部(だと捉えていいんだよね?)なので、System.Windows.Forms を使ってもコンパイルエラーにはならないんだろうけど、XNA Framework の Window とは一線を画するのだろう。
 
さて、とりあえず MessageBox でも出せないだろうか。
この時点で発想がゲームアプリというより Windows アプリなのだが、とにかくやってみる。
 
一発で仮説が覆された。

    protected override void Update(GameTime gameTime)
    {
      if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
        this.Exit();
      // この2行を追加
      if (GamePad.GetState(PlayerIndex.One).Buttons.A == ButtonState.Pressed)
        System.Windows.Forms.MessageBox.Show("test");
      
      base.Update(gameTime);
    }

 
System.Wi …まで書いたところで手が止まった。
System.Windows 名前空間が見えない。
サポートされない、ってそういうことなのね。
そもそも XBOX360 向けのアプリに対して MessageBox なんてありえねーよ、ってことか。
ゴメンナサイ。
 

Microsoft XNA Unleashed:
 http://myhome.cururu.jp/aquacity/blog/article/91001640072

 
コレが欲しい。
ああ、絶対的に色々足りない。
本が読みたい。
 
とにかくめげずに行こうと思う。
今回の記事の内容でわかる通り、ハッキリ言ってまだスタートラインにすら立てないレベルだ。
が、C#/XNA 共に地道に学んで行きたい。