スクールマスコットフェスティバル -ソフト編- +ゲーム作成のノウハウ

どうも、無事卒業を迎えることができたメタセコ(ハマコー)です。

先日、コンピュータフェスティバル2015 in 松江の自由部門において「スクールマスコットフェスティバル」が第三位という評価をいただきました。
遊んでくださった皆様、投票してくださった皆様ありがとうございました!

この記事は、スクールマスコットフェスティバルのソフト編ということで、このゲームを作る上で苦労した点、今後のシス研のゲーム班の肥やしに慣ればいいと思い、ノウハウ等を綴っていきます。
ハード編はたけさんの記事をどうぞ。

以下、続きを読むからどうぞ。

今回作成した「スクールマスコットフェスティバル(以下、当ゲーム)」ですが、ソースコード等はGitHubにて公開しております。
遊んでもよし、参考にしてもよし、批判するのもよしです。

まずは開発環境から。

  • IDE: Microsoft Visual Studio Express 2013 for Windows Desktop
  • ライブラリ: DXライブラリ
  • 言語: C++(バージョンは気にしないでください)

C++を使っていますが、C言語で基本的な条件分岐(if文、switch文)、ループ制御(whileループ、forループ)が分かればシス研で展示するようなゲームは作れます。
ゲームの基本はif文でフラグをチェックして、どのような処理をさせるかを切り替えることです。
例えば・・・

  • タイトルフラグ→タイトル画面を表示
  • メニューフラグ→メニュー画面を表示
  • ゲームフラグ→ゲーム画面を表示、ゲーム処理
    • キー入力→キーに対応した処理
    • 当たり判定
    • オブジェクト移動
    • スコア計算  etc…

ゲームの大まかな構成はこんな感じでいいと思います。というか大抵こんな感じになります。

当ゲームもタイトル画面、曲セレクト画面、ゲーム画面という風に作っています。
Main.cppを見ると分かると思いますが、フラグの条件にそった処理(Title関数やSelect関数、Game関数など)が実行されるようになっています。

ここで、ワンポイントです。

-タイトル画面では少しでも動作を見せる-

タイトル画面で何にも動かないゲームをプレイしたいと思いますか?
なんか寂しいですし、動くかどうか不安を持つような気がします。

そこで、タイトル画面を少しでも動かして、まずはプレイして貰えるようにした方がいいです。

簡単な動作が、「Start!」をちらつかせることです。
マウスのクリックであれ、コントローラの特定キーであれ、ゲームのスタート方法が分からなければ、ゲームはプレイしてもらえません。
ゲームをプレイするための動作を強調することで、少しでもプレイしてもらいやすくしましょう。

当ゲームでは、適当にカウンターを作って、30カウント以下だと「Push to Start!」を表示、31以上60カウント以下だとボタンの絵を表示、そして60カウントになるとカウンターを0にする。ということをしています。

こんな感じの処理はすぐに導入できると思います。

つぎのワンポイントです。

-画面推移の際のアニメーションを入れる-

要は文字やイラストを次画面に入る際に移動させる、ということです。
スタートボタンを押して一瞬で次の画面に行くのも時には良いかもしれません。
しかし、パッ、パッと画面が変わると手抜き感が出てくると思いませんか?(私は思っているのですが)
ここでアニメーションを入れることで、プレイヤーに「おっ?」と思わせることができ(ると思い)ます。

ここの画面推移のプログラムというか、アルゴリズムは私が2年生の時に作ったものからほぼ変えていません。
個人的に気に入ってるだけですが(笑)

一度だけ、フェードイン&フェードアウトで画面推移を作ってみましたが、なんか動作がもっさりしてたのでやめました。

当ゲームでは、こちらも適当なカウンターを作り、30ループで現在地から目的地に移動するようにしています。
関数でいうと「MovePoint」という空間移動<テレポート>に似た能力ぽい名前の自作関数を使っています。
現在地、目的地、移動量記憶用変数、移動カウント数を渡すと、移動量記憶用変数に代入してくれます。

またもやワンポイント×2

-ゲーム用自作関数ファイルを作っておく-

-動作の担当毎にソースコードを分割する-

少し上の内容が掛かってきますが、自作関数のファイルを作っておくとかなり便利になります。

私自身は、ヘッダファイルとか分割コンパイルが3年のころ上手くいかなくて諦めてましたが(笑)

当ゲームのプログラムファイルだと「Function.cpp」と「Function.h」が自作関数ファイルに該当します。
この那珂には当たり判定、センターのポイントを返すもの、移動量を計算するもの、円状のものを表示する関数など色々入れています。
当ゲームでは使用していない関数や、当ゲーム専用の関数もありますが、目を瞑ってください。

そして、「Common.h」という共通項をまとめたファイルも作っておくとかなりスッキリするので、オススメです。

