全域變數 vs 區域變數

全域變數

假設你寫了這樣的觸發:

Create Trigger
 Events
 Conditions
 Actions
  Special Effect - Create a special effect attached to the overhead of
   (Triggering unit) using Abilities\Spells\Other\TalkToMe\TalkToMe.mdl
  Set Effect1 = (Last created special effect)
  Special Effect - Create a special effect attached to the origin of
   (Triggering unit) using Abilities\Spells\Undead\AnimateDead\AnimateDeadTarget.mdl
  Set Effect2 = (Last created special effect)
  Wait 15.00 game-time seconds
  Special Effect - Destroy Effect1
  Special Effect - Destroy Effect2
↓↓↓↓↓↓↓↓轉成JASS

function Trig_Create_Trigger_Actions takes nothing returns nothing
    call AddSpecialEffectTargetUnitBJ( "overhead", GetTriggerUnit(), 下行接續
        "Abilities\\Spells\\Other\\TalkToMe\\TalkToMe.mdl" )
    set udg_Effect1 = GetLastCreatedEffectBJ()
    call AddSpecialEffectTargetUnitBJ( "origin", GetTriggerUnit(), 下行接續
        "Abilities\\Spells\\Undead\\AnimateDead\\AnimateDeadTarget.mdl" )
    set udg_Effect2 = GetLastCreatedEffectBJ()
    call PolledWait( 15.00 )
    call DestroyEffectBJ( udg_Effect1 )
    call DestroyEffectBJ( udg_Effect2 )
endfunction

//===========================================================================
function InitTrig_Create_Trigger takes nothing returns nothing
    set gg_trg_Create_Trigger = CreateTrigger(  )
    call TriggerAddAction( gg_trg_Create_Trigger, function Trig_Create_Trigger_Actions )
endfunction

它的意思是:創造二個特效,十五秒後刪除是吧?不過如果分別在遊戲時間0秒與10秒時執行此觸發一次,結果如何?

時間(sec) 第一次執行 第二次執行 變數
0 建立特效(假設稱為A1)
設定udg_Effect1為A1
建立特效(假設稱為B1)
設定udg_Effect2為B1
開始等待
udg_Effect1=A1
udg_Effect2=B1
10 等待中 建立特效(假設稱為A2)
設定udg_Effect1為A2
建立特效(假設稱為B2)
設定udg_Effect2為B2
開始等待
udg_Effect1=A2
udg_Effect2=B2
15 刪除udg_Effect1(A2)
刪除udg_Effect2(B2)
等待中 udg_Effect1=A2
udg_Effect2=B2
25 刪除udg_Effect1(A2)
刪除udg_Effect2(B2)
udg_Effect1=A2
udg_Effect2=B2

你會發現,如果在等待中改變變數的值,在等待後它的值(A2和B2)就不在是等待前的值(A1和B1)了。結果第一次執行時創造的兩個特效A1和B1根本沒有被刪掉。

區域變數1

和上前的範例一樣,不過這次我們用區域變數來寫:

function Trig_Create_Trigger_Actions takes nothing returns nothing
    local effect A
    local effect B
    call AddSpecialEffectTargetUnitBJ( "overhead", GetTriggerUnit(), 下行接續
        "Abilities\\Spells\\Other\\TalkToMe\\TalkToMe.mdl" )
    set A = GetLastCreatedEffectBJ()
    call AddSpecialEffectTargetUnitBJ( "origin", GetTriggerUnit(), 下行接續
        "Abilities\\Spells\\Undead\\AnimateDead\\AnimateDeadTarget.mdl" )
    set B = GetLastCreatedEffectBJ()
    call PolledWait( 15.00 )
    call DestroyEffectBJ( A )
    call DestroyEffectBJ( B )
endfunction

//===========================================================================
function InitTrig_Create_Trigger takes nothing returns nothing
    set gg_trg_Create_Trigger = CreateTrigger(  )
    call TriggerAddAction( gg_trg_Create_Trigger, function Trig_Create_Trigger_Actions )
endfunction

如果分別在遊戲時間0秒與10秒時執行此觸發一次,執行結果如下:

時間(sec) 第一次執行 第二次執行
0 宣告區域變數A
宣告區域變數B
建立特效(假設稱為A1)
設定A為A1
建立特效(假設稱為B1)
設定B為B1
開始等待
A=A1;B=B1
10 等待中 宣告區域變數A
宣告區域變數B
建立特效(假設稱為A2)
設定A為A2
建立特效(假設稱為B2)
設定B為B2
開始等待
A=A1;B=B1 A=A2;B=B2
15 刪除A(A1)
刪除B(B1)
等待中
A=A1;B=B1 A=A2;B=B2
25 刪除A(A2)
刪除B(B2)
A=A2;B=B2

區域變數2

前面的方法雖然可以達成想要的效果,不過每次都用JASS寫是不是很麻煩? 這裡提供直接用觸發寫的方法。建議大家以後用這種寫法:

Create Trigger
 Events
 Conditions
 Actions
  Custom script: local effect A
  Custom script: local effect B
  Special Effect - Create a special effect attached to the overhead of
   (Triggering unit) using Abilities\Spells\Other\TalkToMe\TalkToMe.mdl
  Set Effect1 = (Last created special effect)
  Special Effect - Create a special effect attached to the origin of
   (Triggering unit) using Abilities\Spells\Undead\AnimateDead\AnimateDeadTarget.mdl
  Set Effect2 = (Last created special effect)
  Custom script: set A = udg_Effect1
  Custom script: set B = udg_Effect2
  Wait 15.00 game-time seconds
  Custom script: set udg_Effect1 = A
  Custom script: set udg_Effect2 = B
  Special Effect - Destroy Effect1
  Special Effect - Destroy Effect2

如果分別在遊戲時間0秒與10秒時執行此觸發一次,執行結果如下:

時間(sec) 第一次執行 第二次執行 變數
0 宣告區域變數A
宣告區域變數B
建立特效(假設稱為A1)
設定udg_Effect1為A1
建立特效(假設稱為B1)
設定udg_Effect2為B1
設定A為udg_Effect1
設定B為udg_Effect2
開始等待
udg_Effect1=A1
udg_Effect2=B1
A=A1;B=B1
10 等待中 宣告區域變數A
宣告區域變數B
建立特效(假設稱為A2)
設定udg_Effect1為A2
建立特效(假設稱為B2)
設定udg_Effect2為B2
設定A為udg_Effect1
設定B為udg_Effect2
開始等待
udg_Effect1=A2
udg_Effect2=B2
A=A1;B=B1 A=A2;B=B2
15 設定udg_Effect1為A
設定udg_Effect2為B
刪除udg_Effect1(A1)
刪除udg_Effect2(B1)
等待中 udg_Effect1=A1
udg_Effect2=B1
A=A1;B=B1 A=A2;B=B2
25 設定udg_Effect1為A
設定udg_Effect2為B
刪除udg_Effect1(A2)
刪除udg_Effect2(B2)
udg_Effect1=A2
udg_Effect2=B2
A=A2;B=B2
綜合教學/jass入門教學/a2.全域vs區域.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