LV. 9
GP 22

【心得】將部份巨集(/run)寫進UI的方式

樓主 冰語 lmvd
GP14 BP-
其實巨集和UI的程式部分很像
簡略來說就是UI多了製造框架的部份
因為個人本身非資訊相關系所畢業的
所以如果哪邊說的不好,還請專家多包涵了
當然,這篇完全不提有關框架的部份
部份原因是個人沒有很多時間研究
目前退而求其次,花些時間把基本的處理一下
我相信有些人和我一樣有興趣,可是光入門就卡住了

這篇適合想寫一些量大的巨集但被巨集255字數限制的人
應該也適合想寫一些入門UI可是卻完全被卡住的人

我寫了一個範例,範例功能不重要(其實蠻遜的)
功能是當聖光信標只剩約五秒的時候顯示出來讓施法者注意而已
當然,這裡會做一些簡單的確認

程式邏輯是這樣的
A(聖騎)對B施放「聖光信標」
這時會確認A是「聖騎」,放的魔法是「聖光信標」
然後把施法時間點(T1)和對象存進變數(Tb = B)
施法成功時,施法成功的時間點存進變數(T2)
檢查T2-T1<1 (表示是同一次施法)
成立的話T = Tb
55秒後檢查T身上的聖光信標buff是否時間不到七秒(應該約五秒)
是的話,提示出來一句話
不是的話(表示自己有補放了)就不動作
這裡,請先下載一個範例UI
點這下載
裡面有三個檔(請用UTF8格式)
SPMacro.toc
SPMacro.xml
SPMacro.lua

因為本來就不打算寫框架
而SPMacro.toc 和 SPMacro.xml只是為了讓UI能動作的基本架構而已
所以SPMacro.toc 和 SPMacro.xml 就不多說了

再來是SPMacro.lua
先說明一下LUA的註解  1.單行註解:--   2.多行註解:--[[    --]]
所以看到 -- xxxxxxx 或  --[[ xxxxxxx --]] 請把他當旁白看
xxxxxxx 算是基本架構上要的東西
xxxxxxx 算是主要寫的function名稱
xxxxxxx 算是主要寫的程式碼了,也就是照上面說的程式邏輯寫

SPMacro.lua
-------------------------------------------------------------------------------
local PlayerClass = nil;                    --玩家職業
local PlayerClassEN = nil;                  --玩家職業(英文)
local PlayerRace = nil;                     --玩家種族
local PlayerRaceEN = nil;                   --玩家種族(英文)
local SPM_BEACON_OF_LIGHT_Target = nil;     --聖光信標的目標
local SPM_BEACON_OF_LIGHT_Target_bak = nil; --聖光信標的目標(暫定)
local SPM_BEACON_OF_LIGHT_Time = nil;       --聖光信標的時間
-------------------------------------------------------------------------------
function SPM_OnLoad(self)
    --Frame OnLoad時執行(一開始)
    PlayerClass,PlayerClassEN = UnitClass("player");
    PlayerRace,PlayerRaceEN = UnitRace("player");
    self:RegisterEvent("VARIABLES_LOADED");         --註冊事件
    self:RegisterEvent("UNIT_SPELLCAST_SENT");      --註冊事件
    self:RegisterEvent("UNIT_SPELLCAST_SUCCEEDED"); --註冊事件
    SlashCmdList["SCLSPM"] = SPM_command;
        --鍵入/SPM,會執行SPM_command(function)
    SLASH_SCLSPM1 = "/SPMacro";     --鍵入/SPMacro和/SPM一樣的
    SLASH_SCLSPM2 = "/SPM";
end
-------------------------------------------------------------------------------
function SPM_command(cmd)
     --WOW中/SPM cmd,這裡由cmd決定執行的function
    if (cmd == "") then
        SPM_help();                             --WOW中只鍵入/SPM時執行的Help文字
    elseif (cmd == "RL" or cmd == "rl") then
        ReloadUI();
    elseif (cmd == "PAL1" or cmd == "pal1") then
        PAL1();                                 --聖光信標巨集的程式 /spm pal1即可
    else
        DEFAULT_CHAT_FRAME:AddMessage("<SPM Cmd> "..cmd.." - 無此指令!!");
    end
