常見問題 - 觸發器

索引

基本

進階

基本

Q:我想把地圖A的觸發複製到地圖B,但是為什麼總是缺少變數而出錯?

A:

因為在貼上觸發的時候不會貼上原觸發的變數,所以就會出錯。解決方法是打開複製未知變數的功能:
檔案=>偏好設定=>一般=>在貼上觸發資料時自動創造未知變數(File => Preferences => General =>Automatically create unknown variables while pasting trigger data)。

Q:如何讓遊戲開啓後,起始位置不出現主堡和工人?

A:

進入觸發編輯器,找到Melee Initialization,如果沒改過的話應該如下:

Melee Initialization
 Events
  Map initialization
 Actions
  Melee Game - Use melee time of day (for all players)
  //使一開始的遊戲時間是早上一顆星(如果刪掉就會從00:00開始)
  Melee Game - Limit Heroes to 1 per Hero-type (for all players)
  //讓所有玩家不能生產重複的英雄
  Melee Game - Give trained Heroes a Scroll of Town Portal (for all players)
  //讓第一個生產出來的英雄有傳送卷軸
  Melee Game - Set starting resources (for all players)
  //讓所有玩家一開始有一定的Gold和Lumber
  Melee Game - Remove creeps and critters from used start locations (for all players)
  //如果某起始位置有玩家,就刪除附近的Creep
  Melee Game - Create starting units (for all players)
  //產生主堡和工人於玩家的起始位置
  Melee Game - Run melee AI scripts (for computer players)
  //讓電腦玩家有AI
  Melee Game - Enforce victory/defeat conditions (for all players)
  //使用一般的勝利/失敗設定(毀掉對方所有建築者勝)

將藍色的那一條刪掉即可

Q:如何設定玩家的起始金錢和木材?

A:

新增一條觸發:

Init Resource
 Event
  Map initialization
 Actions
  Player - Set <遊戲者> Current gold to <數量>

內容請自行根據需要修改

Q:要讓被殺死的小兵掉錢,就像中立生物一樣 ?

A:

在觸發編輯器裏面用 Player - Turn Player Flag On/Off 開啟金錢獎勵,例如開啟玩者1的金錢獎勵,日後其它敵對玩家殺死玩者1的部隊就會掉錢。 在物件編輯器裏面用 Stats - Bounty Awarded - 來修改某殺死某部隊的金錢數量。

Q:假設在一張RPG地圖中,給每一位玩家一個工人,讓玩家選英雄,為什麼部隊進入該Region時沒有反應?

Event
 Unit - A unit enters <Region>
Action
 Unit - Create 1 <Unit-Type> for Triggering Player at center of <Region> facing ...

A:

設定錯誤。由於引發事件的是部隊,而不是玩家,所以 Trigging Player 無法表明到底是哪一個玩家。正確的設定方式如下:

Event
 Unit - A unit enters <Region>
Action
 Unit - Create 1 <Unit-Type> for (Owner of (Triggering Unit)) at center of <Region> facing ...

Q:為什麼這樣寫,遊戲開始卻看不到計時器出現?

Init Timer
 Events
  Map initialization
 Conditions
 Actions
  Countdown Timer - Start TimeRaminging as a One-shot timer that will expire in 660.00 seconds
  Countdown Timer - Create a timer window for (Last started timer) with title Time Left

A:

Map initialization是在loading時執行,所以你無法看到計時器出現。如果想在遊戲一開始出現訊息、計時器、……之類的東西,必須用Time - Elapsed game time is 0.00 seconds 做為事件。

Q:如何更改英雄取得經驗的比例?

A:

Action - Hero - Hero Experience Rate,設成多少百分比看自己的情況決定囉。

Q:如何製作當玩家離線時分享控制權?

A:

Event: 玩家離線
Action: Player - Pick 同盟 and do ( Player - For Triggering Player, Turn Share vision and full share unit to Picked Player )

Q:如何使用觸發對部隊扣固定的血量?

A:

