|
初步判断,是怪物堆积引起的。
一次产生60个怪,容易引起堆积而失去原来的控制。
用类似我的T重新修改,一次不要产生太多怪。贵精不在多。
可以在LOOP后面加WAIT 1 秒。
另外,
1)你的漂浮文字中有WAIT 10 秒后才销毁漂浮文字。这需要用局部变量处理。
2)对于Center of 地区 000 <情报>等重复调用的点,可以先用全局变量先储存,以免每次都产生临时点而有没法销毁,导致越玩越卡。
3)对于产生的3×2路兵(敌我双方),可以用单位组数组储存,单位死亡后从单位组中移除。
以下是例子
--术语:GUI T/GUI TRIGGER - 即是触发器编辑器中产生的直观触发器。
--关于局部变量和全局变量,请参看JASS或其他语言的有关教程,如:《WE & Jass Online 大全》http://www.ourga.com/forum/viewt ... &extra=page%3D1。
在下面的例子中,使用了以下预先定义的全局变量(在Ctrl + B中增加)- regioncenter-----点-----------数组 数组大小任意 用于储存经常调用的点,避免产生不可销毁的临时点
- myUnitGroup---单位组-----数组 数组大小任意 对所出的兵归类,避免在很大的区域使用Pick & Do
- armType----------单位类型--数组 数组大小任意 出兵类型
- FloatTextTmp---漂浮文字--只是为了方便在“Set FloatTextTmp = (Last created floating text)”中引用才定义的。注意只是为了在GUI TRIGGER中方便引用。
初始化经常使用的点,避免调用(Center of xxxx)的时候不断产生临时点
(这些点通常会在不同的TRIGGER中经常调用,应该预先作一次储存,供以后的TRIGGER调用。注意数组序号的归类,比如regioncenter[1] 至regioncenter[8]是地图下方的点,regioncenter[10]至regioncenter[16]是地图上方的点。序号归类是为了方便调用,序号太混乱了会弄晕你的。 )
[trigger]Location Init
事件
Map initialization
环境
动作
-------- 初始化经常使用的点,避免调用(Center of xxxx)的时候不断产生临时点 --------
Set regioncenter[1] = (Center of armBron <情报>)
Set regioncenter[2] = (Center of 1 <情报>)
Set regioncenter[10] = (Center of Wang2 <情报>)[/trigger]
出兵举例:
[trigger]bron
事件
时间 - Every 120.00 seconds of game time
环境
动作
For each (Integer A) from 1 to 30, do (Actions)
Loop - 动作
Wait 0.50 seconds
单位 - Create 1 armType[Lv] for 玩家 12 (棕色) at regioncenter[1] facing 默认的建筑朝向 degrees
单位组 - Add (Last created unit) to myUnitGroup[1]
单位 - Order (Last created unit) to 攻击-移动到 regioncenter[2]
-------- 如果出现兵徘徊的情况,加下面的 --------
单位组 - Pick every unit in myUnitGroup[1] and do (Actions)
Loop - 动作
单位 - Order (Picked unit) to 攻击-移动到 regioncenter[2]
Set Lv = (Lv + 1)[/trigger]
当单位死亡的时候,从单位组(myUnitGroup[1])里清除单位
[trigger]Units1Died
事件
单位 - A unit 死亡
环境
((Triggering unit) is in myUnitGroup[1]) 等于 TRUE
动作
-------- 当单位死亡的时候,从单位组(myUnitGroup[1])里清除单位 --------
-------- 避免在很大的区域使用Pick Unit Do Something --------
单位组 - Remove (Triggering unit) from myUnitGroup[1][/trigger]
正确使用漂浮文字(版本1.18以前,需要考虑有可能同时创建漂浮文字的情况和避免内存泄漏,关于更深入的讨论,请看楼下):
(因为使用漂浮文字都需要使用wait,假设在这等待的时间内又创建一个漂浮文字,应该怎么样清除第一次创建的漂浮文字呢?显然用“漂浮文字 - Destroy (Last created floating text)”是不能正确清除第一次创建的漂浮文字的。因为等待N秒后,这个最后创建的漂浮文字(Last created floating text)已不是第一次创建的漂浮文字了,而是指最近创建的!这里,必须要使用局部变量才可实现清除并发创建的漂浮文字。)
[trigger]WangJinWei
事件
单位 - 伪军指挥部 0061 <情报> 死亡
环境
动作
-------- FloatTextTmp在变量表中已经定义(只是为了方便在“Set FloatTextTmp = (Last created floating text)”中引用才定义的,在这例子中实际上并未使用全局变量FloatTextTmp) --------
-------- 下面的局部变量声明必须在TRIGGER的头部 --------
Custom script: local texttag udg_FloatTextTmp
单位 - Unhide 汪精卫 0047 <情报>
单位 - Move 汪精卫 0047 <情报> instantly to regioncenter[10]
镜头 - wangjinwei <情报> for 玩家 1 (红色) over 0.00 seconds
动画 - Play 汪精卫 0047 <情报>s stand animation
漂浮文字 - Create floating text that reads 杀死汉奸汪精... at regioncenter[10] with Z offset 10.00, using font size 30.00, color (0.00%, 0.00%, 0.00%), and 0.00% transparency
-------- 实际上,在“Set FloatTextTmp = (Last created floating text)”中使用的已经是声明过的局部变量udg_FloatTextTmp --------
Set FloatTextTmp = (Last created floating text)
Wait 5.00 seconds
单位 - Order 汪精卫 0047 <情报> to 攻击-移动到 regioncenter[10]
-------- 先销毁(但依然没清空udg_FloatTextTmp所占用的内存) --------
漂浮文字 - Destroy FloatTextTmp
-------- 下句是彻底清理内存,防止内存泄漏 --------
Custom script: set udg_FloatTextTmp = null[/trigger]
为了更好的说明上面漂浮文字的使用,我把上面的GUI TIRGGER转变为JASS代码。请注意以下的红字udg_FloatTextTmp。
在可执行的第一句 local texttag udg_FloatTextTmp 中,已经声明本函数内使用局部变量udg_FloatTextTmp(这局部变量只局限于此TRIGGER内专用,其他TRIGGER不可访问和改变。就是说,在文字显示期间-call TriggerSleepAction( 5.00 ),即使其他TRIGGER有同名的局部或全局变量udg_FloatTextTmp在此等待期间发生改变或者再次触发本TRIGGER,也不会影响此TRIGGER实例中的udg_FloatTextTmp所指的漂浮文字。这TRIGGER里的局部变量udg_FloatTextTmp为此TRIGGER实例专用。注:每运行一次TRIGGER我们称之为一个TRIGGER实例,不同时间先后运行的同一个TRIGGER程序也会产生完全不同的TRIGGER实例。局部变量的意义在于:一个人不可能再次趟过同一条河)。
如果没有此句声明(local texttag udg_FloatTextTmp),将会使用全局变量udg_FloatTextTmp(即是其他有可能并发的TRIGGER可以访问并改变此变量)。
注意,所有的变量声明都应该在函数头部!并注意区分大小写!
function Trig_WangJinWei_Actions takes nothing returns nothing
// FloatTextTmp在变量表中已经定义(只是为了方便在“Set FloatTextTmp = (Last created floating text)”中引用才定义的,在这例子中实际上并未使用全局变量FloatTextTmp)
// 下面的局部变量声明必须在TRIGGER的头部
local texttag udg_FloatTextTmp
call ShowUnitShow( gg_unit_N002_0047 )
call SetUnitPositionLoc( gg_unit_N002_0047, udg_regioncenter[10] )
call CameraSetupApplyForPlayer( true, gg_cam_wangjinwei, Player(0), 0 )
call SetUnitAnimation( gg_unit_N002_0047, "stand" )
call CreateTextTagLocBJ( "TRIGSTR_140", udg_regioncenter[10], 10.00, 30.00, 0.00, 0.00, 0.00, 0 )
// 实际上,在“Set FloatTextTmp = (Last created floating text)”中使用的已经是声明过的局部变量udg_FloatTextTmp
set udg_FloatTextTmp = GetLastCreatedTextTag()
call TriggerSleepAction( 5.00 )
call IssuePointOrderLocBJ( gg_unit_N002_0047, "attack", udg_regioncenter[10] )
// 先销毁(但依然没清空udg_FloatTextTmp所占用的内存)
call DestroyTextTagBJ( udg_FloatTextTmp )
// 下句是彻底清理内存,防止内存泄漏
set udg_FloatTextTmp = null
endfunction
为什么要用udg_?因为在WE触发器编辑器的变量表中定义的变量会最终转化为udg_开头的实际JASS变量名。
比如:变量表中的A, 会转换为JASS代码的udg_A
---------变量表中的a, 会转换为JASS代码的udg_a
---------变量表中的FloatTextTmp, 会转换为JASS代码的udg_FloatTextTmp
在此例先在变量表中定义FloatTextTmp,是引用的技巧,方便直接在WE触发器编辑中直接引用。实际上是为了方便此两句的引用:
Set FloatTextTmp = (Last created floating text)
......
漂浮文字 - Destroy FloatTextTmp
它转化成JASS代码便是:
set udg_FloatTextTmp = GetLastCreatedTextTag()
......
call DestroyTextTagBJ( udg_FloatTextTmp ) |
|