使用 Ctrl + F 快速搜尋
動機 將一些過去的經驗整理出來,有人來問時可以比較有系統的將知識傳遞給對方,近年資源也日漸稀少而且分散做個紀錄也方便大家。 完整的編輯器教學請去流連忘返的世界編輯器自學指南 JASS 是甚麼 JASS 是暴雪開發的一款用於魔獸爭霸創建地圖的腳本語言,提供了非常豐富的 APId 為甚麼要使用 JASS
所有 GUI 觸發器本質上都是 JASS,他只是多了視覺化的操作而已
解放限制讓你能完整使用觸發器強大的功能
可以把一些常用功能寫成函數在各個地方使用
你會很常需要使用自訂函數,區域變數等功能使用 GUI 操作上會變得非常複雜
你可以在 vs code 或其他文字編輯器中編輯、管理腳本,函數自動提示語法高量會讓你的生活輕鬆很多
你不會因為崩潰損失未存檔的代碼還原只需要複製貼上
全域變數 定義方式 觸發器介面中新增變數也是這種方式,腳本中所有 globals 區塊都會被移到腳本最上層,可以定義在任何地方這些變數在整個腳本中都可以讀取到 1 2 3 4 5 function Init_globals takes nothing returns nothing globals //在這邊定義全域變數 endglobals endfunction
區域變數 使用 local 可以定義只在這個函數存在的變數,有個小重點魔獸爭霸是不會自動回收沒使用的變數的,有繼承 handle 的物件都必須手動銷毀和指向 null,不然在大量執行後會導致記憶體外洩造成崩潰最常見的是點(location)沒有清理。 要更改變數資料要使用 set [變數名稱]=[值] 1 2 3 4 function Local takes nothing returns nothing local unit u= null set u = null endfunction
呼叫其他函數(function) 在函數中要使用其他函數都必須使用 call,記得注意函數在腳本中的順序 1 2 3 function Local takes nothing returns nothing call functionName() endfunction
觸發器(Trigger) 相信開始接觸 Jass 代表你對觸發器已經有基本的概念,觸發器在 GUI 中主要分為三個部分 事件、條件、動作,在編輯->轉化為自訂義腳本中可以發現在 JASS 中觸發器也是分成這三個部分,只是多了一個負責 InitTrigger 的部分。 使用 GUI 創建新的觸發實際上執行的工作是這些
新增初始化 function ,在裡面創建新的觸發器(trigger)註冊條件(condition function)、動作(function)、事件(event),分別是 TriggerAddCondition(trigName, Condition(function funcName) ),TriggerAddAction(trigName,function ActionFuncName),TriggerRegisterEventFunction
新增條件,動作函數(function)名稱是 Trig_你的觸發器名稱_Action\Condition
放到 Jass 腳本中最底下 Init 中呼叫初始化,這邊有個重點 Jass 是自上而下逐行執行的所以放在上面的函數是讀不到下面的函數的
註冊是不用照順序的你要先註冊動作還是事件條件都可以
這是觸發做的回復魔力技能 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 function Trig_MeditationConditions takes nothing returns boolean return ((GetSpellAbilityId() == 'A011')) endfunction function Trig_MeditationActions takes nothing returns nothing local unit u = GetSpellAbilityUnit() local integer level = GetUnitAbilityLevel(u, 'A011') local real maxMana = GetUnitStateSwap(UNIT_STATE_MAX_MANA, u) local real Mana = GetUnitStateSwap(UNIT_STATE_MANA, u) local real recoverMana = Mana + maxMana *(0.2 +(0.05 * level)) call SetUnitManaBJ( u, recoverMana ) set u = null endfunction //=========================================================================== function InitTrig_Meditation takes nothing returns nothing set gg_trg_Meditation = CreateTrigger() call TriggerRegisterAnyUnitEventBJ( gg_trg_Meditation, EVENT_PLAYER_UNIT_SPELL_EFFECT ) call TriggerAddCondition(gg_trg_Meditation, Condition(function Trig_MeditationConditions)) call TriggerAddAction(gg_trg_Meditation, function Trig_MeditationActions) endfunction