PG日誌

読者です 読者をやめる 読者になる 読者になる

PG日誌

主にc#の事を書いています

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

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と同じように扱える
    • Cocos2d-xのSpriteとまぁまぁにてる操作が可能
  • 段々問題領域に対して理解が深まって前半と後半でコードスタイルがぶれている

今回ゲームライブラリを一切使用しないピュアC#のみで開発しましたが、Unityなどのゲームツールを使用すればライブラリなどもありますし、苦労は少ないと思います。無料で使用できますしね。

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

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

は普通にクラスなり関数を呼べば良いケースが多いと思いますので、わざわざ自分で開発する必要ないですね。

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

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

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