像這樣寫即可--Unit - Set life of (Triggering unit) to ((Life of (Triggering unit)) - 100.00)。這是一種非常基本的函數應用,在其它很多類似的場合都能用到。
(或者使用Unit - Damage Target函數,把攻擊類型改成Chaos(或其它能造成100%傷害者),傷害類型改成Universal)

Q:如何在觸發Unit - Issue Order (Unit/Item/Dest/Point/No Target)後面的命令選項中填入我自訂的技能?

A:

當你對部隊下命令時,魔獸會以整數形式傳送一個命令代碼給部隊,而在觸發編輯器中為了便於理解和操作,大部分的命令代碼都與一個命令字串相對應(對照表)。
部隊的每個動作都對應不同的命令,系統就會在收到命令後,讓部隊做出對應的動作來。

施放技能的命令也是一種動作,所以也會有命令字串,可在技能編輯器的Order String那欄檢視(不過某些技能的該欄被省略了)。
該欄位不能修改(修改無效),也就是說,幾乎所有自訂技能的命令字串都取決於基底技能。
此外,連結、法術書等少數幾個技能的可以修改命令字串。

想像一下,我今天跟大法師大喊「blizzard」(當然不是真的對著電腦叫),剛好他的暴風雪技能對應blizzard這個命令字串,所以大法師就會施展暴風雪。
實際的情形應該是,我點選暴風雪並指定位置之後,遊戲傳送blizzard這個字串以及施放的位置給大法師,然後他才動作。
我如果放了兩個暴風雪給大法師,當他接收到blizzard之後,因為對應到兩個技能,所以就錯亂啦,可能是兩個一起放吧。
同理,如果我把Channel的命令字串改成"attack",那麼我在命令部隊施展該技能時,也會造成錯亂現象,因為部隊不知道要攻擊還是施展那個技能。

如果你寫觸發:Unit - Order (Last created unit) to Undead Dreadlord - Sleep (Picked unit)
乍看好像是命令部隊施展魔將的催眠術,實際上只是傳送命令字串"sleep"給部隊而已。

最後一欄事實上是命令字串,照理說選項應該要是"attack", "move", "smart", "sleep", ……等,
不過B社為了方便大家瞭解,把它改成了Attack, Move, Right-Click, Undead Dreadlord - Sleep (Picked unit), ……。雖然有變得比較方便,但是也造成初學者認知上的困難(不然就不會有這個問題了)。

言歸正傳,假使你的自訂技能是以舊的催眠術為基底做出來的,那麼在那一欄填入Undead Dreadlord - Sleep (Picked unit),即可傳送"sleep"命令給部隊,而又由於"sleep"對應到你的自訂技能,你的部隊就會施展它。
Order String直譯成中文就是「命令字串」。顧名思義,我只要告訴部隊這個字串,他就會執行相對應的動作。

同樣地,假設你以Channel為底,做出一個技能,並且命令改成"shockwave",那麼當你想命令部隊施展它,只要在那一欄填入Orc Tauren Chieftain - Shockwave即可。

Q:使用Create Special Effect on Unit時,attach的部分可以填寫什麼?會有什麼影響?

A:

這個是用來決定特效放置的部位。詳細請自己測試。

主要部位 說明
overhead 漂浮在部隊的頭頂上,但不隨部隊的動作而晃動
head 在部隊的頭上,並隨部隊頭部的動作而晃動
chest 在部隊的胸部
origin 預設,一般在部隊的腳旁
hand 手上
foot 腳上
weapon 武器上(只對英雄有效)
sprite 幽靈,有些會移動會旋轉(只對建築、機械部隊及Blood Mage有效)
medium 不詳(只對建築有效)
large 不詳(只對建築有效)
部位位置修正 說明
left 左邊(如hand left=左手)
right 右邊
mount 不詳(for mounted units)
rear 不詳(for quadrupeds)
first 修飾sprite的位置,1st~6th分別代表建築物上的不同位置
second 修飾sprite的位置,1st~6th分別代表建築物上的不同位置
third 修飾sprite的位置,1st~6th分別代表建築物上的不同位置
fourth 修飾sprite的位置,1st~6th分別代表建築物上的不同位置
fifth 修飾sprite的位置,1st~6th分別代表建築物上的不同位置
sixth 修飾sprite的位置,1st~6th分別代表建築物上的不同位置
rallypoint 集結點(只對建築有效)

