我正在著手創建我的第一個《魔獸世界》插件,在我的研究程序中,我讀到《魔獸世界》中創建的每一幀都是全球性的,這真的讓我感到困惑。
我見過很多只做 f = CreateFrame(..) 的插件,所以這些插件不會一直沖突嗎?
對此可能有一個簡單的解釋,如果問題有點愚蠢,很抱歉,但如果有人能為我澄清這一點,我將不勝感激
uj5u.com熱心網友回復:
從 XML 檔案創建的每個幀都是全域的,因此可以從 Lua 檔案訪問它們。
- 你好.toc
## Interface: 90205
## Version: 1.0.0
## Title: Hello
hello.xml
- 你好.xml
<Ui>
<Script file="hello.lua"/>
<Frame name="HelloWorldFrame"> <!-- global frame -->
<Scripts>
<OnLoad>
HelloWorld_OnLoad(self)
</OnLoad>
<OnEvent>
HelloWorld_OnEvent(self, event, ...)
</OnEvent>
</Scripts>
</Frame>
</Ui>
- 你好.lua
function HelloWorld_OnLoad(self)
print("Loaded HelloWorldFrame")
self:RegisterEvent("CHAT_MSG_SAY")
end
function HelloWorld_OnEvent(self, event, ...)
print("Your character said something", event, ...)
end
如果您只使用 Lua 檔案并在那里創建框架,則不一定需要將其設為全域。
local function OnEvent(self, event, ...)
print("Your character said something", event, ...)
end
local f = CreateFrame("Frame")
f:RegisterEvent("CHAT_MSG_SAY")
f:SetScript("OnEvent", OnEvent)
我見過很多只做 f = CreateFrame(..) 的插件,所以這些插件不會一直沖突嗎?
只要他們把它本地化,他們就不會發生沖突。如果每個人都制定一個全球f框架,那么它會發生沖突是的。
uj5u.com熱心網友回復:
我對魔獸世界一無所知,但我對Lua足夠熟悉,我覺得我可以回答這個問題。如果框架默認放置在全域環境中,那么您發布的代碼示例:
f = CreateFrame(...)
本身不會產生這樣的“沖突” - 框架可以簡單地分配給f兩次,或者一次分配給f傳遞給 CreateFrame 的任何名稱。
這對 Lua 本身沒有任何問題,因為變數賦值是動態的,你幾乎可以對這些值做任何你想做的事情。覆寫已經設定的變數不是問題,舊值將被釋放并自動收集垃圾,或者如果舊值和新值是相同的參考,則不會發生任何事情。
如果您曾經看到將回傳值分配給區域變數,例如local f = CreateFrame(...)在函式內部,那么程式員使用區域變數而不是全域名稱可能只是風格問題。
如果我正確地假設該函式設定了一個全域變數但也回傳了該值,那么它可能像您觀察到的那樣是多余的,但它無關緊要,即它不會引起任何問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/489235.html
