|
我做了一个针对loop/ FirstOfGroup() / GroupRemoveUnit() / endloop的测试,目的是了解每做一次这样的循环,一个组中单位的排列变化。
准备工作:
首先我们需要一些全局变量,还需要一个能返回某单位的内存位置的函数:- // testgroup 是用于测试的组。
- globals
- public group testgroup = CreateGroup()
- public integer num = 6
- endglobals
- // u2i 函数,返回某单位的内存整数地址。
- function u2i takes unit u returns integer
- return u
- return 0
- endfunction
复制代码
然后我做了几个自定义函数,分别用于在游戏中显示,添加,或删除组中的单位:
- function Showgroupunit takes nothing returns nothing
- local string message
- local group g = CreateGroup()
- local unit u
- call GroupAddGroup( testgroup, g )
- loop
- set u = FirstOfGroup( g )
- exitwhen u == null
- set message = I2S(u2i(u))
- call BJDebugMsg( message )
- call TriggerSleepAction( 1.0 )
- call GroupRemoveUnit( g, u )
- endloop
- call DestroyGroup( g )
- set g = null
- set message = null
- endfunction
-
- function Addunit takes nothing returns nothing
- local unit u = CreateUnit( Player(0), 'hpea', GetStartLocationX( GetPlayerStartLocation( Player(0))), GetStartLocationY( GetPlayerStartLocation( Player(0))), 0.0 )
- call GroupAddUnit( testgroup, u )
- set u = null
- endfunction
-
- function Removegroupunit takes nothing returns nothing
- local group g = CreateGroup()
- local unit u
- call GroupAddGroup( testgroup, g )
- set u = FirstOfGroup( g )
- call GroupRemoveUnit( g, u )
- call DestroyGroup( g )
- set u = null
- set g = null
- endfunction
复制代码
接着我添加了以下触发,用以在游戏中通过输入聊天信息来触发以上的函数:
- Show
- Events
- Player - Player 1 (Red) types a chat message containing start as An exact match
- Conditions
- Actions
- Custom script: call Showgroupunit()
- Add
- Events
- Player - Player 1 (Red) types a chat message containing add as An exact match
- Conditions
- Actions
- Custom script: call Addunit()
- Remove
- Events
- Player - Player 1 (Red) types a chat message containing remove as An exact match
- Conditions
- Actions
- Custom script: call Removegroupunit()
复制代码
测试开始了,在游戏中,我首先输入6次 ”add”,然后输入”start”,就看到以下信息:
1048680
1048681
1048682
1048683
1048684
1048685
分别是组内6个单位在内存中的整数地址,然后无论我输入多少次”start”,这六个数字都按照同样的排列方式显示。
紧接着我又做了另一个测试,分别加上一个自定义函数,并且在地图初始化部分加载之:
- function Setuptestgroup takes nothing returns nothing
- local unit u
- local integer f = 0
- loop
- exitwhen f > num
- set u = CreateUnit( Player(0), 'hpea', GetStartLocationX( GetPlayerStartLocation( Player(0))), GetStartLocationY( GetPlayerStartLocation( Player(0))), 0.0 )
- call GroupAddUnit( testgroup, u )
- set u = null
- set f = f + 1
- endloop
- set u = null
- endfunction
复制代码 触发:- Melee Initialization
- Events
- Map initialization
- Conditions
- Actions
- Visibility - Create an initially Enabled visibility modifier for Player 1 (Red) emitting Visibility across (Playable map area)
- Custom script: call Setuptestgroup()
复制代码
然后我用类似的方法进行测试,先键入两次”add”,然后”start”:
1048687 // 第一个新加入的单位
1048679
1048680
1048681
1048682
1048683
1048684
1048688 // 第二个新加入的单位
我们可以看到,第一个加入的单位被放在了最前面,而从第二个开始,就会被放在最后。之后无论我再输入多少次”add”,新的单位都排在后面。
结论:
对于一个游戏中相同的组,每次当我们用loop/ FirstOfGroup() /call GroupRemoveUnit(), endloop来选取组中每个单位的时候,每次选取的顺序都会是相同的。
但是如果是游戏初始化创建的组,我们在游戏中再加入单位,第一个加入的单位会排在首位,其余的则放在最后。 |
|