私は GameMaker:Studio Pro を使用しており、以下のように変数に格納されたスクリプトを実行しようとしています:
script = close_dialog;
script_execute(script);
うまくいきません。明らかに「script」という名前のスクリプトを探しています。どうすればこれを達成できるか知っている人はいますか?
私は GameMaker:Studio Pro を使用しており、以下のように変数に格納されたスクリプトを実行しようとしています:
script = close_dialog;
script_execute(script);
うまくいきません。明らかに「script」という名前のスクリプトを探しています。どうすればこれを達成できるか知っている人はいますか?
Game Maker の仕組みについて混乱しているようですので、実際の質問に移る前に、これについて説明します。
GML はかなり単純な獣で、文字列と数値の 2 つのデータ型しか認識しません。他のすべて (オブジェクト、スプライト、スクリプト、データ構造、インスタンスなど) は、GML コードでは数字で表されます。
たとえば、あらゆる種類の派手なイベントを持つ「Player」というオブジェクトがあるかもしれませんが、コードにとって Player は(たとえば)出力できる定数にすぎませんshow_message(string(Player));
現在、この関数script_execute(script)
は、実行する必要があるスクリプトの ID を引数として受け取ります。そのIDはただの普通の番号です。script_execute
内部テーブルでその ID を持つスクリプトを検索し、スクリプトを実行します。
つまり、の ID が 14 であることがわかっている場合は、呼び出す代わりに呼び出すscript_execute(close_dialog)
こともできます(ただし、コードが理解しにくくなり、ID の変更に対して脆弱になるため、これは悪い習慣です)。script_execute(14)
close_dialog
これで、最初にの数値をclose_dialog
変数に代入してから、その変数を呼び出しscript_execute
てもまったく問題ないことは明らかです。最終的にscript_execute
は、渡された数値のみを気にし、この数値の元となる変数の名前は気にしません。
少し先のことを考えている場合は、その時点で必要かどうかscript_execute
、または代わりにこれを行うことができるかどうか疑問に思うかもしれません。
script = close_dialog;
script();
私の意見では、言語でこれを許可することはまったく問題ありませんが、機能しません。関数呼び出し演算子は、実際に呼び出そうとするものの名前を気にします。
その背景を邪魔にならないようにして、実際の質問に進みます。close_dialog
が実際にスクリプトである場合、提案されたコードは正常に機能します。それが拡張関数 (または組み込み関数 - 私は Studio を所有していないので、私は何を知っているか) である場合、実際には ID を持たず、 で呼び出すことはできませんscript_execute
。実際、GML には値がないため、変数に代入することさえできませんclose_dialog
。変数を使用してできることは、それを呼び出すことだけです。ただし、これを回避するには、スクリプトを作成することができます (たとえば、close_dialog_script
のみを呼び出すスクリプトはclose_dialog
、上記のように使用できます。
編集:とにかく動作しないように見えるので、close_dialog
(おそらくボタンスプライト)という名前の別のリソースがあるかどうかを確認してください。この種の競合はclose_dialog
、スクリプトではなくスプライトの ID を提供することを意味する可能性がありますが、スクリプトを直接呼び出すことは引き続き機能します。
フォーラムで多くの議論の後、私はこの方法を採用することになりました。
script_id() というスクリプトを書きました
var sid;
sid = 6; //6 = scriptnotfound script :)
switch (argument0) {
case "load_room":
sid = 0;
break;
case "show_dialog":
sid = 1;
break;
case "close_dialog":
sid = 3;
break;
case "scrExample":
sid = 4;
break;
}
return sid;
これで、script_execute(script_id("close_dialog")); を呼び出すことができます。
私はそれが嫌いですが、スプレッドシートを保持するよりはましです...私の意見では。