我使用GameMaker調用script_execute:Studio Pro中,並試圖執行存儲在一個變量的腳本如下:具有可變
script = close_dialog;
script_execute(script);
它不工作。顯然,它正在尋找名爲「腳本」的腳本。任何人都知道我可以做到這一點?
我使用GameMaker調用script_execute:Studio Pro中,並試圖執行存儲在一個變量的腳本如下:具有可變
script = close_dialog;
script_execute(script);
它不工作。顯然,它正在尋找名爲「腳本」的腳本。任何人都知道我可以做到這一點?
這個問題是很老了,但如果任何人通過谷歌在這裏結束了(像我一樣),這裏的東西我發現,做得很不錯,並避免任何額外的需求數據結構爲參考:
scriptToCall = asset_get_index(scr_scriptName);
script_execute(scriptToCall);
這裏的第一行創建變量scriptToCall,然後分配給它遊戲製造商的內部ID號爲要調用腳本。這允許script_execute從ID正確地查找腳本,如果您嘗試將其傳遞給包含腳本名稱的字符串,則該腳本不起作用。
我使用它來定義哪些腳本應該在特定情況下從包含的txt文件中調用,因此需要將字符串轉換爲可尋址的腳本ID!
您似乎對Game Maker的工作方式有些困惑,所以我會在解決實際問題之前嘗試解決這個問題。
GML是一個相當簡單的野獸,它只知道兩種數據類型:字符串和數字。其他所有東西(對象,精靈,腳本,數據結構,實例等等)都用GML代碼中的數字表示。
例如,你可能有所謂的「玩家」擁有各種花式事件的對象,但在代碼播放器僅僅是一個常數,你可以(例如)與show_message(string(Player));
打印出來現在,函數script_execute(script)
將採用應該執行的腳本的ID作爲參數。該ID只是一個正常的數字。 script_execute
將在某個內部表中找到具有該ID的腳本,然後運行該腳本。
換句話說,而不是調用script_execute(close_dialog)
你也可以同樣撥打script_execute(14)
,如果你碰巧知道的close_dialog
的ID是14(儘管這是不好的做法,因爲它使代碼難以理解和反對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
名(可能是一個按鈕的Sprite)的資源。這種衝突可能意味着close_dialog
給你精靈的ID,沒有腳本的,而調用腳本直接將仍起作用。
我非常感謝你經過深思熟慮的文章,但除了直接使用id之外,唯一有效的工作就是我剛發佈的答案。 –
也許是我感到困惑呢?我必須弄清楚爲什麼這不起作用。 :P – Medo42
我試了一下(在GM 8.1中),並得到了我的預期。如果我在我的遊戲中有一個腳本close_dialog,那麼您在問題中編寫的確切代碼將調用該腳本。 'show_message(string(close_dialog))'在我的例子中顯示2,腳本的ID。如果這不適合你,那一定是因爲通用汽車8.1和GM Studio之間的奇怪變化。編輯:在這種情況下,你會不會更好地寫一個函數,*調用*腳本的名稱,而不是返回它的ID? – Medo42
後在論壇上進行了很多討論,我最終選擇了這種方法。
我寫了一個腳本調用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」));
我討厭它,但它比保留電子表格更好......在我看來。
至少使用腳本名稱而不是數字。最重要的是,您需要使用字符串的原因是什麼? - 如果你想實際解析用戶輸入,這個方法很難擴展,所以在gamestart中創建一個ds_map()函數,該函數具有字符串鍵值和數字值。然後可以通過(以及腳本執行)獲得該值:'''''''''''''''''''''''''''''GameMaker:Studio中不存在'script_excecute(ds_map_find_value(SCRIPTMAP,「關閉對話框))' – paul23
還有另一種方法,用execute_string(); 應該是這樣的:
execute_string(string(scriptName) + "();");
。它在GameMaker 8.1之後被刪除。 –
它正在尋找名爲「close_dialog」的腳本,然後執行該腳本..上面的代碼與close_dialog()完全相同 – paul23
適用於我:https://www.dropbox.com/s/ mheu7mx3d62l4qp/Script%20Test.gmz?dl = 0 –