ミニDTL.xna “ゲームはイチニチ30分まで!” 第9回

by key

ミニDTL.xnaその9です。

しばらくブログを書いていなかったので、あわてて書いています。これは8/29の分です。


MiniDTL.xna (9)

マップを描く

前回追加した謎の黒い帯、ここにステージマップを描きます。

将来的にゲームで使いたいというのもあるけど、まずは開発を目で確認するため。

やってる作業としてはWorld.Draw中で自身のprivate drawMapを呼び出し、背景を黒く塗りつぶしてから自機と敵機の位地にドットを打ちます。描画は全部、前回使ったtextureWhiteにSpriteBatch.Drawの第三引数で色をつけているだけです。

本当はもっと良い方法があるんでしょうけど、このコーナーでは基本立ち止まらずどんどん作りますよ。

敵の配置が見えるようになった

敵の配置が見えるようになった

基底クラスを作る

いまだに作ってなかったのですが、上記の過程で自機と敵機に同じ処理を行ったので、いいかげんやらないと考えて共通基底クラスGameElementを作りました。名前は適当です。

とりあえず基底クラスに移動したのは、位置を示すVector2 Positionと、破棄されたかどうかを示すBoolean Destroyedです。(あ、しまったboolにしてないや)

それとGameElementのコレクションを保持するWorldクラスのインスタンスworldも、各GameElementで保持するようにしました。名前に整合性が無いとか、そもそも設計がおかしいとかいうのは、気づいているけど時間がもったいないので放置です。

でEnemyとFighterなどはGameElementを継承し、なるべくサブクラスをすっきりさせます。

ここでC#に慣れていないためしばらくはまりました。

まずコンストラクタ中でスーパークラスのコンストラクタを呼ぶ場合。ASだとこう書けるのですが

  1. public Enemy(world:World) {
  2.     super(world);
  3. }

superってbaseだっけ、と思って書き直してもコンパイルエラー。仕方が無いのでC# 継承でぐぐって調べました。2~3年使ってないぐらいで全然思い出せない。

  1. public Enemy(World world) : base (world) {
  2. }

が正解。

他、

  1. shots.RemoveAll(delegate(Shot shot) {});

のところを

  1. shots.RemoveAll(delegate(GameElement shot) {});

にしてもダメなんですね。

shotsをList<Shot>からList<GameElement>にキャストすると良い気がするけど、長くなっちゃうのでやってない。

ここから先は全体の整理と書き直しをやって30分経過。ゲームの見た目は変わってないですごめんなさい。

続きます。

タグ: , , ,

コメント / トラックバック 1 件

  1. XNA Today » ミニDTL.xna 第9回 より:

    [...] ミニDTL.xna “ゲームはイチニチ30分まで!” 第9回 [...]

コメントをどうぞ