我正在使用GameMaker:Studio Pro并尝试执行存储在变量中的脚本,如下所示:
script = close_dialog;
script_execute(script);
它不起作用。它显然正在寻找一个名为“script”的脚本。有谁知道我怎么能做到这一点?
答案 0 :(得分:5)
这个问题现在已经很老了,但是如果有其他人通过谷歌结束这里(就像我做的那样),我发现这里工作得很好,并且不需要任何额外的数据结构作为参考:
scriptToCall = asset_get_index(scr_scriptName);
script_execute(scriptToCall);
这里的第一行创建变量scriptToCall,然后为其分配游戏制作者要调用的脚本的内部ID号。这允许script_execute从ID中正确地找到脚本,如果您尝试将其传递给包含脚本名称的字符串,则该脚本不起作用。
我正在使用它来定义应该在包含的txt文件中在特定情况下调用哪些脚本,因此需要将字符串转换为可寻址的脚本ID!
答案 1 :(得分:2)
你似乎对Game Maker的运作方式有些困惑,所以在我解决实际问题之前,我会尝试解决这个问题。
GML是一个相当简单的野兽,它只知道两种数据类型:字符串和数字。其他所有内容(对象,精灵,脚本,数据结构,实例等)都在GML代码中用数字表示。
例如,您可能有一个名为“Player”的对象,它有各种奇特的事件,但是代码Player只是一个常数,您可以(例如)打印出show_message(string(Player));
现在,函数script_execute(script)
将应该执行的脚本的ID作为参数。该ID只是一个正常的数字。 script_execute
将在某个内部表中找到具有该ID的脚本,然后运行该脚本。
换句话说,如果你碰巧知道script_execute(close_dialog)
的ID是14(不过这是不好的做法,那么你可以调用script_execute(14)
而不是调用close_dialog
。它使代码难以理解并且对ID变化很脆弱。)
现在显而易见的是,首先将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,而直接调用脚本仍然有效。
答案 2 :(得分: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”));
我讨厌它,但它比保留电子表格更好......在我看来。
答案 3 :(得分:-1)
还有另一种方法,使用execute_string(); 应该是这样的:
execute_string(string(scriptName) + "();");