(原)War3 脚本分析4-触发器

时间:2024-03-17 16:55:55

  上篇随笔中我们分析了main函数的脚本初始化流程,触发器部分作为整个脚本设计的精华将在本篇做一个粗略的分析。

  InitCustomTriggers

 1 //===========================================================================
 2 // Trigger: Gold
 3 //===========================================================================
 4 function Trig_Gold_Func001002 takes nothing returns nothing
 5     call SetPlayerStateBJ( GetEnumPlayer(), PLAYER_STATE_RESOURCE_GOLD, 10000 )
 6 endfunction
 7 
 8 function Trig_Gold_Func002002 takes nothing returns nothing
 9     call SetPlayerStateBJ( GetEnumPlayer(), PLAYER_STATE_RESOURCE_LUMBER, 10000 )
10 endfunction
11 
12 function Trig_Gold_Actions takes nothing returns nothing
13     call ForForce( GetPlayersAllies(Player(0)), function Trig_Gold_Func001002 )
14     call ForForce( GetPlayersAllies(Player(0)), function Trig_Gold_Func002002 )
15 endfunction
16 
17 //===========================================================================
18 function InitTrig_Gold takes nothing returns nothing
19     set gg_trg_Gold = CreateTrigger(  )
20     call TriggerAddAction( gg_trg_Gold, function Trig_Gold_Actions )
21 endfunction
22 
23 //===========================================================================
24 function InitCustomTriggers takes nothing returns nothing
25     call InitTrig_Gold(  )
26     .
27     .
28     .
29 endfunction   
30 //===========================================================================
31 function RunInitializationTriggers takes nothing returns nothing
32     call ConditionalTriggerExecute( gg_trg_Gold )
33     .
34     .
35     .
36 endfunction

 

上面我们截取了一个在场景初始化时给予玩家10000金币和10000木材的触发器作为介绍案例。

1、首先第一步我们需要有两个方法:

一个用来为指定玩家增加金币  - Trig_Gold_Func001002

另外一个用来给指定玩家增加木材 - Trig_Gold_Func002002

2、接下来由于给玩家增加金币和木材的操作需要在一个行为中完成,我们需要一个Action方法将具有该类行为的玩家进行统一设置 - Trig_Gold_Actions

(注:由于本Action操作于场景初始化的时候进行所以这里并没有涉及Condtion方法的实现)

3、触发器初始化函数的命名规范为:InitTrig_xxxx,这里我们实现了一个用于初始化触发器的InitTrig_Gold方法。在该方法中,我们实现了一个触发器实例,并把刚才实现的触发器行为绑定到该触发器。至此我们已经成功创建了一个可以为特定属性玩家增加金币和木材的触发器。

4、触发器我们已经创建好了,但要让其生效,在场景初始化的时候我们需要做两件事情:

  1)在InitCustomTriggers函数中对执行我们刚才实现的触发器初始化流程。

  2)在RunInitializationTriggers(执行触发器事件为"Map initialization"的触发器)中执行该触发器。