C#のプロパティというもの。

これは、starterkit: Platformerの中のLevel.csというソースの一部なのだが、

        public Rectangle GetBounds(int x, int y)
        {
            return new Rectangle(x * Tile.Width, y * Tile.Height, Tile.Width, Tile.Height);
        }

        /// 
        /// Width of level measured in tiles.
        /// 
        public int Width
        {
            get { return tiles.GetLength(0); }
        }

        /// 
        /// Height of the level measured in tiles.
        /// 
        public int Height
        {
            get { return tiles.GetLength(1); }
        }

GetBoundsは(x,y)の位置のタイルの矩形領域をRectangle構造体で返すメソッドだ。 これはどう見てもLevelというクラスのれっきとしたメソッド。 しかしその次のWidthとHeightはメソッドではなく、プロパティというものだ。 WidthとHeightは一つのLevel(面)にTile(ブロック)が縦横どれだけの数並んでいるかを表す。 普通ならこれを我々はLevelクラスの変数(メンバー変数)として宣言して、 コンストラクタあたりで初期化して使うであろう。

しかしこのプロパティとしての実装の見事さはどうだろうか。 tilesというのはTileの二次元配列で、getLength(0)はその0番目の配列の長さ、 getLength(1)は1番目の長さを返しているわけだ。 tiles自体は別のところで初期化されている。

今まで私はC#のプロパティの説明を読んでも何が便利なのかさっぱりわからなかったが、 このコードを見てやっと了解した。

以前私はgはGame1のg などというものを書いたのだが、 これもまあわかりやすいんでそんな悪い方法ではないと思うが、 自分でこそっと使うならともかく学生に堂々と教えるようなもんではないわな。 Platformerのソースを読んでいると、もちろんそんなことはやってない。 うまい具合に、publicなプロパティ使ったりとか、 privateで隠蔽しつつクラス内で「地産地消」したりとか工夫されていて、 なんかもうすげーなって感じです。 で、これを自分で感心してるだけでなく学生にも教え、かつ、ゲーム制作に活かさなくてはならないのだが、 それってどうなのかと。可能なのかと。 ちなみにLevel.csって結構長い。

ていうか、構造体をnewで初期化できるのもおしゃれだよね。 CとJavaと比べての話だが。

PlatformerGame : GameのDraw()から、 LevelのDraw()を呼び出すとき、

            level.Draw(gameTime, spriteBatch);

とかって書いてあって、やっぱそうやっていちいちspriteBatch渡してやるのが正統なんだよなあって思った。