真・C#とWPFでインベーダー風ゲームを作る

3日前に『C# と WPF でインベーダー風ゲームを作る』を言って、雰囲気だけ似ているオリジナルのイカのシューティングの記事を書きましたが、「インベーダー風」を名乗ってあの出来栄えはさすがに我田引水が過ぎるかなと思い反省したので、本物の「インベーダー」のクローンをまじめに研究することにしました。

takachan.hatenablog.com

画面構成

f:id:Takachan:20170320003414p:plain:h350

敵機、自機、弾などはすべてImageクラスになっています。 ImageクラスをCanvas上に配置しTimerを1秒間に60回更新して60fpsの疑似動作を行っています。

作成環境

今回制作に使うツールは以下の通りです。

  • VisualStudio2017Community
    • .NET Framework4.6.2をターゲットにしています
  • Paint.net
    • 敵画像の作成に使用します

出来上がったゲームの画面

今回は、本家のインベーダーゲームにかなり寄せています。

f:id:Takachan:20170320003900p:plain:h350

f:id:Takachan:20170320003905p:plain:h350

制作過程

イカゲームの時と流れはほとんど同じですがこんな流れで作業しました。

  • 1日目
    • イカゲームから必要な部分を残して全部削除
    • 自機の表示、左右キーでの移動
    • 自機の弾の発射、取り除き
  • 2日目
    • インベーダーの配置
    • インベーダーの攻撃処理とあたり判定の追加
  • 3日目
    • 防御ブロックの配置と自機の弾とのあたり判定
    • 敵UFOの出現処理
    • ゲームオーバー/ゲームクリア画面表示の作成

ブロックの配置ですが、これを実装するとゲームのデバッグが大変めんどくさくなるります。なのでなるべく後回し & 実装しても非表示にするなどが必要でした。

成果物

成果物はGitHubにアップしました。 前回と同じリポジトリですが、ブランチを切ってそちらで作業しています。

github.com

作った感想

イカのゲームからこのゲームを作っている最中に気が付いたことですが

  • 意外と処理が膨らむ
    • 弾が爆発したら画像を差し替えてN秒後に消すなどゲームライブラリを使わないと結構コード量が必要です
  • ImageクラスはSpriteと同じように扱える
    • SpriteシステムがあるライブラリとImageクラスは似た操作が可能
  • 段々問題領域に対して理解が深まって前半と後半でコードスタイルがぶれている

今回、ゲームライブラリを一切使用しないピュアC#のみで開発しましたが、Unityなどのゲームツールを使用すれば便利な機能が色々あってゲーム作り以外の部分の苦労は少ないと思います。無料で使用できますしね。

特にゲームライブラリだと

  • 特にN秒経過したら画面から除去する
  • ImageをアニメーションしているようにN秒ごとに切り替える
  • 衝突判定

は必ず標準的に機能が提供されているため、わざわざ自分で実装する必要ないです。

今回は規模が前のより倍になったため、途中からコードが崩壊しかけてるのが実感できました。要素が多くなると変数が増加するのでそれらの整合性の管理や処理の順序、コード自体のボリュームで開発効率が少し落ちていました。少し構造は気にしながらコードを書いた方がよさそうです。

今回も完成が途中で危ぶまれましたがなんとか勢いだけで作りきることができました。

やっぱり短期間に勢いでガーっと作るのがよさそうです。