まーぼうの書きたいことをたらたらと

研究したりゲームしたり作ったりの日記

2日でゲームのプロトタイプを作ってみた(けど無理だった)

院試の出願が迫ってきて、書類の準備に追われて最近大変です。実際はそこまで大変じゃないですけど、ペンで文字を書くのがどうにも辛い……大学入って自分でパソコン持ってからパソコンでやる作業が格段に増えたのを実感しました。

……という近況はさておき、今回は土日の2日間でゲームのプロトタイプを作ってみようとしたことを書いていきます。

経緯

プロトタイプを作る数日前、自分の作ったゲームの感想についてのブログ記事を見つけました。

gamefondness.blog.fc2.com

こういう記事見るとやっぱり嬉しいですね……ということで何か作りたいモチベが上がったので、土日で作るかというノリになりました。traPの方で3時間でゲームを作る部内ゲームジャムがあった直後なので、短時間でゲームを作るのに挑戦したいなというのもありました。パズルゲームの案は昔に考えていたのでそれを採用しました。

ゲームの概要

辺の中点同士を結ぶ導線を含んだ正六角形のブロックを並べて導線をつないで、導線に光を通してブロックを消し飛ばそう!みたいなパズルゲーム

ブロックの種類は色々あって、得点を稼ぐ他にもお邪魔ブロックを送ったり、お邪魔ブロックの侵入を妨害したりするブロックもあり、色で区別できる。連続して同じ種類のブロックを消すと効果が高くなるのと、連鎖の後ろのほうで消したブロックの方が得点が高くなる。

実装

環境

素早く作るために使い慣れているVisual Studio 2017とDXライブラリの組み合わせを使いました。

正六角形の描画

図形として正六角形を使う機会が多そうなので、こいつの描画を手軽にできるようにする必要があると考え最初に実装しました。

中心(center)と中心から1つの頂点に向かうベクトル(baseVec)が分かれば正六角形を表せそう。描画は中心と隣接2頂点の三角形を6個描画した後、辺を描画すれば上手くいきました。辺と内部の色を別にしたい時のため、辺と内部の描画を分けました。辺を先に描画すると内部の三角形に潰されるので後で描画しないといけませんでした。

正六角形と導線をまとめたブロック

次にプレイヤーが置くものであるブロックを実装しました。

center+baseVecで表される頂点を基準の頂点とし、そこから時計回りに0,1,2,3,4,5と辺の番号を定めます。ブロック(Blockクラス)は正六角形の情報とどこに導線があるかだけ知っている単純なクラスにしました。ブロックの種類はクラスの継承を用いて表現することにしたので、Blockは純粋仮想クラスとしました。

ステージとブロック設置

プレイヤーがブロックを置けるようにします。

ステージは正六角形の集合。どんなブロックが置かれてるかとステージの大きさだけを持っている単純なクラスに。位置をint型で持っていると楽だと感じたのでint型の2つの値を持つPutPos型を作りました。PutPos型の座標系は下図のように表現。なお、DXライブラリの座標系はx軸が右、y軸が下向きに正の方向で、原点は左上にあります。

f:id:mabo168general:20170621134617p:plain

起動して導線を通る

ブロックができたので、ゲームの肝である「導線に光を通す」の実装。

ブロックがあるマスにカーソルを合わせると、今いるマスにある導線から光が通り始めます(これを起動と呼ぶ)。光は導線に沿って動き、導線が途切れるかスタート位置にたどり着く(=導線が回路状になってて1周した)時に動き終わるという仕組みで良いでしょう。まだ実装できていないが、動き終わったら爆発アニメーションでも入れて通ったブロックを消します。

導線に沿って動く挙動は、「目的地を設定する」→「目的地に沿って動く」→「目的地との距離が速さの1/2以下になったら目的地に到達したと判断して、次の目的地を設定する」というようにしました。次の目的地の設定は、導線は途中の枝分かれできないので、ステージ情報から一意に求められます。

デモ段階なので、どの導線からどの方向に進むかは設定できていません。

未実装部分

パズルゲームとして得点計算したいのでブロックを消して得点計算して……みたいなことをしたかったけれども、時間切れでできませんでした。時間がある時に実装したいです。 この他にも、ブロックの回転、カーソルを分かりやすく表示すること、制限時間、ステージの外にブロックを置けないようにする.etcたくさんありますね……

動画

f:id:mabo168general:20170621134011g:plain

コード

github.com

おおよその所要時間

git見れば分かるかなと思ったけど、全然わからないのであやふやな記憶で書いています。

したこと 所要時間
正六角形の描画 2h
ブロック 2.5h
ブロック設置 3h
起動して導線を通る 6h

反省

絶対座標を使っているところと、相対座標を使うところがごっちゃになってたのが大きな反省ですね。デバッグの際に頭がこんがらがったのは時間がかかった大きな原因です。

あと、プロトタイプ作りなのに設計する際に細かい所を考えすぎた。例えば、PuzzleSystem::FlowCircleがステージの中心座標を使うことが多いのでそのポインタを持っておいて楽しとくべきかとか。少しは考えるべきだけども、悩みすぎるといけないなと感じました。

感想

1日目の途中で急用ができて2時間くらいしかできなかったので、もう少し実装したかったです。それと同時に、あとは回数重ねて慣れていかないと実装の遅さは改善できないと実感しました。また、入力管理のライブラリと2次元ベクトル周りのライブラリがあって楽ができたので楽するためのライブラリを作りたいです。

あと純粋に、短時間でコードを作るのは楽しかったのでまたやりたいです。ここまで読んでくださりありがとうございました。