1

我正在使用 GameMaker:Studio Pro 并尝试执行存储在变量中的脚本,如下所示:

script = close_dialog;
script_execute(script);

它不起作用。它显然是在寻找一个名为“脚本”的脚本。有谁知道我怎么能做到这一点?

4

4 回答 4

7

这个问题现在已经很老了,但如果其他人最终通过谷歌来到这里(就像我所做的那样),我发现这里的东西效果很好,并且不需要任何额外的数据结构作为参考:

scriptToCall = asset_get_index(scr_scriptName);
script_execute(scriptToCall);

此处的第一行创建变量 scriptToCall,然后为它分配 Game Maker 的内部 ID 号,用于您要调用的脚本。这允许 script_execute 正确地从 ID 中找到脚本,如果您尝试将包含脚本名称的字符串传递给它,这将不起作用。

我使用它来定义在特定情况下应从包含的 txt 文件中调用哪些脚本,因此需要将字符串转换为可寻址的脚本 ID!

于 2014-08-11T11:57:36.193 回答
2

您似乎对 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,而直接调用脚本仍然可以工作。

于 2012-11-25T16:20:50.293 回答
0

在论坛上进行了多次讨论后,我最终采用了这种方法。

我写了一个名为 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"));

我讨厌它,但在我看来,这比保留电子表格要好。

于 2012-11-28T01:48:55.113 回答
-2

还有另一种方法,execute_string(); 应该是这样的:

execute_string(string(scriptName) + "();");
于 2013-12-10T08:56:27.967 回答