えーー！たのれんの工嶺祭担当箇所がバグだらけ！？

たのれん、この仕事向いてないんじゃないの？
# はじめに
この記事は[長野高専 Advent Calender 2022](https://qiita.com/advent-calendar/2022/nnct "長野高専 Advent Calender 2022") 4日目の記事です。

こんにちは。長野高専電子情報工学科4年、チュウニズム最高レート17.00のたのれんと申します。記事の執筆は初めてとなります。よろしくお願いします。

2022年10月21日(金)～10月24日(日)にかけて開催された第57回工嶺祭で、4Jの「I先生の授業で各々が作成したゲームを展示する」という企画のゲームランチャーの開発を担当しました。ランチャー開発の裏話とかなんとかを書けたらなと思っています。
この記事はSiv3Dのプロモーションを大量に含む読み物です。技術的なことは多分ないです。

# 経緯とか
そもそも「I先生の授業で各々が作成したゲームを展示する」という展示企画自体が決まったのは夏休みに入る前でした。
結局操作デバイスにはマウスとキーボードを使ったのですが、当時はコントローラーで操作させるつもりだったそうです。
Arduino等を使って自作のコントローラーを作るにしろ、既存のゲームパッドを使ってJoyToKeyで入力させるにしろ、それぞれのゲームで操作方法がバラバラなので、そこの対応をしなくてはなりません。
その作業は夏休みの間にやればいいかな～なんて思ってたりしたのですが、インターンに行ったり[某音ゲー](https://osu.ppy.sh/home "Osu!mania")に死ぬほどハマってたりしたら夏休み終わってしまいました。

そんなこんなで開発もせずになんとな～く時間が進んでいき、工嶺祭1週間ほど前までに迫ってきました。
普通ならかなり焦らないとまずい状況ですが、私には当てがありました。
それは**Siv3D**です！！！！！

## Siv3Dって何～？
> **Siv3D**(シブスリーディー)は、2D/3D ゲーム、メディアアート、ビジュアライザ、シミュレータなど、可視化やインタラクションに関わるプログラムを、**非常に短い、楽しく簡単なコード**で記述できる**モダンな C++ フレームワーク**です。

強そう(Siv3D公式リファレンスより)


分かる人向けに言うと、C + OpenGLの完全上位互換みたいなもんです。
出来ることを簡単にまとめると
* 図形や画像、テキストの描画
* 図形同士やマウスポインタとの当たり判定
* マウス入力やキーボード入力の取得
* ゲーム画面のシーン管理システム
* テキストファイルやiniファイルなどのファイルシステム

などを提供してくれます。

要するに、 **図形描写とかキー入力とか簡単にできるので、こういうアプリ開発に向いてる！** ってことです。
ゲームランチャーは、このSiv3Dを使って作っていきます。

ですが、いくらSiv3Dが優れていようともいきなり「1週間でゲームランチャーを作ってください」と言われてしまうと普通に困ってしまいます。
しかし、私には秘策がありました。
それは、**Siv3Dにはこういったゲームランチャーのサンプルがある**ということです！！！！！
サンプルのページは[ここ](https://zenn.dev/reputeless/books/siv3d-documentation/viewer/course-game-launcher)

# ランチャーの制作
では、先程のサンプルに改造を施してゲームランチャーを作っていきましょう！
サンプルは、
1. ゲームランチャー.exeがあるディレクトリ内に、各ゲームのフォルダを置く
1. 各ゲームのフォルダ内にlauncher_info.iniというiniファイルを置く
1. ゲームランチャー.exeは、各ゲームのフォルダを走査しlauncher_info.iniファイルを見つける
1. launcher_info.iniにはゲームのパスや製作者などの情報が書かれており、ゲームランチャー.exeはそこから情報を取得する
1. 取得した情報をもとにゲームの配列を作って内部でなんやかんやする

といった構造になっています。
つまり、実行するゲームファイルのパスやタイトル、製作者等の情報が書かれたlauncher_info.iniファイルが1ゲームにつき1つ必要というわけです。

**launcher_info.iniファイルが1ゲームにつき1つ必要というわけです。**

## launcher_info.iniを全ゲーム分作ろう！
作りました

## 背景を強化してリッチなゲームランチャーにしよう！
作って～って言ったらべたちゃん(@BetAmoto)が作ってくれました。感謝

## 仕上げに入ろう！
後はEscキーでゲームランチャーが落ちないようにしたり、キーボード入力とマウス入力両方に対応させたり、ランダム選択を作ったり...
\ちょっと待った！/ ﾅﾝﾀﾞｯﾃｰ
このままでは一目見てわかりやすいゲームが少ないんじゃないか？これは展示として適していないのではないか？
ということで、シンプルで楽しいゲームを作りましょう

## ゲームを作ろう！
用意する物は簡単！
* Visual Studio 2022
* Siv3D 0.6.5

これだけです！
後はSiv3Dの機能の一つであるSceneManagerを使ってタイトルシーンとゲームシーンに分けてプレイヤークラスと障害物クラスを作って...

出来ました～！
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">作ったゲームの紹介1<br><br>工嶺祭のためにSiv3DでFlappy Birdもどきを作りました。<br>製作期間は大体2日くらいです。<br><br>お客さんがプレイするには思ったよりも難易度が高くなってしまい、「ゲーム展示」の難しさを実感しました。<br>動画は難易度をかなり下げたものですが、そちらの方がウケが良かった気がします <a href="https://t.co/VMGxWG2y4W">https://t.co/VMGxWG2y4W</a> <a href="https://t.co/zC264ND2S7">pic.twitter.com/zC264ND2S7</a></p>&mdash; たのれん (@ninjinnokakoi) <a href="https://twitter.com/ninjinnokakoi/status/1584191449813262337?ref_src=twsrc%5Etfw">October 23, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

見てもらったらわかると思うんですけど、当たり判定、キー入力、エフェクト、画像描画、シーン管理機能など、ゲーム制作に必要な機能一式が網羅されているのがSiv3Dです！
みんなもSiv3D、使おう！

## 完成！
出来ました～
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">工嶺祭2日間お疲れさまでした。<br>私は、4Jのメンバーそれぞれが授業で作成したゲームを展示できる形にするためのランチャーを作りました。<br>ランチャーはSiv3Dを使って1週間弱で作りました。<br>ランチャーの基本的なシステムはSiv3Dのサンプルに上がっているものを使用しています。<br>サンプルに感謝 <a href="https://t.co/fOWgzi9WTo">pic.twitter.com/fOWgzi9WTo</a></p>&mdash; たのれん (@ninjinnokakoi) <a href="https://twitter.com/ninjinnokakoi/status/1584190056373231616?ref_src=twsrc%5Etfw">October 23, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
タイムは7日です

# 終わりに
完走した感想ですが、スクロール可能なテキストボックスを作るのがちょっとめんどくさかったです。Siv3DはGUI(ボタンとかスライダーとかテキストボックスとか)の機能は提供されていますが、SimpleGUIと名前の付いている通り少し機能が小さめなので、将来的にGUIの機能が豊富になったら嬉しいな～...
毎日夜11時から4時くらいまで開発するのは流石にやめた方が良かったです。初めてのちゃんとした一般展示なので、ちょっと気合入れ過ぎました。まあでも楽しかったです！

あ！！！！！！！！！！！！

長野高専Siv3D Discordサーバーがあるらしいですよ！
作ったゲームを投げあったり、わかんない所を質問したりしてます。
それと、10人集まると無料でSiv3Dの開発者であるRyo Suzukiさんを長野高専にお呼びして講演会を開くことができちゃいます！
来たい方はぜひご連絡下さい！現在7人います！