觸發器與JASS

對照觸發轉JASS的模式

觸發器 NO ENTER
 Events
  Unit - A unit enters Region 000 <gen>
 Conditions
  (Owner of (Triggering unit)) Equal to Player 1 (Red)
 Actions
  Unit - Kill (Triggering unit)

↓↓↓↓↓↓↓↓轉成JASS

function Trig_NO_ENTER_Conditions takes nothing returns boolean
    if ( not ( GetOwningPlayer(GetTriggerUnit()) == Player(0) ) ) then
        return false
    endif
    return true
endfunction

function Trig_NO_ENTER_Actions takes nothing returns nothing
    call KillUnit( GetTriggerUnit() )
endfunction

//===========================================================================
function InitTrig_NO_ENTER takes nothing returns nothing
    set gg_trg_NO_ENTER = CreateTrigger(  )
    call TriggerRegisterEnterRectSimple( gg_trg_NO_ENTER, gg_rct_Region_000 )
    call TriggerAddCondition( gg_trg_NO_ENTER, Condition( function Trig_NO_ENTER_Conditions ) )
    call TriggerAddAction( gg_trg_NO_ENTER, function Trig_NO_ENTER_Actions )
endfunction

可以看到,當你在觸發編輯器中建立了一個名為NO ENTER的觸發器時,WE會自動生成一個InitTrig_NO_ENTER函數,並且送你一個觸發器變數gg_trg_NO_ENTER(變數名不可有空白,所以改為底線)。其中InitTrig_NO_ENTER函數不能刪掉,因為在最後編譯成的.j檔,會在地圖初始化時呼叫此函數,如果刪掉會找不到,造成錯誤。而gg_trg_NO_ENTER變數既然已經生成,自然不能刪掉,不過你可以不使用它,或者移作它用,這個以後會再提。

我們可以發現,觸發器其實也不過是一個物件,首先由CreateTrigger()創立,在初始化時加入事件、條件及動作,修件和動作的函數名稱是WE自行建立,你可以改變它,只要不和別的函數或變數名稱 重複即可。這種做法並非一成不變,進階的JASS使用者日後都會動態地創造觸發器、事件、動作,以便靈活運用。

再來一個範例

Undead Base
 Events
  Unit - A unit enters Region 000 <gen>
 Conditions
 Actions
  If (All Conditions are True) then do (Then Actions) else do (Else Actions)
   If - Conditions
    ((Triggering unit) is Undead) Equal to True
   Then - Actions
    Unit - Set life of (Triggering unit) to 100.00%
   Else - Actions
    If (All Conditions are True) then do (Then Actions) else do (Else Actions)
     If - Conditions
      ((Triggering unit) is A Hero) Equal to True
     Then - Actions
      Unit - Kill (Triggering unit)
     Else - Actions
      Unit - Explode (Triggering unit)

↓↓↓↓↓↓↓↓轉成JASS

function Trig_Undead_Base_Func001Func001C takes nothing returns boolean
    if ( not ( IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO) == true ) ) then
        return false
    endif
    return true
endfunction

function Trig_Undead_Base_Func001C takes nothing returns boolean
    if ( not ( IsUnitType(GetTriggerUnit(), UNIT_TYPE_UNDEAD) == true ) ) then
        return false
    endif
    return true
endfunction

function Trig_Undead_Base_Actions takes nothing returns nothing
    if ( Trig_Undead_Base_Func001C() ) then
        call SetUnitLifePercentBJ( GetTriggerUnit(), 100 )
    else
        if ( Trig_Undead_Base_Func001Func001C() ) then
            call KillUnit( GetTriggerUnit() )
        else
            call ExplodeUnitBJ( GetTriggerUnit() )
        endif
    endif
endfunction

//===========================================================================
function InitTrig_Undead_Base takes nothing returns nothing
    set gg_trg_Undead_Base = CreateTrigger(  )
    call TriggerRegisterEnterRectSimple( gg_trg_Undead_Base, gg_rct_Region_000 )
    call TriggerAddAction( gg_trg_Undead_Base, function Trig_Undead_Base_Actions )
endfunction

↓↓↓↓↓↓↓↓簡化後的JASS

function Trig_Undead_Base_Actions takes nothing returns nothing
    if IsUnitType(GetTriggerUnit(), UNIT_TYPE_UNDEAD) then
        call SetUnitLifePercentBJ( GetTriggerUnit(), 100 )
    elseif IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO) then
        call KillUnit( GetTriggerUnit() )
    else
         call ExplodeUnitBJ( GetTriggerUnit() )
    endif
endfunction

//===========================================================================
function InitTrig_Undead_Base takes nothing returns nothing
    set gg_trg_Undead_Base = CreateTrigger(  )
    call TriggerRegisterEnterRectSimple( gg_trg_Undead_Base, gg_rct_Region_000 )
    call TriggerAddAction( gg_trg_Undead_Base, function Trig_Undead_Base_Actions )
endfunction

GUI Trigger和JASS相比,效率實在是低很多。本來可以很簡單的程式碼,為了GUI Trigger編譯的需要,而犠牲了執行效率。

JASS程式碼是線性執行的,也就是同一時間只做一件事。而觸發器是只要有事件它就做事,可以多個並行(在同一時間,不同的觸發器做不同的事)。

綜合教學/jass入門教學/a1.觸發器與jass.txt · 上一次變更: 2007年11月11日 3:06 pm 來自 wasabi
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