私が把握してるのはwindows版ですが、 カーソル位置が更新されないような、そういうバグが過去の長い間存在していまして、同じ現象のように見えます。 根本的な解決方法は無くて、不便に耐えながら開発していました(バグ報告は何度もしていました)。 windows版ではいくつか前のバージョンで修正されました。 (ただ私はver2022.8はスキップして2022.9もまだ使っていないのでこれらのVerについては分かりません) 同じバグがまた復活したのでしょうかね?
いえい!
私です('ω')
ルームエディターのレイアウトが変わって一瞬びっくりしてる人いました
これはほんとにそう思う! お金持ちならPCを複数台持って…そんなの無理!
違うバージョンのGameMakerをインストールできるようにしてほすぃ
私が欲しい機能をまとめて要望を出しました。 聞いてもらえるといいなあ。 日本語テキストをちゃんと扱えるようになれば、日本語ユーザーも増えると思う。
これはありがたいです!
めっちゃ勉強になります!('ω') ありがとうございまーす!
☺
盛りだくさんのTips、ありがたい!!!
withってそんな便利な機能ついてたんですね… 自分はプレイヤーキャラの存在エラーをよく起こしていたので、いっそのこと迂回策をやめてゲームプレイ中に絶対インスタンスを削除せずにパラメーターをグローバル変数と同じ扱いにしてたんですが、別の方法として覚えておきます
インストールする勇気が出ない……
よかったです!👍
アドバイスありがとうございます!大変ありがたいです…
一旦応急処置とはなるのですが、「exeを起動できない」は解決しました。 ■方法:steamセーブデータにあたる「save.dat」を\AppData\Local\"ゲーム名"から削除
原因はお二人にご指摘いただいたように「ds系のエラー」でした。 ・「o_gm_base」にて初回起動時セーブデータを「ds_map_create()」で作成 ・作成したセーブデータを「o_gm_base」のcreateイベントで次回から読み込み ・そのセーブデータが何らかの理由で破損などしたため、読み込めず起動エラー
起動エラーの報告を頂いた方には、steamクラウドを切ってセーブデータ「save.dat」を削除していただいたら、一応起動できたとのご報告をもらいました。
…今回作ったゲームは6ステージでプレイ時間が20分~30分と短いゲームだったので少しマシですが、これが長いゲームで進行度を消すこととなったらかなり遊ぶ人も嫌だったと思います…。
「エラーのlineが-1になってるのは、リリースビルドの実行ファイルだから」←その通りでした。 アップデート前のプロジェクト(起動しなくなったもの)でsteam関連の関数を消去。 そしてデバッグ起動したところ、「ds_map_find_value」のところでエラーが出て原因がわかりました。
今回使用していたコード
■「o_gm_base」のcreateイベント
if(!file_exists("save.dat"))//saveデータが存在しなかったら { //各レベルのクリア状態のフラグ初期化 fl_lvCleared = 0; //saveデータ(一時保存)を作成 saveData = ds_map_create(); //Progress進捗データ ds_map_add(saveData,"fl_lvCleared",fl_lvCleared); } if(file_exists("save.dat"))//saveデータが存在したら { saveData = ds_map_secure_load("save.dat");//saveデータをロード //各レベルのクリア状態をセーブデータから読み込み fl_lvCleared = ds_map_find_value(saveData,"fl_lvCleared"); }
■「o_gm_base」のstepイベント(レベルクリア後に1回だけ実行) ds_map_replace(saveData,"fl_lvCleared",fl_lvCleared); ds_map_secure_save(saveData,"save.dat");
また下記も今後アップデート・別ゲームの作成時に確認したいと思います ・「SteamAPIを使うときはまず初期化処理」←これはしていませんでした…
アドバイス、本当にありがとうございました!
エラーのlineが-1になってるのは、リリースビルドの実行ファイルだからちゃんとしたエラー情報が得られないからだと思います。 開発中にエラーが出たらどの箇所かわかるかもしれません。
dsを使ってる箇所があるか async_load(GameMakerが内部で持つds_mapです)を使ってる箇所があるか エラーが出る環境のパスに日本語や記号、スペースは含まれているか
といったところを確認してみてはどうでしょう。
エラー内容からはデータ構造系(ds系や構造体)の変数の中身が存在しないと言われているのでその変数の初期化忘れの可能性があります。 CreateイベントでのエラーとのことなのでCreateの実行順番が原因かもです。 o_gm_00baseのCreateの中で他のオブジェクトの変数を利用していたら、そのオブジェクトのCreateがまだ呼ばれてなくてそのようなエラーになっているということです。 ルームに配置しているオブジェクトのCreateの実行順番はPCによって違った気がしましたので今回のやつに該当しそうですね。
他に考えられるのは新しいSteamAPIの仕様が守られていないとかですかね。 たとえばSteamAPIを使うときはまず初期化処理をしないとダメでそれも実行順番によってエラーになってしまっていたりといった感じです。
ですね!
この投稿者の人むっちゃニッチな動画出してくれるので本当ありがたいですね
friendlycosmonaut https://friendlycosmonaut.dev/
YellowAfterlife https://yal.cc/gamemaker-2-3-syntax-in-details/#static
hoshin blog ゲーム開発者のためのサイト https://hoshinblog.com/gamemaker/nineslice-use/
>> 9 ご丁寧にありがとうございます! program_directoryやworking_directoryは最初省略してたんですが恐らくほかの原因で上手くいかないのが続いてて疑心暗鬼になってたのでつけてました・・・ よく読んで外してやってみます!助かります
test_game.exe └system └scroll_player.dat
file_text_open_readで読み込むときは、working_directory等を付けなくても読み込むことが可能です。
▼マニュアル working_directoryについて https://manual.yoyogames.com/GameMaker_Language/GML_Reference/File_Handling/File_Directories/working_directory.htm
dir = "system/"; fid = file_text_open_read(dir + "scroll_player.dat");
で読み込めます。
file_text_open_read実行時には、ゲームの実行ファイルのある場所が基準となりますので、事項ファイルのある場所以下のパスを入れることで読み込むことができます。デバッグ時も変わらないはずです。
上にあった、appdata等からも読み込むことができますが、優先順位があります。
file_text_open_readなどで読み込む際には、ファイルが存在するか?読み込めるか調べて無かった場合、順位が下のファイルが存在するか?読み込めるかを調べていくようです。
1.「%localappdata%<ゲーム名>」or「%appdata%<ゲーム名>」のパス以下 2.ゲームの実行パス以下
ビルド前に
dir = program_directory + "/system/";
を有効化する必要もないと思います。
fid = file_text_open_read("system/scroll_player.dat");
なら、実行ファイルのある場所以下systemフォルダのscroll_player.datを読み込めます。
datafilesに入れたフォルダやファイルは、exeのある場所にそのまま配置されるので、デバッグ時でもプログラムを変える必要はないと思います。デバッグ時もexeが出来たときと同じように読み書きできます。
datafiles(インクルードファイル) └system └scroll_player.dat
で実行ファイルを作成するとファイルの配置は
となります。
マニュアルのFile Systemページにファイルの仕組みが解説されていますので参考にしてみてください。 https://manual.yoyogames.com/Additional_Information/The_File_System.htm
コードエディタで Alt + マウス左ボタンでドラッグ で、ブロック選択ができます。 複数行まとめて入力、編集できるので便利。
Alt + N Noteを作ります。 メモなどに使えます。Scriptと違い完全にメモ帳みたいなもので、コンパイルの対象外です。
検索の対象からも外したい場合は、検索窓でNotesを除外します。
最終的に、やっぱりインストーラーより実行ファイルが良い!となったので以下のように落ち着きました。 フォルダにdatファイルを並べてdatafilesフォルダに入れておき、以下のコードでビルド前に以下のコードのworking_directoryとprogram_directoryを入れ替えることで正しく動く…というやり方です。(exeファイルより深い階層であれば良かったので、フォルダを作れることが分かっただけで解決する話でした)
// テキストファイルのディレクトリ // // ビルド時にはdatafilesフォルダの中身を更新してprogram_directoryを読み込む //dir = program_directory + "/system/"; dir = working_directory + "/system/"; // ファイルからテキストを読み込むための変数 fid = 0; readA = array_create(30, ""); readB = array_create(30, ""); readC = array_create(30, ""); // テキストファイルの読み込み fid = file_text_open_read(dir + "scroll_player.dat"); for(i=0;i<18;i++){ readA[i] = file_text_read_string(fid); file_text_readln(fid); } file_text_close(fid);
> そもそも、オブジェクト等が同名だったら上書きするかどうかとか聞いてくればいいのになと思ったりしました。
今このあたりの問題で日々苦しんでいるので、100回くらい頷きました。
同名のアセットがある場合、
コードエディタで CTRL+G 指定した行へ飛べます
Ctrl + TAB workspaceに開いてるアセットの一覧から選んで飛びます
Ctrl + T アセットを検索します
Ctrl + Shift + F 検索窓を開きます
コードエディタで Ctrl + F 開いてるコードが対象の検索窓を開きます
コード中の関数やアセットにカーソルを乗せてF1 対象を開きます
F12 ワークスペースのサイドバー(何と呼ぶか分からない)を開閉します
おお、すごい情報・・・ 返事遅くなりすみません、ありがとうございます。
file_text_open_readはそういえばセーブデータの管理に使っていました。 最初からファイルを置くことは無理だと思っていましたがインストーラーを作ることで出来るんですね。
参考にさせていただきます。
保存場所、サンドボックスの設定はこれで、
インストーラー作成時のNSISについての設定がこれですね。
NSISというのでデプロイに関して指定できるんでしょうか、NSISというのは全然知りませんでした! ここで教えてもらえてよかったです!
haniguraさんのやりたいこともこれで実現できるでしょうか。
「exeファイルと同じ階層に並べたくはない」というのは、
test_game.exe └scenario ├en └ja └test01.txt
という形式でtest01.txtなどを置きたくないということなのでしょうか?
データファイルを読み込むために使う「file_text_open_read(file_path)」などは、ゲームオプション設定で保存場所として設定した場所なら読み書きできます。 Windowsの場合は、「%localappdata%<ゲーム名>」「%appdata%<ゲーム名>」か選べる様になっているので、そのフォルダ以下にファイルやフォルダがあれば読み込むことができます。
%localappdata%<ゲーム名> └scenario ├en └ja └test01.txt
fname = "scenario\\ja\\test01.txt"; fh = file_text_open_read(fname); text01 = file_text_read_string(fh);
とすれば、localappdataのゲーム名フォルダ以下にあるファイルを読み込むことができます。
exeファイルと同じ階層に並べたくはないという要望があった場合、私ならlocalappdataなどにシナリオの言語リソースを入れます。 そのまま中身が見える問題は、暗号化や難読化したりすれば良いと思います。
localappdataなどにファイルをどうやって置くかは、インストーラーなどでファイルをコピーするなどが考えられます。
GameMaker標準機能でインストーラーを作る場合、「NSIS(Nullsoft Scriptable Install System)」というインストーラー作成システムを使用しています。 ゲームオプション設定でインストーラーを作るためのNSIS用スクリプトを指定できるので、標準状態の(NSIS用スクリプト)設定から変えることで、好きなファイルを好きな場所に入れることができます。 NSIS用スクリプトは、インストーラーの持っているファイルをどこにコピーする、といった様なスクリプトになっています(他にもいろいろなことができます)ので、NSISの公式サイトのマニュアルやgoogleなどで検索すれば、設定スクリプトの書き方が出てきます。
しかし、好きなところにコピーできたとしても、上記しましたが、GameMaker製のゲームから見える世界は、ゲーム自身があるフォルダ、ゲームオプション設定で選んだ「%localappdata%<ゲーム名>」か「%appdata%<ゲーム名>」しかないので、それ以外のフォルダにファイルを入れても読み込むことはできません。
SEで使おうと思ってた機能なので助かります!
なるほど逆転の発想・・・ しかしキャラがよく喋るゲームで、最終的に何文字になるかも分からないので今回は外部ファイルの方向性で行くつもりです。 ありがとうございました!
翻訳者の人が作業中にどうしても実行中に値を変更したい場合はどうしようもないですが 別にそうでないなら翻訳者のデータをそのまま構造体や配列などに変換して直接ソースコードにコピーするのも手です。 データを隠蔽できますし、ファイル読み込み処理もなくて済みます。 ただし、翻訳者のデータが変更されるたびにソースコードに変換する作業が必要になりますけどね...
ありがとうございます! やっぱり場所は変えられないんですね… 自分も絶対見られてはいけない訳ではないので、ひとまず1ファイルで管理できるiniファイルに差し替えてやっていくことにしました。(iniファイルなら覗かれにくいと信じて…)
私も他の方の方法も気になるので、解決とは書かずに置いておきます。
私の場合、exeと同じ場所に外部ファイルがある形にしてます。 (exeファイルと同じ場所に置きたくないという要望を満たす回答にはならずすみません)
雑にしか理解してないんですが、GMS1.4の頃は外部ファイルも全部exeファイルの中に入る形にビルドされていたので、配布するゲームは外部ファイルが見えない(というか存在しない)形になっていたんですが、GMS2になってそれができなくなり、今の形になりました。 インストーラーで外部ファイルを展開する場所をC:\Users\username\AppData\以下などに指定できたらいいのですが、その方法は、私の知る限りは無いようです。
■すぐに見つからない場所に置く(隠す) 上記のように、方法は無いっぽいです。
■拡張子を変える 少しは効果があるかもしれませんが、データを見てやろうという意思がある人は開いちゃうと思います。
■難読化する ファイルを開いても内容を読めなくすることは選択肢の1つだと思います。これも完全じゃないですが多くの人は読むことを諦めるでしょう。
ということで現在は「ソロプレイのゲームなら」という条件つきですが、「読みたい人は読めばいい、プレイする本人が自分の意志で見たくて見るならそれを止める理由は無いかもしれないな」と開き直って、それ以上考えないようにしてます!🙈
他の人がどうやってるのか、私も知りたいです!
ステート毎に終了条件(遷移条件)が違い遷移先も条件で複数変わるので、仕方なくステート内にそれらを書いていましたが、ステートをインスタンス化するときにこういう方法でfunctionを渡すことができるんですね。
あと、進行方向とアニメの向きが必ずしも一致しないというのはその通りですね。後退しながら攻撃したり、体を対象の方に向けながら歩き回ったり。 ステートを、アニメの開始から終わりまでという単位で考えていたのでステートとアニメを一体化して捉えていましたが分けたらスッキリするなら分けたいですね。
考え方とサンプルコードで勉強になります。参考にさせて頂きます。 ありがとうございます!
何に関心(AI,メニュー遷移,etc...)を持って実装をするかで大きく構造が変わるなと思い オブジェクトの Sprite を管理するステートマシンを実装してみました
asa さんが最初に提示した実装例から以下のようなことを考えました
そこでアニメーションの管理のみを行うステートマシンを実装しました。 以下が仕様です。
true
これにより挙動とアニメーション管理を分離出来ます。
*上記仕様をもとに実装しステートマシンを使用している部分
友人さん ありがとうございます。
characterに各motionインスタンスを全部持たせて、init()とloop()もそっちに移動、 motionはloopから呼ばれるactionのロジックだけにするという構造なんですね。
いろいろ勉強させていただきます。 サンプルコードから詳しい説明まで、ありがとうございます!!
マニュアル(ver2~2.2.x) マニュアル(ver2.3~) YoYoGames YoYoGames 公式コミュニティ GM関連のYoutubeチャンネル集 解説・資料サイト集(日本語) 解説・資料サイト集(英語)
私が把握してるのはwindows版ですが、
カーソル位置が更新されないような、そういうバグが過去の長い間存在していまして、同じ現象のように見えます。
根本的な解決方法は無くて、不便に耐えながら開発していました(バグ報告は何度もしていました)。
windows版ではいくつか前のバージョンで修正されました。
(ただ私はver2022.8はスキップして2022.9もまだ使っていないのでこれらのVerについては分かりません)
同じバグがまた復活したのでしょうかね?
いえい!
私です('ω')
ルームエディターのレイアウトが変わって一瞬びっくりしてる人いました
これはほんとにそう思う!
お金持ちならPCを複数台持って…そんなの無理!
違うバージョンのGameMakerをインストールできるようにしてほすぃ
私が欲しい機能をまとめて要望を出しました。
聞いてもらえるといいなあ。
日本語テキストをちゃんと扱えるようになれば、日本語ユーザーも増えると思う。
これはありがたいです!
めっちゃ勉強になります!('ω')
ありがとうございまーす!
☺
盛りだくさんのTips、ありがたい!!!
withってそんな便利な機能ついてたんですね…
自分はプレイヤーキャラの存在エラーをよく起こしていたので、いっそのこと迂回策をやめてゲームプレイ中に絶対インスタンスを削除せずにパラメーターをグローバル変数と同じ扱いにしてたんですが、別の方法として覚えておきます
インストールする勇気が出ない……
よかったです!👍
アドバイスありがとうございます!大変ありがたいです…
一旦応急処置とはなるのですが、「exeを起動できない」は解決しました。
■方法:steamセーブデータにあたる「save.dat」を\AppData\Local\"ゲーム名"から削除
原因はお二人にご指摘いただいたように「ds系のエラー」でした。
・「o_gm_base」にて初回起動時セーブデータを「ds_map_create()」で作成
・作成したセーブデータを「o_gm_base」のcreateイベントで次回から読み込み
・そのセーブデータが何らかの理由で破損などしたため、読み込めず起動エラー
起動エラーの報告を頂いた方には、steamクラウドを切ってセーブデータ「save.dat」を削除していただいたら、一応起動できたとのご報告をもらいました。
…今回作ったゲームは6ステージでプレイ時間が20分~30分と短いゲームだったので少しマシですが、これが長いゲームで進行度を消すこととなったらかなり遊ぶ人も嫌だったと思います…。
「エラーのlineが-1になってるのは、リリースビルドの実行ファイルだから」←その通りでした。

