コードについて自分で解説。見直しにもなっていいかもしれない、と思い書いた。
C++歴一年ほどで作りました。設計等はこれまで何にも学んでなかったです。
ここはもっといい関数、書き方があるよ!と思ったら何なりと仰ってください。
https://github.com/Hirose-Yuto/school-festival-work/tree/master これのcpp,hファイルです。別に見なくとも読むのには問題ないです。
DXライブラリを使ってゲームを作りました。開発環境はVisual Studioです。
ゲームの概要
地球に侵略してきた、地球の反対側にいる敵にロケットを発射させて当てて駆逐しようぜってゲーム。 非常に伝わりにくかった。これは反省。
主に万有引力の法則を用いて制御した。
クラスについて
一旦クラスについて軽く説明。
・Draw
・Handle
・Mouse
それぞれ、Drawはフォントや色、Handleは画像データ、 Mouseはマウス、に関するものをまとめました。メンバ変数、関数ともに全てstatic。同じ系統は系統で管理したかった。初期化(?)も同じ場所でまとめた。
・gameframe
ゲーム全体の枠組みに関するもの。これは表示した方が早い。
class gameframe {
public:
void doMainLoop(int);
private:
GameState stage=GameTitle;
enum GameMainMode { Select, FromEarth };
GameMainMode GameMainSelect = Select;
bool GameResult;
void drawGameMain();
void drawGameTitle();
void drawGameOver();
void drawGameClear();
void drawCredit();
ThrowFromEarthGame EarthGame;
};
・Game
・ThrowFromEarthGame:public Game
・NiconicoComment
ゲーム本体に関するもの。
Gameでゲームの基本的な流れ。
その子クラスとして、ゲームの細かい部分を担当したThrowFromEarthGame。ゲームの種類を増やすときに苦労しないようその形にした。結局作らなかったが。(オブジェクト指向といったところか?)
NiconicoCommentはクリア演出周り。ニ◯ニ◯風の演出。名前でお察し()。
プログラムの大まかな流れ
main()でgameframe.doMainLoop()を呼び出し、ここで主にループを行う。
enumとswitchでゲームの状態を管理し、ゲームが選択されたらGameのループに入れる。ここでループを別に用意したのは、ループ外の処理が無駄だから。
ゲームを終えたら、結果に応じてゲームクリア、オーバーを表示して最初に戻る。
GameMain()について
まず初期化。ここでループに入る。
ThrowFromEarthGameでは最初に値を設定する必要があったので、設定させる。Enterキーが押されたら計算の初期条件を整えて演算開始。
(ちなみにThrowFromEarthGameでは第二宇宙速度を超えるかで演算を変えた。軌道が楕円になるかどうかの問題。)
演算するからには現実と時間の進み具合を合わせなきゃいかんので、ループ一周ごとに時間を計測してそれを演算に反映。
要所要所にゲームで必要な判定やゲームリセット、ゲーム終了を用意。
ゲームをクリアしたらクリア演出。そしてdoMainLoop()のループに戻す。
反省、言いたいこと
時間を計測して、と言っていたがいわゆるフレーム制にしてよかったかもしれない。今回のゲームではあまりいらなかったが、他のゲームでは一周の時間を固定した方が処理がしやすそうだ。
あと、クリア演出で表示されるコメントをプログラムに直接書き込んでしまったが、vectorでまとめたならtxtファイルからでも読み込む形式にすればよかったと思う。
普通ゲームを作るなら、
アイデア→デザイン→設計→コーディング→修正
という感じの流れだと思うが、
アイデア→コーディング→修正→デザイン→それに伴う修正
とかいう行き当たりばったりのことをしてしまった。設計は正直後付け。
部活で作品を出すのは自分だけじゃないんで、ゲームを立ち上げたりするランチャーも作った。
この作品の反省を生かして、その時は同級生も利用しつつ前者の流れで作った。慣れたのもあると思うが、非常に作りやすかった。
デザイン関係はとても苦労した。実際にこの記事を読めばその未熟さがわかる←
最後に
ここまで読んで頂き、ありがとうございました。
では。