競プロっておいしいの?(仮)

Siv3Dを使って5日間でクソゲー作ったったwww(Siv3D AdC)

クソゲー製作期(Thread Throgh)

この記事は「Siv3D Advent Calendar 2017」の17日目の記事です。

この日はCombNafの日ですね!!!!!

ICPCと被せてすいませんでした。

CombNaf2 - 2017/12/17 13:00開始 - ニコニコ生放送

CombNaf2 タイムテーブル

色々やるよ!!!見てね!!!!!

さて、本題に入ります。

この記事は、このクソゲー紹介と、実装方法についてお話します

Thread Throughってどんなクソゲー

こんな感じで弾をよける運ゲーです。

これは7月末に5日間くらいかけて作ったものです。

5日間といっても昔のプログラムを再利用してこの時間なので、実際はもっとかかってます。

学祭に出しました。が、遊んでる小学生を見ませんでした。悲しい。

部内HighScoreはこちら

https://pbs.twimg.com/media/DI3lKBhUQAAYSeI.jpg:large

いや、化物。

こちらからダウンロードできます。

 

Thread Through.zip - Google ドライブ

ソースコード公開するの?

このプログラムのソースコードですが、全部を公開する気はありません。

ですが、部分部分で参考になる箇所はあるかと思いますので、直接私に聞いていただければお渡しするかもしれません。

いじりすぎていて、完成版のソースがなかったです。直してからGistに上げます。

その時は私のTwitter(@Nafmo2)まで。

バックアップが奇跡的にありました。勝ちました。
汚いソースですが、参考になるのであれば...どうぞ。

Thread Through ver 0.3(完成版)

実装(雑に)

  1. 自機の挙動

    この時点でできていたものを張るだけでした。最低。
    仕組みの説明としては、
    1.速度Aだけ座標を変化させます。
    2.Aに定数を加えて重力を作ります。
    3.キーが押されている時、Aから定数を引いて上に動かす力を加えます。
    これを毎フレームやります。
    これで、うまくいきます。数値の調整は必要ですが。

    void Phy(bool T) {
        y += dx;
        dx += g;
        if (T) {
    	dx -= a;
        }
    }
  2. 弾の挙動
    昔にシューティングゲーム作ったときのものを貼っただけです。
    というのは言い過ぎで、貼れなかったので参考にしながら書き直しました。
    毎回弾の数分だけループをまわして、
    弾構造体の中のFlagを見て使われていないものを初期化、発射準備をし
    発射し、発射されているFlagのものを全部の弾を確認することで列挙し、
    それぞれ座標を変えたり、はみ出たのでFlagを戻したりします。
    128~166行目あたりに書いてあります。
  3. 当たり判定
    円と円の当たり判定は三平方の定理を用いるとできます。
    これはそれぞれの「円の中心の距離を斜辺にした直角三角形」が作れることから言えます。
    残りの辺は 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();
    }
  4. 自機の軌跡
    ここが一番の難関でした。
    まず、初めは実装方法が何も思いつきませんでした。
    滑らかに線を描くなんてどうすればいいんだとなりました。
    ここで、振ってきた考え方が、
    「自機の現在座標の弾を置きまくって、その弾すべてについて座標を減らせばいい」
    .....天才!!!となりました。
    弾の管理にはデータ構造「list」を使いました。
    どうせすべての要素を見るのでランダムアクセスできる必要はなく、
    削除がすばやくできるところがいいと思ったからです。
    先に追加されたものからなくなるので、
    はみ出たらpop_front() を呼ぶだけですね、簡単に実装できました。
    思いつけば簡単というのはまさにこのことでした。
    Main.hの53行目の UpK() がそれです。
  5. タイトル画面とシーン分岐
    円を置いてクリックされたらシーンを管理している変数を変更しました。
    今回はシーンが少ないので、Switch文の分岐を使いました。
    mode=0,1,2 みたいな感じで分岐しました。
  6. 難易度、スコア記録。
    ここはわからなかったのでC++のファイル出入力を学びました。
    調べながらやったら案外さくさく進みました。

感想

実際ゲーム作ってみるのは久々で、毎回毎回挫折をしていました。

ん~できない。やーめた」と。

そのせいもあって競プロに逃げ、しばらくたっていたのですが、

クソゲーなら実装箇所も少なく単純にできるだろうということで、久々にやりました。

実際今まで投げ捨ててきたものから、いくつかの部分をあわせて作ることができました。

新しく書いた部分はどれくらいあるのだろうかという感じです。

とても簡単に実装できて、なおかつはまる人ははまるタイプのクソゲーを作れたかなぁと思います。

クソゲー今までの寄せ集め短期間で作れる」

という知見を得ました。

ぜひ遊んでみてください。そして結果ツイートしてみてください。

私が、喜びます。次も何かクソゲー作るかもしれません。

そして皆さんも諦めずに何か1本作ってみましょう。
簡単なもので構いません。その経験は絶対どこかに活きてくるので。

私はそのようにおすすめしたいです。

これで私の記事を終わります。長々とありがとうございました。

明日の記事は、ao1415さんの「暗号化とアーカイブ」です。