Platformer雑感

Platformerをいったんばらしてもう一度組み直すということをやっている。 スターターキットではなくて新しいプロジェクトWindows Game (3.0)として作り直している。 とりあえず、PCだけで動けば良いので、 いじりやすいようにそれ以外の要素をとっぱらっているというのと、 Platformerを授業の都合上XNA 2.0で動かしたいというのと、 いじりながらソースを理解しようというのと、 ゆくゆくはフルスクラッチから作ろうと考えているのと、 いろんな理由による。

IServiceProvider。よくわからん。しかしXNA2.0にも使われているようなのでほうっておく。

ContentManager。 Platformerでは、PlatformerGame.csの中のContentと、 Level.csの中のContentは別物になっている。 PlatformerGameのインスタンスはプログラムが走っている最初から最後まで存在し続けるが、 Levelのインスタンスは使い捨てなので、 Levelを破棄するときにContentも読み込んだ素材も全部破棄される。 なのでPlatformerGameとLevelでContentを共有してはならないようだ。 つまりContentManagerは複数存在してよく、それぞれ勝手に素材を読み込んだり破棄したりしてよいということだろう。 spriteBatch.End()がSystem.ObjectDisposedExceptionを投げたので、 いろいろいじってたらそんなことだろうということがわかった。

XNA2.0ではXACTしか使えないのでサウンドはとりあえず削除。

チュートリアルにあるパワーアップとスクロールはすでに実現。

LevelってPlayerのコンストラクタにthisを渡してるんだよな。 Playerの側では

        public Level Level
        {
            get { return level; }
        }
        Level level;

        public Player(Level level, Vector2 position)
        {
            this.level = level;

            LoadContent();

            Reset(position);
        }

...
            runAnimation = new Animation(Level.Content.Load(spriteSet + "Run"), 0.1f, true);
            idleAnimation = new Animation(Level.Content.Load(spriteSet + "Idle"), 0.15f, true);
...

などとやっている。 つまりLevelのグローバル変数的な使い方。 全然禁断技とかじゃないんだな。

しかし、こうしてみるとプロパティってクラス変数的な使い方をされることが多いのかな。