見出し画像

ゲーム制作初心者が初めて作るゲームで「FlappyBird」を作ったお話し

今回作ったFlappyBird


FlappyBirdとは


Flappy Birdは、2013年に開発されたシンプルなモバイルゲームです。プレイヤーは、画面をタップして鳥を操作し、上下に動かしながら緑のパイプの間を通り抜けることを目指します。鳥がパイプや地面にぶつかるとゲームオーバーになります。そのシンプルな操作と高い難易度が特徴で、短期間で世界中で大ヒットしたゲームです。

やったことや見たことがある人も多いのではないでしょうか?

なぜFlappyBirdを作ろうと思ったのか

この「FlappyBird」というゲームを作ろうと思った理由は以下の通りです:

  • ゲーム制作の基礎を学びたかった

  • 簡単なアルゴリズムで作ることができる

などの理由があります!
詳しく説明していきたいと思います。


ゲーム制作の基礎を学びたかった

ゲーム制作の勉強をするといっても最初何をしたらいいのか?
まずそんな疑問が浮かびました。

それもそのはず単にゲームを作るといっても様々なジャンルの勉強が必要になっていきます。恐らくこれはゲーム制作初心者全員が考える悩みなのではないでしょうか?

そこで学校の先生に聞いてみました

僕「ゲーム制作の勉強をする時に何から勉強したらいいですか?」
先生「んー、とりあえず一つゲームを作ってみるといいよ」

と教えられました。

つまり先生は

「ゲームの制作過程でわからないことや必要になった技術をその時々で勉強していくことで結果的にゲーム制作に必要な知識・基礎を学べる」

ということを伝えたいんだと思います。

なるほど。と思いました
今まで自分はゲームを作る技術部分にだけ焦点を当てて考えていました。なので今回のまずは「作っちゃう」というのを目標にする勉強の仕方はとてもよさそうだなと思いました。

ということでまずは簡単に作れるゲームを作ろうと思いました。


簡単なアルゴリズムで作ることができる

初心者が簡単に作れるゲームとは何があるんだろう?
と思い初心者が簡単に作れるゲームとは何があるのかを調べたところ

初心者が作ると勉強になるゲーム20選
というサイトを見つけました

ここで見つけた
FlappyBirdというゲームがぱっと見でアルゴリズムが思い付き、作りやすく、複雑そうではなかったので最初に作るゲームに選びました。

正直ここは迷っていてもきりがないので直感で選びました(笑)

制作環境

  • C++14

  • DxLib.vc140

どんなゲームになったのか


できたものは、
障害物に当たらず何秒間生き残れるかを競うシンプルなゲームです。


操作方法はSpaceキーのみです。

プレイ画面
リザルト画面

制作にかかった日数は約10日間です!
正直早いとは言えないですね(笑)

新たに勉強したクラスの概念や、障害物のランダム生成、オブジェクト指向による新しいエラーに時間を取られてしまいました。

苦戦したこと

作っていく中で特に苦戦したことは以下の3つです

  • キーを押した瞬間の処理

  • オブジェクト指向プログラミング

  • 障害物の管理


キーを押した瞬間の処理

Spaceキー入力をしてジャンプさせよう!

そう思いキー入力の関数を使いました。
そしたらなんとキーを押している間はずっとジャンプしてしまうんです。

まぁそりゃそうだろって感じですよね(笑)

キーを押した瞬間だけ処理をさせたいと思い色々調べました
まずDxLibには押した瞬間だけ判定するという関数はないようです

なので自分でアルゴリズムを考えるしかない…
ここでどうしたらいいのかと永遠と考えていました

そこで先生に聞いてみました。
そしたら

前回の入力の状態が「false」かつ今回の入力状態が「true」 の時がキーを押した瞬間だよね

と教わりました。

なので以下のように修正しました!


//キーの取得を管理する
void GetKey() {
	int m_spacePrevState = m_spaceState;						//key入力の情報を保持
	m_spaceState = CheckHitKey(KEY_INPUT_SPACE);				//keyの入力を取得

	//Spaceが押されれていて直前フレームまでSpaceが押されてない時
	if (m_spacePrevState == false && m_spaceState == true) {
         //ジャンプ処理
	 
	}
}

これでキーの押した瞬間の入力は上手くいきました!


オブジェクト指向プログラミング

障害物は勉強し始めたばかりのクラスを使って作ろう!
と思い実際に使って作ってみました。

これがなかなかに難しく。概念自体は前に勉強した基本情報技術者で勉強はしていたのですが。実際に使うとなると色々な壁に当たりました。

やはりオブジェクト指向は難しいですね(笑)

先生や参考書、ネットなどを参考に勉強していきなんとか形にすることはできましたがまだな使い方です。


障害物の管理

複数の障害物のインスタンスをどうやって管理
するのかで以下の方法を試しました

  • ポインタ配列で管理

  • リストで管理

の二つです。

最初ポインタ配列を使って管理をしようと思ったのですがまだ理解が足りなくdeleteの部分でエラーを起こしてしまいました。

まだ使うのにはポイント、クラスの理解が足りていないと思い今回はリストを使って管理することにしました。

感想

今回初めてC++,DxLibを使ってプログラムを作ってみました。
作れば作るほど自分に足りない部分が多く見えてきてまだまだ課題がたくさんあることを実感します。オブジェクト指向という概念ももっと勉強する必要がありますね。

色々な課題はありますが作っている時の悩みが解決した時や、作ったゲームをほかの人に遊んでもらうというのは本当に嬉しいものです!

これからも頑張ってゲームを作っていきます!


この記事が気に入ったらサポートをしてみませんか?