アップデート前のプロジェクト(起動しなくなったもの)でsteam関連の関数を消去。
そしてデバッグ起動したところ、「ds_map_find_value」のところでエラーが出て原因がわかりました。
今回使用していたコード
■「o_gm_base」のcreateイベント
if(!file_exists("save.dat"))//saveデータが存在しなかったら
{
//各レベルのクリア状態のフラグ初期化
fl_lvCleared = 0;
//saveデータ(一時保存)を作成
saveData = ds_map_create();
//Progress進捗データ
ds_map_add(saveData,"fl_lvCleared",fl_lvCleared);
}
if(file_exists("save.dat"))//saveデータが存在したら
{
saveData = ds_map_secure_load("save.dat");//saveデータをロード
//各レベルのクリア状態をセーブデータから読み込み
fl_lvCleared = ds_map_find_value(saveData,"fl_lvCleared");
}
■「o_gm_base」のstepイベント(レベルクリア後に1回だけ実行)
ds_map_replace(saveData,"fl_lvCleared",fl_lvCleared);
ds_map_secure_save(saveData,"save.dat");
また下記も今後アップデート・別ゲームの作成時に確認したいと思います
・「SteamAPIを使うときはまず初期化処理」←これはしていませんでした…
アドバイス、本当にありがとうございました!
エラーのlineが-1になってるのは、リリースビルドの実行ファイルだからちゃんとしたエラー情報が得られないからだと思います。
開発中にエラーが出たらどの箇所かわかるかもしれません。
dsを使ってる箇所があるか
async_load(GameMakerが内部で持つds_mapです)を使ってる箇所があるか
エラーが出る環境のパスに日本語や記号、スペースは含まれているか
といったところを確認してみてはどうでしょう。
エラー内容からはデータ構造系(ds系や構造体)の変数の中身が存在しないと言われているのでその変数の初期化忘れの可能性があります。
CreateイベントでのエラーとのことなのでCreateの実行順番が原因かもです。
o_gm_00baseのCreateの中で他のオブジェクトの変数を利用していたら、そのオブジェクトのCreateがまだ呼ばれてなくてそのようなエラーになっているということです。
ルームに配置しているオブジェクトのCreateの実行順番はPCによって違った気がしましたので今回のやつに該当しそうですね。
他に考えられるのは新しいSteamAPIの仕様が守られていないとかですかね。
たとえばSteamAPIを使うときはまず初期化処理をしないとダメでそれも実行順番によってエラーになってしまっていたりといった感じです。
ですね!
この投稿者の人むっちゃニッチな動画出してくれるので本当ありがたいですね
friendlycosmonaut
https://friendlycosmonaut.dev/
YellowAfterlife
https://yal.cc/gamemaker-2-3-syntax-in-details/#static
hoshin blog ゲーム開発者のためのサイト
https://hoshinblog.com/gamemaker/nineslice-use/
>> 9
ご丁寧にありがとうございます!
program_directoryやworking_directoryは最初省略してたんですが恐らくほかの原因で上手くいかないのが続いてて疑心暗鬼になってたのでつけてました・・・
よく読んで外してやってみます!助かります
test_game.exe
└system
└scroll_player.dat
file_text_open_readで読み込むときは、working_directory等を付けなくても読み込むことが可能です。
▼マニュアル working_directoryについて
https://manual.yoyogames.com/GameMaker_Language/GML_Reference/File_Handling/File_Directories/working_directory.htm
で読み込めます。
file_text_open_read実行時には、ゲームの実行ファイルのある場所が基準となりますので、事項ファイルのある場所以下のパスを入れることで読み込むことができます。デバッグ時も変わらないはずです。
上にあった、appdata等からも読み込むことができますが、優先順位があります。
file_text_open_readなどで読み込む際には、ファイルが存在するか?読み込めるか調べて無かった場合、順位が下のファイルが存在するか?読み込めるかを調べていくようです。
1.「%localappdata%<ゲーム名>」or「%appdata%<ゲーム名>」のパス以下
2.ゲームの実行パス以下
ビルド前に
を有効化する必要もないと思います。
なら、実行ファイルのある場所以下systemフォルダのscroll_player.datを読み込めます。
datafilesに入れたフォルダやファイルは、exeのある場所にそのまま配置されるので、デバッグ時でもプログラムを変える必要はないと思います。デバッグ時もexeが出来たときと同じように読み書きできます。
datafiles(インクルードファイル)
└system
└scroll_player.dat
で実行ファイルを作成するとファイルの配置は
test_game.exe
└system
└scroll_player.dat
となります。
マニュアルのFile Systemページにファイルの仕組みが解説されていますので参考にしてみてください。
https://manual.yoyogames.com/Additional_Information/The_File_System.htm
コードエディタで Alt + マウス左ボタンでドラッグ で、ブロック選択ができます。
複数行まとめて入力、編集できるので便利。
Alt + N Noteを作ります。

