Trigger Tree Present: Zoxc @ wc3campaigns | Migration: Greedwind | 展開 | 收縮 | 復制 JASS
事件
時間 - 逝去的遊戲時間是 0.00 秒
環境
動作
設置 point = (區域 (可玩的地圖區域) 的中心)
對壹個 (循環整數 A), 從 1 遞增到 10, 做(動作)
Loop - 動作
單位 - 創造 1 個 步兵 為了 玩家 1 (紅色) 在 point 面對 默認的建築朝向 度
等待 2.00 遊戲秒
點 - 刪除 point
這是個很簡單的演示 大家很容易看懂
現在我們把這條T轉為J
jass: Copy code... Trig_Jass_Actions takes nothing returns nothing
set udg_point = GetRectCenter(GetPlayableMapRect())
set bj_forLoopAIndex = 1
set bj_forLoopAIndexEnd = 10
loop
exitwhen bj_forLoopAIndex > bj_forLoopAIndexEnd
call CreateNUnitsAtLoc( 1, 'hfoo', Player(0), udg_point, bj_UNIT_FACING )
call PolledWait( 2 )
set bj_forLoopAIndex = bj_forLoopAIndex + 1
endloop
call RemoveLocation( udg_point )
end...
//===========================================================================
... InitTrig_Jass takes nothing returns nothing
set gg_trg_Jass = CreateTrigger( )
call TriggerRegisterTimerEventSingle( gg_trg_Jass, 0.00 )
call TriggerAddAction( gg_trg_Jass, ... Trig_Jass_Actions )
或許妳要說我偷懶 因為我只是把T轉成J 然後再調用罷了 這跟用T做沒什麽不同 的確是這樣
所以 我們接下來優化下這段刷兵代碼
jass: Copy code... JassCreateUnit takes nothing returns nothing
set udg_point = GetRectCenter(GetPlayableMapRect())
set bj_forLoopAIndex = 1
set bj_forLoopAIndexEnd = 10
loop
exitwhen bj_forLoopAIndex > bj_forLoopAIndexEnd
call CreateNUnitsAtLoc( 1, 'hfoo', Player(0), udg_point, bj_UNIT_FACING )
call PolledWait( 2 )
set bj_forLoopAIndex = bj_forLoopAIndex + 1
endloop
call RemoveLocation( udg_point )
end...
之前我們說 在循環裏最好不要加等待 為什麽呢 因為循環函數A和B都是全局變量 它們在執行時 如果同時有別的地方也在使用 那麽就會出錯 因此 我們要把代碼裏的全局變量通通換成局部變量
優化後的代碼如下所示:
jass: Copy code... JassCreateUnit takes nothing returns nothing
local location point
local integer i=0
set point = GetRectCenter(GetPlayableMapRect())
loop
set i = i+1
exitwhen i > 10
call CreateNUnitsAtLoc( 1, 'hfoo', Player(0), point, bj_UNIT_FACING )
call PolledWait( 2 )
endloop
call RemoveLocation( point )
set point=null
end...
好了 以上的代碼就是標準的JASS寫法了(CreateNUnitsAtLoc屬於bj函數 當妳有了壹定基礎後 可以不使用bj函數)
到這我們還沒完 因為我們希望這個JassCreateUnit功能能更強大點 比如 我們希望這函數刷兵的數量不是固定的 而是我們想刷多少就刷多少
我們可以這樣修改
jass: Copy code... JassCreateUnit takes integer Num returns nothing
local location point
local integer i=0
set point = GetRectCenter(GetPlayableMapRect())
loop
set i = i+1
exitwhen i > Num
call CreateNUnitsAtLoc( 1, 'hfoo', Player(0), point, bj_UNIT_FACING )
call PolledWait( 2 )
endloop
call RemoveLocation( point )
set point=null
end...
之前我們的JassCreateUnit函數是takes nothing 現在我改成了takes integer i 也就是傳遞壹個類型為整數的參數給函數
然後我們把循環結束的條件從 i>10 改成 i>Num 如果Num=5 那麽循環就只執行5次 生成5個步兵
由於我們給函數加了參數 那麽我們在調用的時候 必須在函數的括號裏寫上壹個參數
Trigger Tree Present: Zoxc @ wc3campaigns | Migration: Greedwind | 展開 | 收縮 | 復制 Jass
事件
時間 - 逝去的遊戲時間是 0.00 秒
環境
動作
自定義: call JassCreateUnit(5)
註意括號裏寫的是5 那麽就是說 我們把Num設置為5 系統將會刷5個步兵 如果我們想刷10個 那麽就jass: Copy codecall JassCreateUnit(10)
現在我們的JassCreateUnit函數已經足夠強大了 但完全可以更強大 比如 目前它只能在地圖中心刷兵 如何讓它在其它地點刷兵呢 或許妳想到了 再增加壹個參數 來傳遞刷兵的地點
jass: Copy code... JassCreateUnit takes player P,integer Num,location point returns nothing
local integer i=0
loop
set i = i+1
exitwhen i > Num
call CreateNUnitsAtLoc( 1, 'hfoo', P, point, bj_UNIT_FACING )
call PolledWait( 2 )
endloop
end...
然後我們這樣調用
Trigger Tree Present: Zoxc @ wc3campaigns | Migration: Greedwind | 展開 | 收縮 | 復制 Jass
事件
時間 - 逝去的遊戲時間是 0.00 秒
環境
動作
設置 P = 玩家 2 (藍色)
設置 point = (區域 (可玩的地圖區域) 的中心)
自定義: call JassCreateUnit(udg_P,20,udg_point)
點 - 刪除 point
OK 現在我們修改 設置 point = (區域 (可玩的地圖區域) 的中心) 就可以在任意位置刷兵了
不過現在刷出的兵都是面朝默認建築朝向 我們可以再加壹個參數 讓兵面朝這個方向
jass: Copy code... JassCreateUnit takes player P,integer Num,location point,real angle returns nothing
local integer i=0
loop
set i = i+1
exitwhen i > Num
call CreateNUnitsAtLoc( 1, 'hfoo', P, point, angle )
call PolledWait( 2 )
endloop
end...
把bj_UNIT_FACING 換成angle就可以了
好了 現在我們的JassCreateUnit調用的參數已經很多了 call JassCreateUnit(udg_P,20,udg_point,180) 那麽 刷出的兵會面向180度
按理說目前JassCreateUnit的功能很強大了 但人的貪心是沒有止境的 比如現在這函數只能刷步兵 那我們要刷騎士怎麽辦呢 難道要再做個專門刷騎士的函數 不用 我們還可以繼續增加參數
jass: Copy code... JassCreateUnit takes player P,integer Num,location point,real angle,integer uid returns nothing
local integer i=0
loop
set i = i+1
exitwhen i > Num
call CreateNUnitsAtLoc( 1, uid, P, point, angle )
call PolledWait( 2 )
endloop
end...
由於”單位類型”是其實是數值型 所以這裏參數類型是integer
Trigger Tree Present: Zoxc @ wc3campaigns | Migration: Greedwind | 展開 | 收縮 | 復制 Jass
事件
時間 - 逝去的遊戲時間是 0.00 秒
環境
動作
設置 P = 玩家 2 (藍色)
設置 point = (區域 (可玩的地圖區域) 內的隨機地點)
設置 UnitID = 騎士
自定義: call JassCreateUnit(udg_P,20,udg_point,120,udg_UnitID)
點 - 刪除 point
然後在區域內的隨機點 回每隔2秒出現個玩家二的騎士 面朝120度 直到刷出20個為止
為蝦米要每隔2秒刷壹個 刷兵時間間隔能否修改 當然能 還是...加參數
jass: Copy code... JassCreateUnit takes player P,integer Num,location point,real angle,integer uid,integer timeout returns nothing
local integer i=0
loop
set i = i+1
exitwhen i > Num
call CreateNUnitsAtLoc( 1, uid, P, point, angle )
call PolledWait( timeout )
endloop
end...
好吧 jass: Copy codecall JassCreateUnit(udg_P,20,udg_point,120,udg_UnitID,5) 就素每隔5秒刷個單位
或許現在妳已經對給函數增加參數著了迷 還能再加參數嗎 當然能 比如 在call CreateNUnitsAtLoc( 1, uid, P, point, angle ) 裏 每次是生成壹個單位 如果把括號裏面的1換成參數 那麽就可以控制每次刷兵的個數了
jass: Copy code... JassCreateUnit takes player P,integer Num,location point,real angle,integer uid,integer tiomout,integer N returns nothing
local integer i=0
loop
set i = i+1
exitwhen i > Num
call CreateNUnitsAtLoc( N, uid, P, point, angle )
call PolledWait( timeout )
endloop
end...
如今JassCreateUnit已經強大到能為任何壹個玩家在任何壹個地點每隔任何壹個時間間隙刷出任何數目的單位面向任何壹個角度...
或許妳現在忍不住叫出來了 這不就是3C刷兵函數麽 呵呵 別急 3C裏的刷兵函數 刷出來的兵會自動進攻到對方基地 下面才素真正的3C函數吶
jass: Copy code... JassCreateUnit takes player P,integer Num,location point,real angle,integer uid,integer timeout,integer N,location targetpoint returns nothing
local integer i=0
local integer n=0
local unit u
loop
set i = i+1
exitwhen i > Num
set n=0
loop
set n = n+1
exitwhen n > N
set u=CreateUnitAtLoc( P, uid, point, angle )
call IssuePointOrderLoc(u,"attack",targetpoint)
set u=null
endloop
call PolledWait( timeout )
endloop
end...
在這函數裏 我們增加了壹個點參數targetpoint 然後刷出來的單位會進攻到這點 另外 原來的CreateNUnitsAtLoc函數被CreateUnitAtLoc取代 這樣方便我們對生成的單位發布命令
好吧 本次講解到這結束 如果我壹開始叫妳寫個3C刷兵函數 妳是不是會被嚇倒 可是 我們從壹個非常簡單的刷兵函數寫起 不斷增加它的功能 直到它變成了3C刷兵函數那樣復雜的函數 可見 任何事都是從小事做起
另 現在的JassCreateUnit的確可實現3C的刷兵功能 不過由於它采用的是PolledWait(等待)函數 因此時間精度與執行效率都不高 目前我寫的3C函數是采用Timer來刷兵
想知道Timer的用法麽 先把基礎打好吧~