end
-------------------------------------------------------------------------------
function SPM_help()
--Help文字,WOW中只鍵入/SPM可以看到
    DEFAULT_CHAT_FRAME:AddMessage("SPM Help:");
    DEFAULT_CHAT_FRAME:AddMessage("/spm      - 顯示Help");
    DEFAULT_CHAT_FRAME:AddMessage("/spm RL   - 重新載入UI");
    DEFAULT_CHAT_FRAME:AddMessage("/spm PAL1 - 聖光信標提示程式");
end
-------------------------------------------------------------------------------
function Out1(msg)
    --SPM自用顯示文字function 1
    DEFAULT_CHAT_FRAME:AddMessage("<SPM>"..msg);
end
function Out2(msg)
    --SPM自用顯示文字function 2
    UIErrorsFrame:AddMessage("<SPM>"..msg, 1.0, 1.0, 0, 1, 10);
end
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
function SPM_OnEvent(self,event,arg1,arg2,arg3,arg4)
    --分配事件發生時的function
    if (event=="VARIABLES_LOADED") then
        SPM_OnEvent_VariablesLoaded();
    elseif (event=="UNIT_SPELLCAST_SENT") then
        SPM_OnEvent_UnitSpellcastSent(self,arg1,arg2,arg3,arg4);
    elseif (event=="UNIT_SPELLCAST_SUCCEEDED") then
        SPM_OnEvent_UnitSpellcastSucceeded(self,arg1,arg2,arg3);
    end
end
-------------------------------------------------------------------------------
function SPM_OnEvent_VariablesLoaded()
    --VARIABLES_LOADED事件執行function
    DEFAULT_CHAT_FRAME:AddMessage("SPMacro 啟動!!");
end
-------------------------------------------------------------------------------
function SPM_OnEvent_UnitSpellcastSent(self,caster,spellName,spellRank,spellTarget)
--UNIT_SPELLCAST_SENT事件執行function
    if (PlayerClass == "聖騎士") then
        if (caster == "player" and spellName == "聖光信標") then
            SPM_BEACON_OF_LIGHT_Target_bak = spellTarget;   --暫定spellTarget
            SPM_BEACON_OF_LIGHT_Time = GetTime();
        end
    end
end
-------------------------------------------------------------------------------
function SPM_OnEvent_UnitSpellcastSucceeded(self,caster,spellName,spellRank)
--UNIT_SPELLCAST_SUCCEEDED事件執行function
    if (PlayerClass == "聖騎士") then
        if (caster == "player" and spellName == "聖光信標") then
            local t = GetTime() - SPM_BEACON_OF_LIGHT_Time;
            if (t < 1) then
                SPM_BEACON_OF_LIGHT_Target = SPM_BEACON_OF_LIGHT_Target_bak;    --確定spellTarget
            end
        end
    end
end
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
--[[    PAL1                請在設定巨集中請寫入
/cast 聖光信標
/in 55 /SPM PAL1
--]]

-------------------------------------------------------------------------------
function PAL1()
    --聖光信標倒數記時function
    local B,_,icon,_,_,dur,x,_,_ = UnitBuff(SPM_BEACON_OF_LIGHT_Target, "聖光信標");
        --讀取施法目標身上"聖光信標"的資料(x = Buff結束時間)
    local t = x - GetTime();        -- t = Buff結束時間 - 現在時間 = Buff剩餘時間
    if (t < 7) then                 -- 7 = 62 - 55
        Out1("("..SPM_BEACON_OF_LIGHT_Target..")".."聖光信標只剩下五秒了!!");
        Out2("("..SPM_BEACON_OF_LIGHT_Target..")".."聖光信標只剩下五秒了!!");
    end
end
-------------------------------------------------------------------------------
因為沒有配合框架
所以,還是要用巨集來配合
建立一個巨集,裡面寫
/cast 聖光信標
/in 55 /SPM PAL1

希望給一些對這些有興趣的人幫助
 
14
-
板務人員:

7094 筆精華,08/17 更新
一個月內新增 11
歡迎加入共同維護。


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】