Q:在Unit - Play Animination中,可以填入什麼字串?

A:

部隊的動畫命令可以在Previewer中預覽,如圖:
previewer.jpg

原則上填入Animination那欄的文字就好了,大小寫不限,例如stand, walk, death, …。 如果要播放像stand - 3, attack - 2這類特定的動畫,就必須用JASS寫,函數為:SetUnitAnimationByIndex,但是填入的數字代表什麼動作就得自行測試了。

Q:如何用觸發修改部隊名稱和英雄名字?

A:

沒有這個函數,除了置換部隊以外別無它法。

Q:如何用觸發器取得部隊的普通攻擊力和防禦力?

A:

沒有這個函數可以用。

Q:如何用觸發器取得像範圍性技能掃到的所有目標,例如衝擊波掃到的所有目標、連環閃電彈到的所有目標等?

A:

沒有這個函數可以用,除非你用觸發去模擬整個衝擊波或連環閃電的效果。

Q:在建立陣列時,有一個size選項是做什麼用的?

A:

它是用來設定初始值的。在地圖初始化時,電腦會把該陣列從xxx[0]~xxx[size]設定初值。這個功能是為了避免某些變數沒有初始值而不能使用。

因為在GUI Trigger中,某些控制碼變數沒有建立的語法,如果不設定初值,在遊戲中就不會有值,例如Dialog, Dialog Button, …..等,
這類變數必須先初始化以避免出問題(可以用JASS建立,但如果只用GUI就不要忘了初始化)。

至於其他類型的變數如Integer, Real, ……,基本上不管它也不會有很大的影響。

Q:請問如何做出隨機效果?

A:

用If/Then/Else中的Random Integer/Real做判斷,例如:

  1. (Random integer number between 1 and 10) Equal to 1
    //1~10中的隨機一個整數為1 → 1/10的機率

  2. (Random percentage) Less than or equal to 30.00
    //30%的機率

進階

Q:用觸發產生特效時,如何修改特效的高度、顏色、大小?

A:

直接做是行不通的,但是可以製作一個部隊,並將它的模組改成想要的特效,接著就直接在Unit Editor中改該部隊的屬性,你要它多大就多大,顏色如何就如何,高度多高就多高。

P.S:通常當作特效的部隊,最好加上Locust技能,不然有事沒事圈選到部隊,會增加玩家的困擾。

Q:如何製作會移動的特效?

A:

直接做是行不通的,但是和上題一樣,可以透過創造特效部隊,並利用觸發移動它而達到效果。

Q:如何對單一玩家播放音效或顯示特效?

A:

此功能必須使用JASS實現,請參照JASS教學

Q:如何製作像暴擊或失誤時所跳出的,會自動消退的浮動文字?

A:

簡單的做法如下,請自行依需要修改:

Floating Text - Create floating text that reads 100! at (Center of (Playable map area)) with Z offset 0.00, using font size 10.00, color (100.00%, 0.00%, 0.00%), and 0.00% transparency
Floating Text - Set the velocity of (Last created floating text) to 64.00 towards 90.00 degrees
Floating Text - Change (Last created floating text): Disable permanence
Floating Text - Change the lifespan of (Last created floating text) to 3.00 seconds
Floating Text - Change the fading age of (Last created floating text) to 1.50 seconds

Q:如何像DotA一樣讓軍營隨著遊戲時間不斷生出小兵?

A:

