我正在使用 GameMaker:Studio Pro 并尝试执行存储在变量中的脚本,如下所示:
script = close_dialog;
script_execute(script);
它不起作用。它显然是在寻找一个名为“脚本”的脚本。有谁知道我怎么能做到这一点?
我正在使用 GameMaker:Studio Pro 并尝试执行存储在变量中的脚本,如下所示:
script = close_dialog;
script_execute(script);
它不起作用。它显然是在寻找一个名为“脚本”的脚本。有谁知道我怎么能做到这一点?
这个问题现在已经很老了,但如果其他人最终通过谷歌来到这里(就像我所做的那样),我发现这里的东西效果很好,并且不需要任何额外的数据结构作为参考:
scriptToCall = asset_get_index(scr_scriptName);
script_execute(scriptToCall);
此处的第一行创建变量 scriptToCall,然后为它分配 Game Maker 的内部 ID 号,用于您要调用的脚本。这允许 script_execute 正确地从 ID 中找到脚本,如果您尝试将包含脚本名称的字符串传递给它,这将不起作用。
我使用它来定义在特定情况下应从包含的 txt 文件中调用哪些脚本,因此需要将字符串转换为可寻址的脚本 ID!
您似乎对 Game Maker 的工作方式有些困惑,所以我会在解决实际问题之前尝试解决这个问题。
GML 是一个头脑简单的野兽,它只知道两种数据类型:字符串和数字。其他所有内容(对象、精灵、脚本、数据结构、实例等)在 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
. 事实上,你甚至不能给close_dialog
一个变量赋值,因为它在 GML 中没有任何值——你所能做的就是调用它。不过,要解决这个问题,您可以创建一个脚本(例如,close_dialog_script
它只调用close_dialog
,然后您可以像上面一样使用它。
编辑:由于它似乎无论如何都不起作用,请检查您是否有不同的资源名称close_dialog
(可能是按钮精灵)。这种冲突可能意味着close_dialog
给你精灵的 ID,而不是脚本的 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"));
我讨厌它,但在我看来,这比保留电子表格要好。
还有另一种方法,execute_string(); 应该是这样的:
execute_string(string(scriptName) + "();");