PlatformerのXNA2.0への移植

相変わらずPlatformerをいじっている。

XNA2.0には GraphicsDevice.Viewport.TitleSafeArea というものがない。 TitleSafeAreaというのはつまりビューポートの中で、アナログディスプレイで表示したときに、 テキストを表示して良い安全範囲ということだろう。

            Viewport v = GraphicsDevice.Viewport;
            Vector2 hudLocation = new Vector2(0, 0);
            Vector2 center = new Vector2(v.Width / 2.0f,
                                         v.Height / 2.0f);

こんな感じで適当にごまかした。 TitleSafeArea自体はなかなか便利そうなものだから今度から使ってみよう。

RectangleExtensions.csの中で使われてた謎の引数宣言

public static Vector2 GetIntersectionDepth(this Rectangle rectA, Rectangle rectB)

などはどうやら 拡張メソッド というものらしい。 C#2.0には無くてC#3.0から。 C#はなかなか愉快なことをやってくれる。 まだ良くこの新しい仕様について理解してないのだが、 とりあえずthisはとっぱらっても動くらしいことがわかった。 先を急ぐ。

XNA3.0にはRectangle構造体にCenterというプロパティが追加されたらしい。 XNA2.0には無いようだ。 Centerの値はPoint構造体らしいんで、

            Rectangle r = GetBounds(x, y);
            exit = new Point(r.X + r.Width / 2, r.Y + r.Height / 2);

とかやってごまかした。

そしたらXNA2.0でも動いた。やれやれ。 XNA Game Studio 3.0 このリリースの新機能 というところにまとめて書いてあるようだ。

C#2.0では

      public bool IsAlive { get; private set; }

というような省略した書き方は(インターフェイスでない限り)できないらしい。 ちゃんと

        public bool IsAlive
        {
            get
            {
                return isAlive;
            }
            private set
            {
                isAlive = value;
            }
        }
        bool isAlive;

という具合に書くと動いた。 やばい。仕様がリアルタイムでどんどん変わっていく。 それがXNA (笑)。