生小兵的設定可以分成產生小兵和命令小兵移動二部分,以下為範例

  • 產生小兵:

    Army Spawn
     Events
      Time - Every 30.00 seconds of game time
     Conditions
     Actions
      Unit Group - Pick every unit in (Units owned by Player 1 (Red) of type Ancient of War) and do (Actions)
       Loop - Actions
        If (All Conditions are True) then do (Then Actions) else do (Else Actions)
         If - Conditions
          ((Picked unit) is alive) Equal to True
         Then - Actions
          Unit - Create 3 Huntress for Player 1 (Red) at (Position of (Picked unit)) facing Default building facing degrees
         Else - Actions
      Unit Group - Pick every unit in (Units owned by Player 1 (Red) of type Ancient of Lore) and do (Actions)
       Loop - Actions
        If (All Conditions are True) then do (Then Actions) else do (Else Actions)
         If - Conditions
          ((Picked unit) is alive) Equal to True
         Then - Actions
          Unit - Create 1 Dryad for Player 1 (Red) at (Position of (Picked unit)) facing Default building facing degrees
         Else - Actions

  • 命令小兵移動:

    NE Center
     Events
      Unit - A unit enters NE Center <gen>
     Conditions
      (Owner of (Triggering unit)) Equal to Player 1 (Red)
     Actions
      Unit - Order (Triggering unit) to Attack-Move To (Center of Center Turn <gen>)

    Center Turn
     Events
      Unit - A unit enters Center Turn <gen>
     Conditions
      (Owner of (Triggering unit)) Equal to Player 1 (Red)
     Actions
      Unit - Order (Triggering unit) to Attack-Move To (Center of Ud Center <gen>)

  • 可參考範例地圖

Q:如何讓中立怪死亡後重生,像DotA一樣?

A:

以下提供最基本、最簡單的方法(當然也較費時且不完全精確)。其它更偷懶、更高級的寫法請自己想:

  • 設立一個中立怪重生的區域Creep101

  • Creep 101
     Events
      Time - Every 90.00 seconds of game time
     Conditions
      (All units of (Units in Creep101 <gen> owned by Neutral Hostile) are dead) Equal to True
     Actions
      Unit - Create 5 (Random level 1 creep unit-type) for Neutral Hostile at (Center of Creep101 <gen>) facing Default building facing degrees

  • 可參考範例地圖

Q:如何讓部隊死亡時隨機掉落物品?

A:

很多人問刷出來的怪怎麼掉寶,以下是一種簡單的基本的寫法:

Creep Drop Item
 Events
  Unit - A unit owned by Neutral Hostile Dies
 Conditions
  (Random integer number between 1 and 10) Less than or equal to 3
 Actions
  Item - Create (Random level (Level of (Dying unit)) item-type) at (Position of (Dying unit))

以上可以完成最簡單的隨機掉寶,大家可以自行加深加廣。

Q:如何用 ESC 跳過電影?

A:

建議打開官方的地圖學習,隨便一張戰役地圖都有電影
首先建立一個Boolean變數CIN_FLAG = False,這個的作用是表示你是否按下了ESC期望跳過。
然後在你寫的影片Trigger中,每一個段落後面都增加一句「if CIN_FALSE == true then 略過後面的 Actions」。
也就是說,如果記錄是否跳過的變數表示為真(也就是ESC被按了),則略過後面所有的動作。

接著創建一個 Trigger:

Event
 <Player> skips a cinematic sequence
Actions
 Set CIN_FLAG = true
 Cinematic - Turn cinematic mode Off for <Players>
 //這裡放上中斷處理的觸發

這個就是讓你在按下ESC後把變數表示為真,這樣就可以把影片略過了。至於什麼是中斷處理? 舉例來說,如果在影片一開始,什麼都沒有,然後影片內容是會先走出一名村民,然後出現一大堆食屍鬼把它圍起來做掉。
如果你略過了影片而不做處理,那你會發現影片結束時沒有食屍鬼,這樣代誌就大條了。所以中斷影片後還要加上處理,內容就是影片結束後的狀態。

Q:對話框應該如何製作?

