JASS函數研究

BJDebugMsg

懶人專用檢查函數,會直接po出指定的訊息60秒。和GUI的Game - Display to (All players) the text: XXX不同的是,這個函數在replay不會看不到字。

GroupEnumUnitsIn...

GroupEnumUnitsInRange, GroupEnumUnitsInRangeOfLoc, GroupEnumUnitsInRect這幾個GUI Trigger常用的選部隊函數(即Units in Range等)不會考慮部隊碰撞體積,也就是部隊視為一個點,只有部隊的中心點落在範圍內才會被選到。
此外,被隱藏或有Locust(且無Chaos)的部隊不會被這些函數選到。

IsUnitIn...

IsUnitInRange, IsUnitInRangeXY, IsUnitInRangeLoc乍看之下這幾個函數和取部隊位置再判斷距離結果一樣,但是這三個函數會考慮部隊的碰撞體積,也就是把部隊視為一個圓,只要圓的一小部分落在半徑內就成立。

此類函數通常最有用的地方就在於可以完美地使觸發效果和範圍技能的圓形魔法陣完全相符。
一般我們用觸發製作範圍效果都是用Pick Units …,由於把部隊視為一個點,常常無法和技能的圓形魔法陣完全相符。
不過,只要Pick較大的範圍,再用此類函數做篩選,就能取出完全相符的範圍。

Cheat

相當於用觸發輸入作弊碼,當然也只有單機能使用。用法如:call Cheat("whosyourdaddy")、call Cheat("greedisgood 1000")

ExecuteFunc

一個很特別的函數,進階的JASSer常會用到。
它會新增一道執行緒去處理指定函數的內容(不會等被執行者的Wait跑完才跑call ExecuteFunc的下一行)。被呼叫的函數必須是takes nothing returns nothing。

這個函數可以呼叫寫在它後面的函數。用法如:

function Test takes nothing returns nothing
 call ExecuteFunc("MyFunc")
endfunction

function MyFunc takes nothing returns nothing
 call BJDebugMsg("MyFunc is executed")
endfunction

如果電腦找不到指定的函數名會當機。

此函數不可調用不同檔案的函數 例如從地圖腳本(war3map.j) 使用

    // DoNothing (blizzard.j)
    call ExecuteFunc("DoNothing")

這樣是不行的

SetUnitX, SetUnitY

和SetUnitPosition與SetUnitPositionLoc不同的是這兩個函數不會檢查部隊碰撞,所以可以移動到和其它部隊重疊。
而且這兩個函數在移動部隊後不會給他們下"stop"命令,因此不會打斷部隊目前的技能或動作。
這兩個函數被認為比後兩個快速(因為不檢查碰撞);不過,把部隊移到地圖範圍外面會造成當機。

UnitMakeAbilityPermanent

用此函數把技能設為永久技能,那麼即使部隊變身或者受到其它影響,該技能都會繼續保留,就像英雄技能一樣。
對於有子技能的技能,如法術書或法球,你必須也用此觸發對子技能做設定,而不是只設定母技能就好了。

MoveLocation

把指定的點移到新的位置,而不是像GUI的point with polar offset在新位置創點。

TriggerRegisterUnitInRange

這個事件不僅會偵測後來進入的部隊,剛登錄事件時,也會偵測已在範圍內的部隊。登錄事件後,經過約0.120~0.130秒的延遲才會偵測到範圍內的部隊。

後來進入範圍的部隊,要經過約0.00x~0.13秒的延遲才會被偵測並觸發事件。換言之,如果把部隊移入範圍再立即移開,就不會觸發事件。

Region

GUI Trigger寫的Region實際上在JASS是rect(rectangle, 矩形區)。而JASS中另外有一個region,它由任意個cell(單位格)組成,而且可以是不規則的形狀。

以下是相關函數:

//建立和刪除區域
native CreateRegion takes nothing returns region
native RemoveRegion takes region whichRegion returns nothing

//把矩形區加入/移出區域範圍
native RegionAddRect takes region whichRegion, rect r returns nothing
native RegionClearRect takes region whichRegion, rect r returns nothing

//把單位格加入/移出區域範圍
native RegionAddCell takes region whichRegion, real x, real y returns nothing
native RegionAddCellAtLoc takes region whichRegion, location whichLocation returns nothing
native RegionClearCell takes region whichRegion, real x, real y returns nothing
native RegionClearCellAtLoc takes region whichRegion, location whichLocation returns nothing

