===== マップファイルを外から読み込みたい欲がある ===== せっかくエクセルでマップを作れるようになったし。\\ そろそろファイルを外から読み込んでみたいよね。\\ 実行ファイル←マップファイル\\ これができると、マップが少しよろしくないなぁ。と変更したときにもプログラム側には変更は必要なくなり、マップファイルだけを修正すれば変更が完了する。\\ このように、プログラミングの基本的な考え方として、**「データとプログラムの分離」**というのが、だんだん大事になってくる。\\ ==== ファイル読み込みの手順 ==== * ファイル * 書き込み(write) - オープン(ファイル指定、モード指定(しないとtext?)) * オープン時には、指定したファイルをカレントディレクトリで検索 - 書き込み - クローズ * 読み込み(read) - オープン(ファイル指定、モード指定) * オープン時には、指定したファイルをカレントディレクトリで検索 - 読み込み - クローズ つまり、読み込みも書き込みも、カレントディレクトリ(これはLinuxの授業で習ったから大丈夫だよね?)にあるファイルを指定して、オープン処理、読み込み処理、必要なくなったら、クローズする。という手順が必要である。\\ ==== カレントディレクトリの取得 ==== それではまず、カレントディレクトリを取得してみよう。\\ 最新のC++(C++20ぐらい)では、std::filesystemというすんばらしい機能が追加された。\\ これは、カレントディレクトリの取得や、ファイルの操作(読み書きは除く)が、C++の機能だけでOSによらず統一的にできるようになったというありがたいアップデートである(ってことは、今まではOS別で別々のプログラム書いてたんだよ。まぁいまでも書いてるからしばらくはソースコードのほうがアップデートされないと思うんだけどね)。\\ じゃぁやってみよう。まずSiv3Dのプロジェクトを簡素版のほうのテンプレで作ろう。\\ Visual Studio+Siv3Dはファイル操作に関してはちょいとめんどくさいことがあるので、初めにこれを覚えておこう。\\ * Siv3D以外の自分で作ったプロジェクト * VisualStudio上から、デバッグボタンでプログラムを起動したとき * カレントディレクトリは、プロジェクトファイル(.proj)があるフォルダ * コンパイルしたプログラム(実行ファイル)をダブルクリックで起動したとき(自分でファイル指定したとき) * カレントディレクトリは、実行ファイルがある場所 * Siv3Dのプロジェクト * VisualStudio上から、デバッグボタンでプログラムを起動したとき * カレントディレクトリは、プロジェクトファイル(.proj)があるフォルダの下のAppフォルダ * コンパイルしたプログラム(実行ファイル)をダブルクリックで起動したとき(自分でファイル指定したとき) * カレントディレクトリは、実行ファイルがある場所 このめんどくさいルールを確認してみよう。\\ Siv3Dのテンプレに以下のプログラムを追加\\ **std::filesystem::path** はパスを表す文字列だが、コンパイルした環境に合わせた文字コードを使って結果を返してくる(のが、便利なのか厄介なのかよくわからん)。\\ カレントディレクトリは、 **std::filesystem::current_path()**関数で取得できる、戻り値の型は**std::filesystem::path**形式である。 実はこれにはとてもありがたい機能がついている。\\ std::filesystem::path crrpath = std::filesystem::current_path(); このコードで、crrpathにカレントパスを取得したとき以下の関数が使える。\\ crrpath.string(); //C++文字列に変換 crrpath.wstring(); //C++ワイド文字列に変換 crrpath.generic_u8string(); //UTF-8形式に変換 crrpath.generic_u16string(); //UTF-16形式に変換 crrpath.generic_u32string(); //UTF-32形式に変換 Siv3DはU""って文字列を使ってるよね。これは実はUTF-32形式を使っている。\\ なので、出力するときにどれを使えばいいかはわかるよね!\\ === カレントディレクトリ取得のソースコード === # include #include //std::filesystemを使うのに必要 void Main() { //カレントディレクトリ取得 std::filesystem::path crrpath = std::filesystem::current_path(); Font font{ 30 }; while (System::Update()) { font(ここでUTF32に変換してフォントに渡す).draw(Vec2{ 10,Scene::Center().y }, Palette::White); } } まずは、Visualstudioの上から実行してみよう。\\ んで、つぎに、ソリューションエクスプローラーのプロジェクト名のところを右クリック⇒エクスプローラーでフォルダを開く⇒Appフォルダを開く⇒その中に****.exeがある。これがみんなが作った実行ファイルである。\\ これをデスクトップあたりに移動して実行してみよう。\\ 結果がどう変わるか確認出来たらOK\\