メモなどに使えます。Scriptと違い完全にメモ帳みたいなもので、コンパイルの対象外です。
検索の対象からも外したい場合は、検索窓でNotesを除外します。

最終的に、やっぱりインストーラーより実行ファイルが良い!となったので以下のように落ち着きました。
フォルダにdatファイルを並べてdatafilesフォルダに入れておき、以下のコードでビルド前に以下のコードのworking_directoryとprogram_directoryを入れ替えることで正しく動く…というやり方です。(exeファイルより深い階層であれば良かったので、フォルダを作れることが分かっただけで解決する話でした)
> そもそも、オブジェクト等が同名だったら上書きするかどうかとか聞いてくればいいのになと思ったりしました。
今このあたりの問題で日々苦しんでいるので、100回くらい頷きました。
同名のアセットがある場合、
を選ばせてくれればいいのに、と思っています。
コードエディタで CTRL+G 指定した行へ飛べます
Ctrl + TAB workspaceに開いてるアセットの一覧から選んで飛びます
Ctrl + T アセットを検索します
Ctrl + Shift + F 検索窓を開きます
コードエディタで Ctrl + F 開いてるコードが対象の検索窓を開きます
コード中の関数やアセットにカーソルを乗せてF1 対象を開きます
F12 ワークスペースのサイドバー(何と呼ぶか分からない)を開閉します
おお、すごい情報・・・
返事遅くなりすみません、ありがとうございます。
file_text_open_readはそういえばセーブデータの管理に使っていました。
最初からファイルを置くことは無理だと思っていましたがインストーラーを作ることで出来るんですね。
参考にさせていただきます。
保存場所、サンドボックスの設定はこれで、