A:

  1. 首先建立一個對話框變數

  2. 設定對話框出現的事件,例如遊戲一開始就顯示的話,可以用Time - Elapsed game time is 0.00 seconds 。動作方面:

    1. 如果先前用過該對話框,先清空對話框(Clear);沒用過的話可以略過

    2. 設定對話框的標題(Change Title),如果不想要標題可以略過

    3. 建立按鈕(Create Dialog Button),並分別用變數記錄起來(Set <Dialog Button> = Last Created Dialog Button),這裡建議使用陣列記錄

    4. 顯示對話框

  3. 建立另一個觸發,事件是對話框被按下,動作就分別判斷按下的按鈕是哪個,並分別加上相應的動作

 

範例 - 建立一個對話框,讓玩家選擇一開始要工人做什麼工作:

Dialog Start
 Events
  Time - Elapsed game time is 1.00 seconds
 Conditions
 Actions
  Dialog - Clear WorkSelection //可略過
  Dialog - Change the title of WorkSelection to 你希望工人們做什麼事?
  Dialog - Create a dialog button for WorkSelection labelled 不做事
  Set WorkSelectionButtons[1] = (Last created dialog Button)
  Dialog - Create a dialog button for WorkSelection labelled 採金
  Set WorkSelectionButtons[2] = (Last created dialog Button)
  Dialog - Create a dialog button for WorkSelection labelled 伐木
  Set WorkSelectionButtons[3] = (Last created dialog Button)
  Dialog - Create a dialog button for WorkSelection labelled 隨便
  Set WorkSelectionButtons[4] = (Last created dialog Button)
  Player Group - Pick every player in (All players) and do (Dialog - Show WorkSelection for (Picked player))

Dialog Click
 Events
  Dialog - A dialog button is clicked for WorkSelection
 Conditions
 Actions
  If (All Conditions are True) then do (Then Actions) else do (Else Actions)
   If - Conditions
    (Clicked dialog button) Equal to WorkSelectionButtons[1]
   Then - Actions
    Do nothing
   Else - Actions
  If (All Conditions are True) then do (Then Actions) else do (Else Actions)
   If - Conditions
    (Clicked dialog button) Equal to WorkSelectionButtons[2]
   Then - Actions
    Unit Group - Pick every unit in (Units owned by (Triggering player) of type Peasant) and do (Unit - Order (Picked unit) to Harvest Nearby Gold)
   Else - Actions
  If (All Conditions are True) then do (Then Actions) else do (Else Actions)
   If - Conditions
    (Clicked dialog button) Equal to WorkSelectionButtons[3]
   Then - Actions
    Unit Group - Pick every unit in (Units owned by (Triggering player) of type Peasant) and do (Unit - Order (Picked unit) to Harvest Nearby Lumber)
   Else - Actions
  If (All Conditions are True) then do (Then Actions) else do (Else Actions)
   If - Conditions
    (Clicked dialog button) Equal to WorkSelectionButtons[4]
   Then - Actions
    Unit Group - Pick every unit in (Units owned by (Triggering player) of type Peasant) and do (If ((Random integer number between 1 and 2) Equal to 1) then do (Unit - Order (Picked unit) to Harvest Nearby Gold) else do (Unit - Order (Picked unit) to Harvest Nearby Lumber))
   Else - Actions

Q:計分板應該如何製作?

A:

  1. 由於計分板一次只能顯示一個,因此一般來說,全遊戲只要創造一個計分板就夠了,所以想偷懶的人可以不用變數記錄,而只用Last Created Leaderboard取得遊戲中唯一一個由觸發建立的計分板

  2. 設定計分板出現的事件,例如遊戲一開始就顯示的話,可以用Time - Elapsed game time is 0.00 seconds 。動作方面:

    1. 建立計分板(Leaderboard - Create),並設定標題

    2. 加入在計分板中顯示的玩家

  3. 建立其他觸發,以更新計分板的資料

範例 - 建立一個殺人數的計分板:

KillsCounter Init
 Events
  Time - Elapsed game time is 0.00 seconds
 Conditions
 Actions
  Leaderboard - Create a leaderboard for (All players) titled Kills Count
  //建立計分板,標題訂為Kills Count
  Player Group - Pick every player in (All players) and do (Leaderboard - Add (Picked player) to (Last created leaderboard) with label (Name of (Picked player)) and value 0)
  //加入所有的遊戲者到計分板中,分數為0

KillsCounter Update
 Events
  Unit - A unit Dies
 Conditions
 Actions
  Set KillCount[(Player number of (Owner of (Killing unit)))] = (KillCount[(Player number of (Owner of (Killing unit)))] + 1)
  //將殺人數的記錄加1
  Leaderboard - Change the value for (Owner of (Killing unit)) in (Last created leaderboard) to KillCount[(Player number of (Owner of (Killing unit)))]
  //修改計分板上殺人者的分數
  Leaderboard - Sort (Last created leaderboard) by Value in Descending order
  //按分數從高到低排序

Q:多重面板應該如何製作?

A:

基本製作方法類似計分板:

  1. 由於多重面板一次只能顯示一個,因此一般來說,全遊戲只要創造一個多重面板就夠了,所以想偷懶的人可以不用變數記錄,而只用Last Created Multiboard取得遊戲中唯一一個由觸發建立的面板

  2. 設定計分板出現的事件,例如遊戲一開始就顯示的話,可以用Time - Elapsed game time is 0.00 seconds 。動作方面:

    1. 建立多重面板(Multiboard - Create),設定標題和行列數

    2. 依次設定各行列的顯示方式( Multiboard - Set Item Display Style )、文字、文字顏色、圖示( Multiboard - Set Item Text / Color / Icon )、寬度( Multiboard - Set Item Width )

    3. 展開面板( Multiboard - Maximize )

  3. 如果遊戲有完全分享部隊控制權的觸發,為了防止跳出的資源視窗覆蓋掉你做的面板,所以在分享的觸發後面再加上一條:Multiboard - Show (Last created multiboard),把它覆蓋回去。

  4. 可參考範例地圖

Q:如何讓全地圖的任一樹木死亡時,過一段時間自動再生?

A:

基本上要再生樹木只要用Destructible - Resurrect就好了,不過要如何指定對象倒是一門學問。我們可以這樣做:

Tree Resurrect Init
 Events
  Map initialization
 Conditions
 Actions
  Destructible - Pick every destructible in (Playable map area) and do (Actions)
   Loop - Actions
    If (All Conditions are True) then do (Then Actions) else do (Else Actions)
     If - Conditions
      (Destructible-type of (Picked destructible)) Not equal to Gate (Diagonal 1)
      (Destructible-type of (Picked destructible)) Not equal to Gate (Diagonal 2)
      …………
      //篩選選到的可毀物,確定它是樹木而不是城門之類的東西
     Then - Actions
      Trigger - Add to Tree Resurrect <gen> the event (Destructible - (Picked destructible) dies)
      //在另一個觸發中加入樹木死亡的事件
     Else - Actions

Tree Resurrect
 Events
 Conditions
 Actions
  Wait 240.00 game-time seconds
  Destructible - Resurrect (Dying destructible) with (Max life of (Dying destructible)) life and Show birth animation

雖然如此,但是如果你的地圖樹木非常多,這樣的寫法頗耗資源。有一種取代的方式可用,但比較不精確:

Tree Resurrect2
 Events
  Time - Every 300.00 seconds of game time
 Conditions
 Actions
  Destructible - Pick every destructible in (Playable map area) and do (Actions)
   Loop - Actions
    If (All Conditions are True) then do (Then Actions) else do (Else Actions)
     If - Conditions
      (Destructible-type of (Picked destructible)) Not equal to Gate (Diagonal 1)
      (Destructible-type of (Picked destructible)) Not equal to Gate (Diagonal 2)
      …………
      //篩選選到的可毀物,確定它是樹木而不是城門之類的東西
     Then - Actions
      Destructible - Resurrect (Picked destructible) with (Max life of (Picked destructible)) life and Show birth animation
     Else - Actions