これらの何が良いかといいますと、Mainのソースコードが格段に短くなります。
最近、ソースコードを短くすることに快感を覚え始めましたが、それとは別に、メリットはまだあります。

ソースコードが短くなり、分割されると、

  • デバッグが容易になる。
  • 機能拡張が容易になる。
  • 複数人での共同開発が楽になる。  etc…

などというメリットがあります。

ソースコードを部分部分に分割するお陰で、どこに問題があってうまく動作していないのかの、問題特定が楽になります。
全く分割していないソースコードだと、一つ一つif文などで弾きながら調査する羽目になってしまいます。

部分部分に分割できているということは、新機能の挿入も楽ということに気付きますかね?
ソースコード同士が別々で動作しているならば、グローバル関数を変にいじらない限り、動作は安定している上に、新しい動作(関数)を付け足してもそこまで影響を与えません。
もしうまく動作しなければ、付け加えた部分のデバッグをすればいいので、開発が楽に進みます。

そして、極めつけが複数人での開発が楽になるということです。
変数名さえ決めてしまえば、それぞれの担当する動作内でのみ値を変化させるように作っていけばいいので、一つのファイルを複数人で見ながら作るよりも格段に楽になるはずです。

 

ここまでは、私がゲーム作りで学んだノウハウ(って呼べるかどうかは分かりかねますが)を書いてきました。

続いては、当ゲームを作る上で苦労した点を書いていきます。

苦労したランキングをするなら次のような感じですね。

  1. 譜面読み込み
  2. 曲名読み込みの一般化
  3. ノートの動作
  4. 楽曲セレクト画面
  5. (以下略)

譜面読み込みや曲名読み込みはテキストファイル(.txt)から書かれていることを単純に読み込むだけですが、か~な~り苦労しました。

譜面ファイルの形式は、【[分分:秒秒.ミリ秒ミリ秒]ボタン】のようにしていますが、数字以外の部分を省き、尚且つ文字から数値に変換して代入するということが詰まりました。
メモリのアクセスエラーになったり、思い通りの数値が読み込めなかったり大変でした。

ポイントをまとめると、

  1. 「FileRead_gets」で一行取り出す
  2. token(char型変数)に「strtok」でトークン(一定区間の文字列)を渡す
  3. atoiで数値に変換、代入
  4. 2. 3.と同じことをし、繰り返し

そして、なぜかエラーになってしまうのが読み込みテキストファイルの行末に空行を入れる。ということです。
ドツボにはまると徹夜かつ6時間くらい何もできなくなるので、マジで注意です。
あと、文字コードはUTF-8かShift JISにするか決めておいたほうが良いです。

曲名読み込みですが、これはおなじみ「strcpy」を使用することで文字列を渡すことが出来ます。

ノートの動作ですが、タイミングを合わせるために時間に下駄履きさせたり、どこに向かわせたりとか、だんだん大きさを変化させたりとか、結構工夫しています。
リズムゲームの根幹となる部分なので、結構力をいれて開発しました。
追加機能として、ノートがランダムに飛ぶようにも出来ますが、同時押しの場合の処理を加えられなかったので、リリースにはしてません。
今後時間が空けば追加機能で強化していきたい部分でもあります。

楽曲セレクト画面もコンフェス展示時と、追い出し会待機時間ではかなり変わってきています。
具体的には、

  1. 曲選択がループ(最初と最後の項目が隣同士に)するようになった
  2. 曲選択時に選択中の曲をBGMで流れるようになった
  3. 難易度の選択が可能になった

正直言って、松江から津山に帰ってから2時間弱で実装できました。
テキストファイル読み込めないエラー事件が無ければ、展示時にでも実装できていた気がします。

この部分の実装ができたことで、さらにリズムゲームぽくなりました。

 

譜面作成についてですが、松さんがC#で作ってくれました。
DXライブラリでプレイ画面ぽいエディタが作れれば一番なのですが、時間と力足らずで作ることが出来ませんでした。
この辺りは松さんの記事を参考にしていただければと思います。

 

ここまで、ノウハウや苦労した点などグダグダと書いてきました。
この記事が、これからゲームを作ろうとしている人のタメになればいいと思います。

5年間シス研のゲーム班ときどきCG班として活動してきましたが、ゲーム作成を通じてプログラミングが出来るようになるというのは直結すると思います。

 

余談ですが、SEやプログラマになろうと考えている人は、C#と分割コンパイルが最低限分かるようになっておくと、就活で有利かもしれません(!?)
(会社や時代で変化するでしょうが)オーソドックスなシステム屋さんだと、Visual StudioでC#を用いてソフト開発とかが主になるかと思います。


コメントを残す

メールアドレスが公開されることはありません。