//判斷部隊/點是否在區域內
native IsUnitInRegion takes region whichRegion, unit whichUnit returns boolean
native IsPointInRegion takes region whichRegion, real x, real y returns boolean
native IsLocationInRegion takes region whichRegion, location whichLocation returns boolean

//登錄部隊進入/離開區域的事件
native TriggerRegisterEnterRegion takes trigger whichTrigger, region whichRegion, :return:
 boolexpr filter returns event
native TriggerRegisterLeaveRegion takes trigger whichTrigger, region whichRegion, :return:
 boolexpr filter returns event

//取得觸發事件的區域/部隊
constant native GetTriggeringRegion takes nothing returns region
constant native GetEnteringUnit takes nothing returns unit
constant native GetLeavingUnit takes nothing returns unit

區域的單位格為32×32的矩形區,實際範圍是像這樣:0.0≦x<32.0;0.0≦y<32.0(下文會記為:[0.0,32.0)×[0.0,32.0),"["或"]"表示含邊界值,"("或")"表示不含邊界值),它的右邊一格是[32.0,64.0)×[0.0,32.0),依此類推。
加入單位格的函數會偵測包含指定點的單位格,並且把它加入區域範圍。例如加入點(32.0,0.0)時,實際加入的範圍會是這一個單位格:[32.0,64.0)×[0.0,32.0)。
加入矩形區時,它會加入矩形區掃到的所有單位格。例如加入這個矩形區:[10.0,64.0]×[0.0,35.0],實際加到區域的範圍是:[0.0,96.0)×[0.0,64.0),共 3×2=6 個單位格。
我們可以看出,無論是把點或矩形區加入到區域,它的範圍都會稍微擴大一點。

rect其實是一個記錄邊界值的物件,它可以記錄任意的實數,邊界上較精確--但是它只能是個矩形。它的用途是可以取最大、中間、最小的x或y值,也能用來取出包含在內的所有部隊、物品、可毀物進行操作。
region由單位方格組成,所以邊界不是非常精確,但是可以是不規則形。主要用途是可以登錄部隊進出事件,附加用途是可以判斷部隊或點是否在區域內。

由於WE限制畫出來的矩形區邊界值必須為32的倍數,所以畫出來的矩形區範圍都會像是[0.0,128.0]×[0.0,128.0]這樣。用矩形區登錄的「部隊進入/移出」事件,實際上是 先新增一個區域,把矩形區的範圍加入,再用區域登錄事件(所以每登錄一個GUI的"區域事件",就增加了一個區域)。我們知道如果把 前述範圍的矩形區加入區域,會得到[0.0,160.0)×[0.0,160.0),可以看出它比原來的矩形區大了一點,因此部隊如果從右方或上方進入區域,例如步入(158.0,158.0),「部隊進入區域」的事件被觸發了,判斷RectContainsUnit卻為false,這就是BUG列表其中一個BUG的由來。

和TriggerRegisterUnitInRange稍微不同之處在於,「部隊進入區域」事件登錄時,不會偵測已在範圍內的部隊;同樣的「部隊離開區域」事件登錄時,不會偵測不在範圍內的部隊。
當部隊移動進區域中,會經過約0.02~0.05秒的延遲才觸發事件。但如果部隊使用各種瞬移的方式進出(EX: 觸發移動、傳卷,甚至是傭兵、生產、召喚等等),仍然會立刻被偵測到。
另外,這兩類函數都是以部隊中心進入/離開來觸發事件,也就是不考慮碰撞體積。  

Trackable

Trackable是一種很特別的物件,它是一種會在地圖上顯示模組的物件。可以用它來做出一些被滑鼠點的東西。以下是相關函數:

//建立Trackable
native CreateTrackable takes string trackableModelPath, real x, real y, real facing :return:
 returns trackable

//登錄Trackable被滑鼠點擊的觸發事件
native TriggerRegisterTrackableHitEvent takes trigger whichTrigger, trackable t returns event

//建立滑鼠移過Trackable的觸發事件
native TriggerRegisterTrackableTrackEvent takes trigger whichTrigger, trackable t returns event

//取得觸發事件的Trackable
constant native GetTriggeringTrackable takes nothing returns trackable

然而,此物件最大的缺點是創造後無法移除,而且無法移動。  

研究資料/jass函數研究.txt · 上一次變更: 2009年08月11日 3:22 pm 來自 applesheep
www.chimeric.de Creative Commons License Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0