Q:觸發佇列(Trigger Queue)看起來好複雜,它們有什麼實際的用途嗎?

A:

b社設計觸發佇列功能的目的,是為了在戰役中顯示提示訊息,而彼此不互相干擾。

例如你要設定,當玩家搜集1000黃金時,顯示「就快好了,你離勝利不遠了!」;而在玩家蓋好屠宰場時,顯示「屠宰場是生產血河車的建築,血河車是……」。

大家應該會直覺地直接寫二條觸發,就認為已經完成了:

Money Hint
Events
 Player - Player 1 (Red)'s Current gold becomes Greater than or equal to 1000.00
Conditions
Actions
 Game - Display to (All players) the text: 就快好了,你…

Slaughter Hint
Events
 Unit - A unit owned by Player 1 (Red) Finishes construction
Conditions
 (Unit-type of (Constructed structure)) Equal to Slaughterhouse
Actions
 Game - Display to (All players) the text: 屠宰場是生產…

然而,事情沒有那麼簡單。假設玩家在蓋好屠宰場時,馬上又達到1000黃金。
這時候屠宰產的相關提示可能就會被覆蓋掉,玩家就會看不到該提示。
為了解決此一問題,B公司於是設計了觸發佇列相關功能。並這樣寫:

Money Hint
Events
 Player - Player 1 (Red)'s Current gold becomes Greater than or equal to 1000.00
Conditions
Actions
 Trigger - Add Money Hint Q <gen> to the trigger queue (Checking conditions)

Money Hint Q
Events
Conditions
Actions
 Game - Display to (All players) the text: 就快好了,你…
 Wait 2.00 game-time seconds
 Trigger - Remove (This trigger) from the trigger queue

Slaughter Hint
Events
 Unit - A unit owned by Player 1 (Red) Finishes construction
Conditions
 (Unit-type of (Constructed structure)) Equal to Slaughterhouse
Actions
 Trigger - Add Slaughter Hint Q <gen> to the trigger queue (Checking conditions)

Slaughter Hint Q
Events
Conditions
Actions
 Game - Display to (All players) the text: 屠宰場是生產…
 Wait 3.00 game-time seconds
 Trigger - Remove (This trigger) from the trigger queue

如此一來便能很漂亮地解決此一問題。讀者可以試試看,如果不使用觸發佇列的話,要如何用簡單的方法,達到此一功能。
觸發佇列雖然可使用的範圍不甚廣泛,但是不用它的話實在是很難設計出像這樣的提示效果。

Q:遊戲快取是什麼?如何使用?

A:

快取(Cache)較詳細的說法是「快速緩衝儲存區」,它是一個暫存檔,可以開闢一個記憶體空間來儲存資料。
它的主要作用是將地圖A 的一些資料儲存起來,並使它能在地圖B中讀出,例如戰役中英雄的等級或者道具技能等。

遊戲快取可以使用觸發操作,下面說說相關動作的含義:

(1)建立一個暫存檔,想要使用暫存檔,當然要先建立啦。

Game Cache - Create a game cache from MapName.w3v

這是一個建立Cache的語句,後面的MapName.w3v是你建立的Cache的檔名。

(2)建立以後,就可以用他來儲存資料了。

Game Cache - Store Unit as Label of Category in (Last created game cache)

這是一個儲存部隊的語句,在Unit處選好需要儲存的部隊,填寫好標題(Label) 和資料夾(Category),最後選擇將部隊儲存到哪個Cache裏面。其中標題和資料夾是可以隨意填寫的,方便辨認即可。

類似的還有下面一些類型的資料可以儲存到Cache裏面,使用方法同上。

Game Cache - Store Real as Label of Category in (Last created game cache)
Game Cache - Store Integer as Label of Category in (Last created game cache)
Game Cache - Store Boolean as Label of Category in (Last created game cache)
Game Cache - Store String as Label of Category in (Last created game cache)

