Siv3Dを使って5日間でクソゲー作ったったwww(Siv3D AdC)
クソゲー製作期(Thread Throgh)
この記事は「Siv3D Advent Calendar 2017」の17日目の記事です。
この日はCombNafの日ですね!!!!!
ICPCと被せてすいませんでした。
CombNaf2 - 2017/12/17 13:00開始 - ニコニコ生放送
色々やるよ!!!見てね!!!!!
さて、本題に入ります。
この記事は、このクソゲーの紹介と、実装方法についてお話します
Thread Throughってどんなクソゲー?
#SIv3D で作成
— Nafmo (@Nafmo2) 2017年7月27日
所要期間 5日くらい?
糸通し系クソゲー。ただ弾を避けるだけ。
色々余計なものついてますがひとまず中身はこれで完成ってことで....
バグ見つからないでくれ頼む... pic.twitter.com/fzPgsbxAxk
https://t.co/qIypCP6T5B
— Nafmo (@Nafmo2) 2017年6月14日
忙しい人のためのゲームひな形 for Siv3D v1.0.1を使わせていただきました
なんかできた...(ゲーム久々すぎてこれだけでも嬉しい
ここからどうなるかはちょっと謎() pic.twitter.com/JZ6GjFBI67
こんな感じで弾をよける運ゲーです。
これは7月末に5日間くらいかけて作ったものです。
5日間といっても昔のプログラムを再利用してこの時間なので、実際はもっとかかってます。
学祭に出しました。が、遊んでる小学生を見ませんでした。悲しい。
部内HighScoreはこちら
いや、化物。
こちらからダウンロードできます。
あのクソゲー、Thread Throughって名前にしました。まんまです。
— Nafmo (@Nafmo2) 2017年9月3日
どうせバグが残りまくってるので要望とかバグとかここ見づらいとか死んでくれとか、そういったことはどんどんリプください。
ココらへんからDLできる気がします。https://t.co/LuRHoW24Wo
Thread Through.zip - Google ドライブ
ソースコード公開するの?
このプログラムのソースコードですが、全部を公開する気はありません。
ですが、部分部分で参考になる箇所はあるかと思いますので、直接私に聞いていただければお渡しするかもしれません。
いじりすぎていて、完成版のソースがなかったです。直してからGistに上げます。
その時は私のTwitter(@Nafmo2)まで。
バックアップが奇跡的にありました。勝ちました。
汚いソースですが、参考になるのであれば...どうぞ。
実装(雑に)
- 自機の挙動
https://t.co/qIypCP6T5B
— Nafmo (@Nafmo2) 2017年6月14日
忙しい人のためのゲームひな形 for Siv3D v1.0.1を使わせていただきました
なんかできた...(ゲーム久々すぎてこれだけでも嬉しい
ここからどうなるかはちょっと謎() pic.twitter.com/JZ6GjFBI67この時点でできていたものを張るだけでした。最低。
仕組みの説明としては、
1.速度Aだけ座標を変化させます。
2.Aに定数を加えて重力を作ります。
3.キーが押されている時、Aから定数を引いて上に動かす力を加えます。
これを毎フレームやります。
これで、うまくいきます。数値の調整は必要ですが。void Phy(bool T) { y += dx; dx += g; if (T) { dx -= a; } }
- 弾の挙動
昔にシューティングゲーム作ったときのものを貼っただけです。
というのは言い過ぎで、貼れなかったので参考にしながら書き直しました。
毎回弾の数分だけループをまわして、
弾構造体の中のFlagを見て使われていないものを初期化、発射準備をし
発射し、発射されているFlagのものを全部の弾を確認することで列挙し、
それぞれ座標を変えたり、はみ出たのでFlagを戻したりします。
128~166行目あたりに書いてあります。 - 当たり判定
円と円の当たり判定は三平方の定理を用いるとできます。
これはそれぞれの「円の中心の距離を斜辺にした直角三角形」が作れることから言えます。
残りの辺は x,y座標の差の絶対値ですね。
残りは等式を不等式に変えるだけです。
参考記事:C言語〜ゲームプログラミングの館〜
飛んでいる弾すべてに対してif文で対応しました。
( (弾と自機のx座標の差)^2+(弾と自機のy座標の差)^2 )<(自機と弾の半径の和)^2
の時、弾はぶつかっています。
158行目~あたりに書いてあります。
for (int i = 0; i < BMAX; i++) { //1行目:三平方 二行目:画面外 3行目:当たり判定を消すためのAdminフラグ //P.Gor()はGameOver関数。 if ((std::pow(P.GetX() - bal[i].GetX(), 2) + std::pow(P.GetY() - bal[i].GetY(), 2) < std::pow(15, 2) && bal[i].NF() || P.GetY() < 0 || P.GetY() > 480) && NoAt) { P.Gor(); }
- 自機の軌跡
ここが一番の難関でした。
まず、初めは実装方法が何も思いつきませんでした。
滑らかに線を描くなんてどうすればいいんだとなりました。
ここで、振ってきた考え方が、
「自機の現在座標の弾を置きまくって、その弾すべてについて座標を減らせばいい」
.....天才!!!となりました。
弾の管理にはデータ構造「list」を使いました。
どうせすべての要素を見るのでランダムアクセスできる必要はなく、
削除がすばやくできるところがいいと思ったからです。
先に追加されたものからなくなるので、
はみ出たらpop_front() を呼ぶだけですね、簡単に実装できました。
思いつけば簡単というのはまさにこのことでした。
Main.hの53行目の UpK() がそれです。 - タイトル画面とシーン分岐
円を置いてクリックされたらシーンを管理している変数を変更しました。
今回はシーンが少ないので、Switch文の分岐を使いました。
mode=0,1,2 みたいな感じで分岐しました。 - 難易度、スコア記録。
ここはわからなかったのでC++のファイル出入力を学びました。
調べながらやったら案外さくさく進みました。
感想
実際ゲーム作ってみるのは久々で、毎回毎回挫折をしていました。
「ん~できない。やーめた」と。
そのせいもあって競プロに逃げ、しばらくたっていたのですが、
クソゲーなら実装箇所も少なく単純にできるだろうということで、久々にやりました。
実際今まで投げ捨ててきたものから、いくつかの部分をあわせて作ることができました。
新しく書いた部分はどれくらいあるのだろうかという感じです。
とても簡単に実装できて、なおかつはまる人ははまるタイプのクソゲーを作れたかなぁと思います。
「クソゲーは今までの寄せ集めで短期間で作れる」
という知見を得ました。
ぜひ遊んでみてください。そして結果ツイートしてみてください。
私が、喜びます。次も何かクソゲー作るかもしれません。
そして皆さんも諦めずに何か1本作ってみましょう。
簡単なもので構いません。その経験は絶対どこかに活きてくるので。
私はそのようにおすすめしたいです。
これで私の記事を終わります。長々とありがとうございました。