インストーラー作成時のNSISについての設定がこれですね。

NSISというのでデプロイに関して指定できるんでしょうか、NSISというのは全然知りませんでした!
ここで教えてもらえてよかったです!
haniguraさんのやりたいこともこれで実現できるでしょうか。
「exeファイルと同じ階層に並べたくはない」というのは、
test_game.exe
└scenario
├en
└ja
└test01.txt
という形式でtest01.txtなどを置きたくないということなのでしょうか?
データファイルを読み込むために使う「file_text_open_read(file_path)」などは、ゲームオプション設定で保存場所として設定した場所なら読み書きできます。
Windowsの場合は、「%localappdata%<ゲーム名>」「%appdata%<ゲーム名>」か選べる様になっているので、そのフォルダ以下にファイルやフォルダがあれば読み込むことができます。
%localappdata%<ゲーム名>
└scenario
├en
└ja
└test01.txt
とすれば、localappdataのゲーム名フォルダ以下にあるファイルを読み込むことができます。
exeファイルと同じ階層に並べたくはないという要望があった場合、私ならlocalappdataなどにシナリオの言語リソースを入れます。
そのまま中身が見える問題は、暗号化や難読化したりすれば良いと思います。
localappdataなどにファイルをどうやって置くかは、インストーラーなどでファイルをコピーするなどが考えられます。
GameMaker標準機能でインストーラーを作る場合、「NSIS(Nullsoft Scriptable Install System)」というインストーラー作成システムを使用しています。
ゲームオプション設定でインストーラーを作るためのNSIS用スクリプトを指定できるので、標準状態の(NSIS用スクリプト)設定から変えることで、好きなファイルを好きな場所に入れることができます。
NSIS用スクリプトは、インストーラーの持っているファイルをどこにコピーする、といった様なスクリプトになっています(他にもいろいろなことができます)ので、NSISの公式サイトのマニュアルやgoogleなどで検索すれば、設定スクリプトの書き方が出てきます。
しかし、好きなところにコピーできたとしても、上記しましたが、GameMaker製のゲームから見える世界は、ゲーム自身があるフォルダ、ゲームオプション設定で選んだ「%localappdata%<ゲーム名>」か「%appdata%<ゲーム名>」しかないので、それ以外のフォルダにファイルを入れても読み込むことはできません。
SEで使おうと思ってた機能なので助かります!
なるほど逆転の発想・・・
しかしキャラがよく喋るゲームで、最終的に何文字になるかも分からないので今回は外部ファイルの方向性で行くつもりです。
ありがとうございました!
翻訳者の人が作業中にどうしても実行中に値を変更したい場合はどうしようもないですが
別にそうでないなら翻訳者のデータをそのまま構造体や配列などに変換して直接ソースコードにコピーするのも手です。
データを隠蔽できますし、ファイル読み込み処理もなくて済みます。
ただし、翻訳者のデータが変更されるたびにソースコードに変換する作業が必要になりますけどね...
ありがとうございます!
やっぱり場所は変えられないんですね…
自分も絶対見られてはいけない訳ではないので、ひとまず1ファイルで管理できるiniファイルに差し替えてやっていくことにしました。(iniファイルなら覗かれにくいと信じて…)
私も他の方の方法も気になるので、解決とは書かずに置いておきます。
私の場合、exeと同じ場所に外部ファイルがある形にしてます。
(exeファイルと同じ場所に置きたくないという要望を満たす回答にはならずすみません)
雑にしか理解してないんですが、GMS1.4の頃は外部ファイルも全部exeファイルの中に入る形にビルドされていたので、配布するゲームは外部ファイルが見えない(というか存在しない)形になっていたんですが、GMS2になってそれができなくなり、今の形になりました。
インストーラーで外部ファイルを展開する場所をC:\Users\username\AppData\以下などに指定できたらいいのですが、その方法は、私の知る限りは無いようです。
■すぐに見つからない場所に置く(隠す)
上記のように、方法は無いっぽいです。
■拡張子を変える
少しは効果があるかもしれませんが、データを見てやろうという意思がある人は開いちゃうと思います。
■難読化する
ファイルを開いても内容を読めなくすることは選択肢の1つだと思います。これも完全じゃないですが多くの人は読むことを諦めるでしょう。
ということで現在は「ソロプレイのゲームなら」という条件つきですが、「読みたい人は読めばいい、プレイする本人が自分の意志で見たくて見るならそれを止める理由は無いかもしれないな」と開き直って、それ以上考えないようにしてます!🙈
他の人がどうやってるのか、私も知りたいです!
ステート毎に終了条件(遷移条件)が違い遷移先も条件で複数変わるので、仕方なくステート内にそれらを書いていましたが、ステートをインスタンス化するときにこういう方法でfunctionを渡すことができるんですね。
あと、進行方向とアニメの向きが必ずしも一致しないというのはその通りですね。後退しながら攻撃したり、体を対象の方に向けながら歩き回ったり。
ステートを、アニメの開始から終わりまでという単位で考えていたのでステートとアニメを一体化して捉えていましたが分けたらスッキリするなら分けたいですね。
考え方とサンプルコードで勉強になります。参考にさせて頂きます。
ありがとうございます!
何に関心(AI,メニュー遷移,etc...)を持って実装をするかで大きく構造が変わるなと思い
オブジェクトの Sprite を管理するステートマシンを実装してみました
asa さんが最初に提示した実装例から以下のようなことを考えました
そこでアニメーションの管理のみを行うステートマシンを実装しました。
以下が仕様です。
trueが返った場合、遷移条件構造体の遷移先ステート名を元にステートを現在のものから置き換え、ループを抜けるこれにより挙動とアニメーション管理を分離出来ます。
*上記仕様をもとに実装しステートマシンを使用している部分

友人さん ありがとうございます。
characterに各motionインスタンスを全部持たせて、init()とloop()もそっちに移動、
motionはloopから呼ばれるactionのロジックだけにするという構造なんですね。
いろいろ勉強させていただきます。
サンプルコードから詳しい説明まで、ありがとうございます!!