接下來要把它儲到硬碟裡,才能從別的地圖中讀出:

Game Cache - Save (Last created game cache)

上面說的是儲存資料,但是怎麼取出資料呢? 首先在任何可以使用你想取出的資料類型的地方都可以通過Game Cache - Load XXXXXX Cache 來取出資料

另外

Game Cache - Restore Label of Category from (Last created game cache) for Player 1 (Red) at (Center of (Playable map area)) facing 0.00
Game Cache - Restore Label of Category from (Last created game cache) for Player 1 (Red) at (Center of (Playable map area)) facing (Position of (Triggering unit))

這個語句可以取出一個被儲存的部隊,並且將它放置在地圖上。

最後,如果想清除快取中的資料,可以使用下面兩個語句:

Game Cache - Clear (Last created game cache)

清除所有資料。

Game Cache - Clear all labels of Category in (Last created game cache)

清除某資料夾內的所有資料。

※遊戲快取可用在多人連線遊戲中,做為暫存工具,但不能將檔案寫入硬碟或從硬碟中讀取(也就是不同地圖之間的資料傳輸),因為每台電腦的硬碟中可能有不同的檔案,這麼做會造成不同步而斷線。

Q:如何用觸發器抓到有重生技能而在死亡重生的部隊?

A:

沒有這個事件可以直接抓到,但是可以用複雜一點的觸發組合偵測:

Reincarination Detect
 Events
  Unit - Tauren Chieftain 0026 <gen>'s life becomes Less than 0.01
 Conditions
 Actions
  Wait 0.01 seconds
  If (All Conditions are True) then do (Then Actions) else do (Else Actions)
   If - Conditions
    (Reincarination Detect2 <gen> is on) Equal to True
   Then - Actions
    Trigger - Turn on Reincarination Finish <gen>
   Else - Actions
  Trigger - Turn on Reincarination Detect2 <gen>

Reincarination Detect2
 Events
  Unit - Tauren Chieftain 0026 <gen> Dies
 Conditions
 Actions
  Trigger - Turn off (This trigger)

Reincarination Finish (預設關閉)
 Events
  Unit - Tauren Chieftain 0026 <gen>'s life becomes Greater than 0.01
 Conditions
 Actions
  Trigger - Turn off (This trigger)
  -------- 復活時要執行的動作--------

Q:我想用「一個部隊受到傷害」做為事件,可是一般部隊事件中沒有這個選項(只有特定部隊事件有)。有什麼辦法做出這個效果?

A:

需要用一點技巧製作:

All Unit Damage Init
 Events
  Map initialization
 Conditions
 Actions
  Unit Group - Pick every unit in (Units in (Playable map area)) and do (Actions)
   Loop - Actions
    Trigger - Add to All Unit Damage Trigger <gen> the event (Unit - (Picked unit) Takes damage)

All Unit Damage Add
 Events
  Unit - A unit enters (Entire map)
 Conditions
 Actions
  Trigger - Add to All Unit Damage Trigger <gen> the event (Unit - (Triggering unit) Takes damage)

All Unit Damage Trigger
 Events
 Conditions
 Actions
  -------- 要執行的動作。使用共用方式,讓本動作去呼叫所有要執行的觸發,較不會浪費資源。--------
  Trigger - Run <Trigger1> (checking conditions)
  Trigger - Run <Trigger2> (checking conditions)
  Trigger - Run <Trigger3> (checking conditions)
  Trigger - Run <Trigger4> (checking conditions)
  ……

然而,「全地圖部隊受傷事件」是一個觸動頻率極高的觸發,而且為每個部隊加入事件也會浪費記憶體,記憶體會隨著新部隊的加入不斷被佔用,所以小心使用為佳。 此外,JASS綜合應用提供達成此目的的另一個做法,效率較高也較環保,不過需要用到較高的技術。

常見問題/觸發器.txt · 上一次變更: 2007年11月12日 9: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