魔兽地图编辑器触发器触发器(占领) 玩家1破坏某建筑后自己建筑,玩家2破坏玩家1建筑生成自己建筑 请问怎么弄?谢谢

一个非常简单而又容易被人忽略的排泄(马甲排泄)
点击注册会员,更多精品好玩的地图等你来下载!
才可以下载或查看,没有帐号?
一些人喜欢在触发最后选择删除
不过有个非常简单的方法
用来排泄马甲单位
1.首先将马甲生命值弄成持续存在的时间
例如:持续2秒。& &最大生命值:2
2.将生命回复速度改成-x(自己随意)
例如:最大生命值:2& &生命回复速度:-1(shift+双击)
接下来触发内容
|任意单位死亡
|死亡单位 的 蝗虫等级 等于 1(马甲的必备技能)
|删除 触发单位
sofa永远被我卖掉
创建出东西就会占空间。
创建出的东西没用了还占着地方就变成了泄漏。
排泄就是随时将用不到的东西清理掉,以保证游戏畅通。
& && &&&时间 - 每 1.00 秒触发事件
& && &&&//shuabingqu=刷兵区
& && &&&单位 - 创建 1 个 步兵 给 玩家12(棕色) 在 (shuabingqu &预设& 的中心点) ,面向角度为 默认建筑朝向 度
这是个普通的刷兵触发。。。但。。。
& && &&&单位 - 创建 1 个 步兵 给 玩家12(棕色) 在 (shuabingqu &预设& 的中心点) ,面向角度为 默认建筑朝向 度
这个动作是创建单位在点,想创建单位必需有一个点以供创建,而不能直接给系统(shuabingqu &预设& 的中心),所以系统会自动创建一个点以供其在点刷兵,这条动作的基本流程可以这么理解:
& && &&&点 - 创建一个点在(shuabingqu &预设& 的中心)
& && &&&单位 - 创建 1 个 步兵 给 玩家12(棕色) 在 (最后创建的点) ,面向角度为 默认建筑朝向 度
当然这个并不精确,不过现在无需在意了。
步兵出来了,但系统自己创建的点却无法捕捉,一经创建就只能留在内存里占用空间。一张图里单位多了会卡,即是内存占用过多,点也是一样,相对于单位,点的泄漏较小但更为隐蔽。而每次有新的东西建立,内存就需要分个空间来储存。不止是点,单位组,特效等很多东西都会在游戏中不知不觉的堆积。而把它们置之不理将会霸占空间,使电脑寻址困难,游戏速度越来越慢(卡),影响玩家游戏进程,而且游戏结束后还需要占用玩家大量时间由电脑自行排除泄漏。
一般来说,动作下方的注释里对动作是否可能泄漏有提醒:会创建XXX,如果不确定是否泄漏可以参照查看下。
函数中每个矩形区域都会创建一点`
点是最大的泄漏源。
某简略刷兵进攻触发如下:
& && &&&时间 - 每 2.00 秒触发事件
& && &&&单位 - 创建 1 个 步兵 给 玩家12(棕色) 在 (shuabingqu &预设& 的中心点) ,面向角度为 默认建筑朝向 度
& && &&&单位 - 对 (最后创建的单位 [R]) 发布 攻击移动 命令到目标点: (城堡 0000 &预设& 的位置)
& && &&&时间 - 每 5.00 秒触发事件
& && &&&单位 - 创建 1 个 牧师 给 玩家12(棕色) 在 (shuabingqu &预设& 的中心点) ,面向角度为 默认建筑朝向 度
& && &&&单位 - 对 (最后创建的单位 [R]) 发布 攻击移动 命令到目标点: (城堡 0000 &预设& 的位置)
& && &&&单位 - 创建 1 个 矮人火枪手 给 玩家12(棕色) 在 (shuabingqu &预设& 的中心点) ,面向角度为 默认建筑朝向 度
& && &&&单位 - 对 (最后创建的单位 [R]) 发布 攻击移动 命令到目标点: (城堡 0000 &预设& 的位置)
& && &&&时间 - 每 5.00 秒触发事件
& && &&&单位组 - 选取 (属于 玩家12(棕色) 的所有单位) 内所有单位做动作
& && && && &Loop - 动作
& && && && && & 单位 - 对 (选取单位) 发布 攻击移动 命令到目标点: (城堡 0000 &预设& 的位置)
//本触发是为防止怪物进攻途中受干扰而呆立或往回跑故每5秒重复命令。
计算一下点的个数:
& && &&&单位 - 创建 1 个 xx 给 玩家12(棕色) 在 (shuabingqu &预设& 的中心点) ,面向角度为 默认建筑朝向 度
这里创建了一个点在(shuabingqu &预设& 的中心点)
& && &&&单位 - 对 (最后创建的单位 [R]) 发布 攻击移动 命令到目标点: (城堡 0000 &预设& 的位置)
创建了一个点在 (城堡 0000 &预设& 的位置)
& && &&&单位组 - 选取 (属于 玩家12(棕色) 的所有单位) 内所有单位做动作
& && && && &Loop - 动作
& && && && && & 单位 - 对 (选取单位) 发布 攻击移动 命令到目标点: (城堡 0000 &预设& 的位置)
因为是选取玩家12所有单位作动作,每一次都会泄漏相当于玩家12所有单位数量的点~
照上面刷兵,如果玩家12的单位始终在15个,一个小时差不多就要泄漏800=15280个点
由此可见排点的重要。
(在创建单位动作中点泄漏和单位个数无关,创建1个步兵在xx和创建5个步兵在xx都是泄一个点)
排泄的方法是,设置点变量=要用的点,动作中引用变量,用完了再把变量记录的点删除:
& && &&&单位 - 单位进入 tiaozhanqishi &预设&
& && &&&((触发单位) 是 英雄) 等于 TRUE
& && &&&设置 dian1 = (tiaozhanqishi &预设& 的中心点)
& && &&&单位 - 创建 1 个 骑士 给 中立敌对 在 dian1 ,面向角度为 默认建筑朝向 度
& && &&&物品 - 创建 经验之书 在 dian1
& && &&&单位 - 对 (触发单位) 发布 攻击移动 命令到目标点: dian1
& && &&&//等等一堆动作
& && &&&点 - 清除 dian1 //这就是清除刚创建的点啦
一个练功房触发的例子:
错误触发1:
& && &&&单位 - 任意单位 获得物品
& && &&&((被操作物品) 的类型) 等于 进入练功房
& && &&&单位 - 立即移动 (触发单位) 到 (liangongfang &预设& 的中心点)
这是完全不管泄漏的写法。
错误触发2:
变量:dian1:点变量
& && &&&单位 - 任意单位 获得物品
& && &&&((被操作物品) 的类型) 等于 进入练功房
& && &&&设置 dian1 = (liangongfang &预设& 的中心点)
& && &&&单位 - 立即移动 (触发单位) 到 (liangongfang &预设& 的中心点)
& && &&&点 - 清除 dian1
动作中没有引用变量,还是创建了点,这里的变量完全无用
错误触发3:
& && &&&单位 - 任意单位 获得物品
& && &&&((被操作物品) 的类型) 等于 进入练功房
& && &&&单位 - 立即移动 (触发单位) 到 (liangongfang &预设& 的中心点)
& && &&&点 - 清除 (liangongfang &预设& 的中心点)
我们可以这么理解:
点 - 创建一个点在(liangongfang &预设& 的中心点)
单位 - 立即移动 (触发单位) 到 (最后创建的点)
点 - 创建一个点在(liangongfang &预设& 的中心点)
点 - 清除 (最后创建的点)
创建点后立刻清除,点 - 清除 (liangongfang &预设& 的中心点) 完全是一条废动作。一开始创建的点与后面的点只是都在(liangongfang &预设& 的中心点)的重叠点,却是两个分别的点,不能混为一谈。
变量:dian1:点变量
& && &&&单位 - 任意单位 获得物品
& && &&&((被操作物品) 的类型) 等于 进入练功房
& && &&&设置 dian1 = (liangongfang &预设& 的中心点)
& && &&&单位 - 立即移动 (触发单位) 到 dian1
& && &&&点 - 清除 dian1
创建的点通过变量引用,而后删除,正确
上面第一个刷兵触发,将它简单处理下。。。
变量:dian1:点变量
& && &&&dian2:点变量
& && &&&时间 - 每 2.00 秒触发事件
& && &&&设置 dian1 = (shuabingqu &预设& 的中心点)
& && &&&设置 dian2 = (城堡 0000 &预设& 的位置)
& && &&&单位 - 创建 1 个 步兵 给 玩家12(棕色) 在 dian1 ,面向角度为 默认建筑朝向 度
& && &&&单位 - 对 最后创建的单位 [R] 发布 攻击移动 命令到目标点: dian2
& && &&&点 - 清除 dian1
& && &&&点 - 清除 dian2
用变量记录创建点,刷兵动作使用刚才记录的点变量,完毕后再用变量把创建的点删除,全程没有东西创建出来占内存,就达到了排泄的效果。
简化一点可以成为下面触发:
变量:dian1:点变量
& && &&&时间 - 每 2.00 秒触发事件
& && &&&设置 dian1 = (shuabingqu &预设& 的中心点)
& && &&&单位 - 创建 1 个 步兵 给 玩家12(棕色) 在 dian1 ,面向角度为 默认建筑朝向 度
& && &&&点 - 清除 dian1
& && &&&设置 dian1 = (城堡 0000 &预设& 的位置)
& && &&&单位 - 对 最后创建的单位 [R] 发布 攻击移动 命令到目标点: dian1
& && &&&点 - 清除 dian1
这样前后都只是一个变量,在操作上较为简洁。要记住的是每次设置变量后都要像上面的触发删除一次,而不能:
变量:dian1:点变量
& && &&&时间 - 每 2.00 秒触发事件
& && &&&设置 dian1 = (shuabingqu &预设& 的中心点)
& && &&&单位 - 创建 1 个 步兵 给 玩家12(棕色) 在 dian1 ,面向角度为 默认建筑朝向 度
& && &&&设置 dian1 = (城堡 0000 &预设& 的位置)
& && &&&单位 - 对 最后创建的单位 [R] 发布 攻击移动 命令到目标点: dian1
& && &&&点 - 清除 dian1
这样删除的只是最后创建的在(城堡 0000 &预设& 的位置)的点。
像以上的触发均用到(城堡 0000 &预设& 的位置)和(shuabingqu &预设& 的中心点)2个点,我们可以预先把可以多次利用的点用变量记录下来,然后直接套用以减少排泄的反复操作。
那么,上面的刷兵可以这样写:
变量:gudingdian:点变量数组
(gudingdian=固定点 )
& && &&&地图初始化
& && &&&设置 gudingdian[0] = (shuabingqu &预设& 的中心点)
& && &&&设置 gudingdian[1] = (城堡 0000 &预设& 的位置)
& && &&&。。。。。。
& && &&&时间 - 每 2.00 秒触发事件
& && &&&单位 - 创建 1 个 步兵 给 玩家12(棕色) 在 gudingdian[0] ,面向角度为 默认建筑朝向 度
& && &&&单位 - 对 最后创建的单位 [R] 发布 攻击移动 命令到目标点: gudingdian[1]
& && &&&时间 - 每 5.00 秒触发事件
& && &&&单位 - 创建 1 个 牧师 给 玩家12(棕色) 在 gudingdian[0] ,面向角度为 默认建筑朝向 度
& && &&&单位 - 对 最后创建的单位 [R] 发布 攻击移动 命令到目标点: gudingdian[1]
& && &&&单位 - 创建 1 个 矮人火枪手 给 玩家12(棕色) 在 gudingdian[0] ,面向角度为 默认建筑朝向 度
& && &&&单位 - 对 最后创建的单位 [R] 发布 攻击移动 命令到目标点: gudingdian[1]
& && &&&时间 - 每 5.00 秒触发事件
& && &&&单位组 - 选取 (属于 玩家12(棕色) 的所有单位) 内所有单位做动作
& && && && &Loop - 动作
& && && && && & 单位 - 对 (选取单位) 发布 攻击移动 命令到目标点: gudingdian[1]
这才是正常的写法。直接读取变量点是不会新创建点-即泄漏的,且避免了反复更改的麻烦。
gudingdian[0]和gudingdian[1]在游戏中就不要再赋值了。
当然,单独不确定的点还是必需使用一开始的方法。
如怪物掉宝:
设置掉宝的基本方法是这样:
& && &&&单位 - 任意单位 死亡
& && &&&((触发单位) 的所有者) 等于 中立敌对
& && &&&(随机整数,最小值: 1 最大值: 100) 小于或等于 20
& && &&&物品 - 创建 经验之书 在 ((触发单位) 的位置)
每掉一个物品就会泄漏一个点。
参照最初的方法,我们得到排泄版:
变量:dian1:点变量
& && &&&单位 - 任意单位 死亡
& && &&&((触发单位) 的所有者) 等于 中立敌对
& && &&&(随机整数,最小值: 1 最大值: 100) 小于或等于 20
& && &&&设置 dian1 = ((触发单位) 的位置)
& && &&&物品 - 创建 经验之书 在 dian1
& && &&&点 - 清除 dian1
和开始一样,这里也是用变量记录点而后清除。这种变量的操作在一瞬间完成,不会持续影响变量的值,所以你可以除初始记录的点外都用一、二个变量排泄。
[掉宝有时候也可以使用:创建物品给英雄(死掉的敌人单位)动作,这当然也可以给单位,但由于敌人是死亡的,不管单位或英雄都无法得到物品,物品自然会掉在地上。]
随机点也是一样操作~
变量:dian1:点变量
& && &&&时间 - 每 5.00 秒触发事件
& && &&&设置 dian1 = ((可用地图区域) 内的随机点)
& && &&&单位 - 创建 1 个 步兵 给 玩家1(红色) 在 dian1 ,面向角度为 默认建筑朝向 度
& && &&&点 - 清除 dian1
而如果是极坐标位移点比较麻烦~
& && &&&单位 - 任意单位 发动技能效果
& && &&&(施放技能) 等于 腐臭蜂群
& && &&&单位 - 立即移动 (触发单位) 到 (从 ((触发单位) 的位置) 开始,距离 256.00 ,方向为 ((触发单位) 的面向角度) 度的位移处)
这样一个触发,应该怎样修改?
错误触发1:
dian1:点变量
& && &&&单位 - 任意单位 发动技能效果
& && &&&(施放技能) 等于 腐臭蜂群
& && &&&设置 dian1 = ((触发单位) 的位置)
& && &&&单位 - 立即移动 (触发单位) 到 (从 dian1 开始,距离 256.00 ,方向为 ((触发单位) 的面向角度) 度的位移处)
& && &&&点 - 清除 dian1
错误触发2:
dian1:点变量
& && &&&单位 - 任意单位 发动技能效果
& && &&&(施放技能) 等于 腐臭蜂群
& && &&&设置 dian1 = (从 ((触发单位) 的位置) 开始,距离 256.00 ,方向为 ((触发单位) 的面向角度) 度的位移处)
& && &&&单位 - 立即移动 (触发单位) 到 dian1
& && &&&点 - 清除 dian1
以上两种方法已经对排泄有了基本的了解,但还有一点忽漏。。。
(从 ((触发单位) 的位置) 开始,距离 256.00 ,方向为 ((触发单位) 的面向角度) 度的位移处)
这条动作实际创建了2个点:
(触发单位) 的位置) 创建了点
(从 ((触发单位) 的位置) 开始,距离 256.00 ,方向为 ((触发单位) 的面向角度) 度的位移处)又创建了点
看得出,两种方法都有一个点没有清除。
正确写法是:
dian1:点变量
dian2:点变量
& && &&&单位 - 任意单位 发动技能效果
& && &&&(施放技能) 等于 腐臭蜂群
& && &&&设置 dian1 = ((触发单位) 的位置)
& && &&&设置 dian2 = (从 dian1 开始,距离 256.00 ,方向为 ((触发单位) 的面向角度) 度的位移处)
& && &&&单位 - 立即移动 (触发单位) 到 dian2
& && &&&点 - 清除 dian1
& && &&&点 - 清除 dian2
照之前的方法,试着修改下面的冲锋技能:
& && &&&单位 - 任意单位 发动技能效果
& && &&&(施放技能) 等于 冲锋
& && &&&For循环整数A从 1 到 30, 做动作
& && && && &Loop - 动作
& && && && && & 单位 - 立即移动 (触发单位) 到 (从 ((触发单位) 的位置) 开始,距离 20.00 ,方向为 ((触发单位) 的面向角度) 度的位移处)
& && && && && & 等待 0.10 秒
效果是,使用后用3秒时间向前冲600范围。
这个临时凑的技能很烂~表bs。。。不理效率冲突误差什么,单从排点看:
dian1:点变量
dian2:点变量
& && &&&单位 - 任意单位 发动技能效果
& && &&&(施放技能) 等于 腐臭蜂群
& && &&&For循环整数A从 1 到 30, 做动作
& && && && &Loop - 动作
& && && && && & 设置 dian1 = ((触发单位) 的位置)
& && && && && & 设置 dian2 = (从 dian1 开始,距离 256.00 ,方向为 ((触发单位) 的面向角度) 度的位移处)
& && && && && & 单位 - 立即移动 (触发单位) 到 dian2
& && && && && & 等待 0.10 秒
& && &&&点 - 清除 dian1
& && &&&点 - 清除 dian2
是不行的,循环作动作是将一段相若动作反复运行,循环整数A1-30重复了30次,每次创建了2个点,即共创建了60个点,而这里仅清除了最后2个点。清除点的动作应在每次设置后立刻清除,所以应该这样写:
dian1:点变量
dian2:点变量
& && &&&单位 - 任意单位 发动技能效果
& && &&&(施放技能) 等于 腐臭蜂群
& && &&&For循环整数A从 1 到 30, 做动作
& && && && &Loop - 动作
& && && && && & 设置 dian1 = ((触发单位) 的位置)
& && && && && & 设置 dian2 = (从 dian1 开始,距离 256.00 ,方向为 ((触发单位) 的面向角度) 度的位移处)
& && && && && & 单位 - 立即移动 (触发单位) 到 dian2
& && && && && & 点 - 清除 dian1
& && && && && & 点 - 清除 dian2
& && && && && & //要在等待前清哦
& && && && && & 等待 0.10 秒
当然,对于循环中没有设置点动作的触发自然不要在循环内清除。
[循环整数A(B及其它自定义整数也一样)从a到b作动作=把下面的动作循环(b-a+1)次,第一次循环时循环整数A为a,第二次为a+1...依此类推,最后一次为b
选取单位(玩家等类同)作动作=把下面的动作循环(选取的单位个数)次,选取单位分别为第一、二、三个单位...依此类推]
选取XX内单位作动作一类的语句也会创建一个单位组,即引起泄漏。
单位组 - 选取 ((可用地图区域) 内的所有单位) 内所有单位做动作 - Loop - 动作-这个动作是这样:
新建单位组=((可用地图区域) 内的所有单位)
单位组 - 选取(最后的单位组)内所有单位做动作
和点的泄漏极其相似。。。其实泄漏都差不多的- -
我们也同样可以以点的方法处理单位组:
定义一个单位组变量如名字zu,然后这么写:
设置zu=XX内单位
选取zu内所有单位作动作-
。。。动作
或者类似这样:
设置zu=XX内单位
if zu内所有单位数量!=0
。。。动作
如之前的触发:
zu:单位组变量
& && &&&时间 - 每 5.00 秒触发事件
& && &&&设置 zu = ((可用地图区域) 内属于 玩家12(棕色) 的所有单位)
& && &&&单位组 - 选取 zu 内所有单位做动作
& && && && &Loop - 动作
& && && && && & 单位 - 对 (选取单位) 发布 攻击移动 命令到目标点: gudingdian[2]
& && &&&单位组 - 删除 zu
群体风暴之锤的例子:
& && &&&单位 - 任意单位 发动技能效果
& && &&&(施放技能) 等于 群体风暴之锤
& && &&&单位组 - 选取 (半径为 300.00 圆心为 ((技能施放目标) 的位置) 且满足 (((技能施放目标) 不等于 (匹配单位)) and ((((匹配单位) 是 (触发玩家) 的敌对单位) 等于 TRUE) and (((匹配单位) 是 死亡的 [R]) 等于 FALSE))) 的所有单位) 内所有单位做动作
& && && && &Loop - 动作
& && && && && & //-------- 风暴之锤单独的马甲,拥有技能,负生命 --------
& && && && && & 单位 - 创建 1 个 步兵 给 (触发玩家) 在 ((触发单位) 的位置) ,面向角度为 默认建筑朝向 度
& && && && && & 单位 - 设置 最后创建的单位 [R] 的 风暴之锤 等级为 ((触发单位) 的 群体风暴之锤 技能等级)
& && && && && & 单位 - 对 最后创建的单位 [R] 发布 人族山丘之王 - 风暴之锤 命令到目标: (选取单位)
我们先来排点:
dian1:点变量
dian2:点变量
& && &&&单位 - 任意单位 发动技能效果
& && &&&(施放技能) 等于 群体风暴之锤
& && &&&设置 dian1 = ((触发单位) 的位置)
& && &&&设置 dian2 = ((技能施放目标) 的位置)
& && &&&单位组 - 选取 (半径为 300.00 圆心为 dian2 且满足 (((技能施放目标) 不等于 (匹配单位)) and ((((匹配单位) 是 (触发玩家) 的敌对单位) 等于 TRUE) and (((匹配单位) 是 死亡的 [R]) 等于 FALSE))) 的所有单位) 内所有单位做动作
& && && && &Loop - 动作
& && && && && & -------- 风暴之锤单独的马甲,拥有技能,负生命 --------
& && && && && & 单位 - 创建 1 个 风暴之锤马甲 给 (触发玩家) 在 dian1 ,面向角度为 默认建筑朝向 度
& && && && && & 单位 - 设置 最后创建的单位 [R] 的 风暴之锤 等级为 ((触发单位) 的 群体风暴之锤 技能等级)
& && && && && & 单位 - 对 最后创建的单位 [R] 发布 人族山丘之王 - 风暴之锤 命令到目标: (选取单位)
& && &&&点 - 清除 dian1
& && &&&点 - 清除 dian2
在选取中用到的点也是要排泄的哦~
由于所用到的点只固定在((触发单位) 的位置)和((技能施放目标) 的位置)所以我们并不需要在循环内(选取单位组动作内)一次次设置清除,而只需在开始结束时安排。
重点在单位组的排泄:
zu:单位组变量
dian1:点变量
dian2:点变量
& && &&&单位 - 任意单位 发动技能效果
& && &&&(施放技能) 等于 群体风暴之锤
& && &&&设置 dian1 = ((触发单位) 的位置)
& && &&&设置 dian2 = ((技能施放目标) 的位置)
& && &&&设置 zu = (半径为 300.00 圆心为 dian2 且满足 (((技能施放目标) 不等于 (匹配单位)) and ((((匹配单位) 是 (触发玩家) 的敌对单位) 等于 TRUE) and (((匹配单位) 是 死亡的 [R]) 等于 FALSE))) 的所有单位)
& && &&&单位组 - 选取 zu 内所有单位做动作
& && && && &Loop - 动作
& && && && && & -------- 风暴之锤单独的马甲,拥有技能,负生命 --------
& && && && && & 单位 - 创建 1 个 风暴之锤马甲 给 (触发玩家) 在 dian1 ,面向角度为 默认建筑朝向 度
& && && && && & 单位 - 设置 最后创建的单位 [R] 的 风暴之锤 等级为 ((触发单位) 的 群体风暴之锤 技能等级)
& && && && && & 单位 - 对 最后创建的单位 [R] 发布 人族山丘之王 - 风暴之锤 命令到目标: (选取单位)
& && &&&点 - 清除 dian1
& && &&&点 - 清除 dian2
& && &&&单位组 - 删除 zu
这就是刚刚排泄单位组的方法。
[切记注意选取的动作之内不能有等待一类的动作哦]
排点的各类注意事项也大多能应用于单位组,这里不一一列推。
单位组 - 删除 最后创建的单位组 [R] 这条动作是完全与之无关的,不能用以排泄。
最后创建的单位组 [R] 是指最后一批通过创建单位动作创建出来的那些单位。
它的断句应该是:最后创建的单位 组,而不是:最后创建的 单位组,不要误用。
举例是王道。。。
& && &&&单位 - 创建 5 个 步兵 给 玩家1(红色) 在 ((可用地图区域) 的中心点) ,面向角度为 默认建筑朝向 度
& && &&&单位组 - 选取 最后创建的单位组 [R] 内所有单位做动作
& && && && &Loop - 动作
& && && && && & 单位 - 杀死 (选取单位)
结果步兵们一出现就扑了。。。
有时候我们要同时创建很多个单位让他们攻击,一般有3种作法:
& && &&&时间 - 每 2.00 秒触发事件
& && &&&For循环整数A从 1 到 5, 做动作
& && && && &Loop - 动作
& && && && && & 单位 - 创建 1 个 步兵 给 玩家12(棕色) 在 gudingdian[1] ,面向角度为 默认建筑朝向 度
& && && && && & 单位 - 对 最后创建的单位 [R] 发布 攻击移动 命令到目标点: gudingdian[2]
& && &&&时间 - 每 2.00 秒触发事件
& && &&&单位 - 创建 5 个 步兵 给 玩家12(棕色) 在 gudingdian[1] ,面向角度为 默认建筑朝向 度
& && &&&设置 zu = (shuabingqu &预设& 内属于 玩家12(棕色) 的所有单位)
& && &&&单位组 - 选取 zu 内所有单位做动作
& && && && &Loop - 动作
& && && && && & 单位 - 对 (选取单位) 发布 攻击移动 命令到目标点: gudingdian[2]
& && &&&单位组 - 删除 zu
& && &&&时间 - 每 2.00 秒触发事件
& && &&&单位 - 创建 5 个 步兵 给 玩家12(棕色) 在 gudingdian[1] ,面向角度为 默认建筑朝向 度& & 事件
& && &&&单位 - 单位进入 shuabingqu &预设&
& && &&&((触发单位) 的所有者) 等于 玩家12(棕色)
& && &&&单位 - 对 (触发单位) 发布 攻击移动 命令到目标点: gudingdian[2]现在我们也可以这么写:
& && &&&时间 - 每 2.00 秒触发事件
& && &&&单位 - 创建 5 个 步兵 给 玩家12(棕色) 在 gudingdian[1] ,面向角度为 默认建筑朝向 度
& && &&&单位组 - 对 最后创建的单位组 [R]发布 攻击移动 命令,目标: gudingdian[2]直接对单位组命令,而且使用最后创建的单位组是不需要排泄的~系统在创建动作的内部会自己调节。
删除 最后创建的单位组 [R] 会永远使最后创建的单位组传回空,最好不要写~(也没必要写饿)以上都是以R字头动作为准的,如果用原版动作是要删掉这个单位组的,因为原动作为防新人乱用,给你的单位组是复制版。。。
如玩家组也和单位组的处理大同小异(甚至更简单),而且使用频率也少得多,所以就不细说了。而选取物品、可破坏物之类则是把区域内一个个扫一遍,并没有一个专门的组的概念,所以根本没有东西创建,也不用排泄了。[单位组,顾名思义就是数个单位的组合,你可以根据自己需要设定其中的单位进出,当你如下方式记录时:设置zu=XX圆心XX范围内符合XXX条件的单位 加入单位组的是里面的单位,而不是XX圆心XX范围内符合XXX条件的单位 这个判定的条件,即选取后XX圆心XX范围内再进入什么单位都与zu无关。]
创建特效后特效有时在播放完毕后会自行消失,似乎是自行清除了,但看不见的不代表不存在,实际上它依然存在于原来的地方,只是因为特效动画播完了变成透明,所以看上去没有任何问题,不过实际上依然会占用内存空间的。
而建立在单位身上的特效,在单位死亡尸体腐烂后,就看不到了,但是和前面一样依然会占用空间。一般的删除特效相比点与单位组实在太过简单了~- -
在大多数情况下,你只需要创造出特效后立刻 删除 (最后创建的特效),虽然特效被立即删除,但还是会播放一遍特效动画,对于只播一次的特效,就可以马上删掉。像这样:
dian1:点变量
& && &&&单位 - 任意单位 发动技能效果
& && &&&(施放技能) 等于 刀阵旋风
& && &&&设置 dian1 = ((触发单位) 的位置)
& && &&&特殊效果 - 在 dian1 创建特效: Abilities\Spells\Human\ThunderClap\ThunderClapCaster.mdl
& && &&&点 - 清除 dian1
& && &&&特殊效果 - 删除 (最后创建的特效)。。。
一些特效需要持续播放一段时间,可以针对相应的触发设置额外的特效变量记录后计时通过变量删除,注意控制好变量一定不要冲突,否则万一留下一两个光影在地图上一闪一闪就囧了。如果模型没有动作就是一次性特效,可以马上删除,如果看到有stand,attack之类动作就要持续了。。。很多时候,你甚至可以:
& && &&&单位 - 任意单位 发动技能效果
& && &&&(施放技能) 等于 刀阵旋风
& && &&&特殊效果 - 删除 (新建特效 Abilities\Spells\Human\ThunderClap\ThunderClapCaster.mdl 在(((触发单位) 所在X轴坐标),((触发单位) 所在Y轴坐标))处)用一个语句创建并删除,且无需用点。
闪电效果的补充
闪电效果的清除用 删除闪电效果 动作,具体操作与持续的特效相近~
闪电效果应该是算比较特殊的一类,当你创建闪电效果时如果这个闪电效果在某玩家的视野范围外则对于此玩家而言这个闪电效果根本就不会创建,但其他视野范围内的玩家则会创建,也就是说闪电效果的创建对于玩家们而言是不同步的。。。- -我们可以利用这个特性作出部分反MH(开全图)的触发:
最大不超过128个,多了后者自动覆盖前面,ms真正对内存的影响倒不大- -。删除方式为:
& && &&&漂浮文字 - 创建漂浮文字: GQ 在 dian1 ,Z轴高度: 0.00 ,字体大小: 10.00 ,颜色值:(100.00%, 100.00%, 100.00%) ,透明度: 0.00%
& && &&&漂浮文字 - 设置 (最后创建的漂浮文字) : 禁用 永久显示.
& && &&&漂浮文字 - 设置 (最后创建的漂浮文字) 的生命周期为 5.00 秒或者在适当时候
& && &&&漂浮文字 - 删除 (xxx)
在触发中,有些选项是不变的,有些选项则会因为时间操作而变化。
我们用创建1个步兵动作新建出一个步兵,然后可以用最后创建的单位获得这个步兵:用添加神圣护甲给最后创建的单位来为步兵添加神圣护甲技能。。。但如果在等待数秒之后,最后创建的单位是会因创建单位动作而改变的,所以再用添加专注光环给最后创建的单位的话得到光环的就不一定是那个步兵了。最后创建的单位也就是个全局变量而已。
所以我们经常可以听到:等待后不能用最后创建的单位,和循环里不能套等待。。。类似下面的触发是有问题的:
dian1:点变量
& && &&&单位 - 任意单位 发动技能效果
& && &&&(施放技能) 等于 刀阵旋风
& && &&&设置 dian1 = ((触发单位) 的位置)
& && &&&单位 - 创建 1 个 刀阵旋风马甲 给 (触发玩家) 在 dian1 ,面向角度为 默认建筑朝向 度
& && &&&单位 - 对 最后创建的单位 [R] 发布 燃烧军团阿克蒙德 - 混乱之雨 命令到目标点: dian1
& && &&&等待 1.00 秒
& && &&&单位 - 对 最后创建的单位 [R] 发布 人族山丘之王 - 雷霆一击 命令
& && &&&点 - 清除 dian1这可算是一个典型的错误触发~假使设定好马甲设置,单照着上面技能使用恐怕不会有什么问题,不过如果是放在一张完整的图里。。。那么,假使山丘用雷霆一击雷死了一个敌人,而敌人。。。掉宝了。。。~还记得掉宝触发么?
变量:dian1:点变量
& && &&&单位 - 任意单位 死亡
& && &&&((触发单位) 的所有者) 等于 中立敌对
& && &&&(随机整数,最小值: 1 最大值: 100) 小于或等于 20
& && &&&设置 dian1 = ((触发单位) 的位置)
& && &&&物品 - 创建 经验之书 在 dian1
& && &&&点 - 清除 dian1
~我们看看系统处理的顺序:
[绿色文字表示技能的触发,黑色表示掉宝触发]
[触发单位是施放技能的山丘]
[触发单位是死掉的敌人]
& && &&&设置 dian1 = ((触发单位) 的位置)
& && &&&单位 - 创建 1 个 刀阵旋风马甲 给 (触发玩家) 在 dian1 ,面向角度为 默认建筑朝向 度
& && &&&单位 - 对 最后创建的单位 [R] 发布 燃烧军团阿克蒙德 - 混乱之雨 命令到目标点: dian1
& && &&&设置 dian1 = ((触发单位) 的位置) //dian改变,原来的dian遗失
& && &&&物品 - 创建 经验之书 在 dian1
& && &&&点 - 清除 dian1 //dian被清除
& && &&&等待 1.00 秒
& && &&&单位 - 对 最后创建的单位 [R] 发布 人族山丘之王 - 雷霆一击 命令
& && &&&点 - 清除 dian1 //之前的点已被清除,开始的点已无法捕捉,废动作
& && &&&设置 dian1 = ((触发单位) 的位置)
& && &&&设置 dian1 = ((触发单位) 的位置)
& && &&&点 - 清除 dian1
& && &&&点 - 清除 dian1
显而易见,连续设置2个点使原先删除山丘位置的动作成了废动作。。。而且命令最后创建的单位 雷霆一击 这条动作是在 等待1秒 后。。。如果1秒内有新的单位创建那么命令的还是马甲吗?对于现在而言,只能这么改:
dian1:点变量
& && &&&单位 - 任意单位 发动技能效果
& && &&&(施放技能) 等于 刀阵旋风
& && &&&设置 dian1 = ((触发单位) 的位置)
& && &&&单位 - 创建 1 个 刀阵旋风马甲 给 (触发玩家) 在 dian1 ,面向角度为 默认建筑朝向 度
& && &&&单位 - 对 最后创建的单位 [R] 发布 燃烧军团阿克蒙德 - 混乱之雨 命令到目标点: dian1
& && &&&点 - 清除 dian1
& && &&&等待 1.00 秒
& && &&&设置 dian1 = ((触发单位) 的位置)
& && &&&单位 - 创建 1 个 刀阵旋风马甲 给 (触发玩家) 在 dian1 ,面向角度为 默认建筑朝向 度
& && &&&单位 - 对 最后创建的单位 [R] 发布 人族山丘之王 - 雷霆一击 命令
& && &&&点 - 清除 dian11秒后重新定义点。。。
循环整数A和B其实也是全局变量,这也就是为什么循环整数A/B中等待会混乱的原因了。。。运行的时候如果循环整数已经被改变,下一轮判断时自然不准。。。所以暴雪为了嵌套循环而弄出来另一个功能一样的循环整数B而不是只用循环整数A。不过在等待的情况下这两个显然都是不能保证的,用额外的自定义变量吧~
触发内系统自己绑定的数据
最后创建的单位 是一个全局变量,每次创建单位都被记录,所以不能用于有等待的单位传递,那么如下的触发又是否正确?
& && &&&单位 - 任意单位 死亡
& && &&&((触发玩家) 的玩家索引号) 小于或等于 8
& && &&&((触发单位) 是 英雄) 等于 TRUE
& && &&&等待 30.00 秒
& && &&&英雄 - 立即复活 (触发单位) 在 gudingdian[1] , 显示 复活动画 //gudingdian[1]是要复活的地方
有人可能回答错,其原因是:30秒后触发单位怎么还能捕捉到?即使可以得到触发单位,但这30秒里要是有人再死,触发单位还会是原来的触发单位?这是可以的。
我们说最后创建的单位会随创建单位动作而改变,不能用于等待,因为当你看到它的代码时会发现&最后创建的单位&是一个全局变量,任何一次创建单位的动作都会直接改变它的值。
而触发单位不同,它是在响应事件时直接绑定于触发的局部变量(资源?)(不知道这么说好不好- -,反正看作一个不需释放无法改变的局部变量就差不多),只作用于其所对应的单次触发,在每次触发响应中都是互不影响的值。如同在一个触发未运行完毕时又被触发,则2个一样语句的动作各行其事,互不干扰,这种变量也不会有任何改变。其它如攻击单位,被操作物品,触发玩家等也有一样的性质,UI中对这类有提示:响应XX事件,一般可以参照下。
[技能释放目标比较特别,技能释放完毕后就无法捕捉了。]
这在一定程度上可以方便我们操作,甚至有时能代替自定义局部变量。
以坐标代替点是一个很好的省力方法,例如当一个区域仅仅是为了提供中心点刷兵时,完全可以将它舍去,这时触发由:
变量:gudingdian:点变量数组
& && &&&地图初始化
& && &&&设置 gudingdian[1] = (shuabingqu &预设& 的中心点)
& && &&&设置 gudingdian[2] = 。。。
变量:gudingdian:点变量数组
& && &&&地图初始化
& && &&&设置 gudingdian[1] = (坐标(XXX(刷兵点X坐标), XXX(刷兵点Y坐标)))
& && &&&设置 gudingdian[2] = 。。。
。。。之后调用gudingdian[1]
节省了一个区域当然这几乎算不上坐标的运用,因为转换坐标为点(XXX,XXX)也是会产生点的,只不过是用你给的坐标转换成点,像下面的动作:创建1个步兵给玩家1在(转换坐标为点(XXX,XXX))
同样会创建点,也同样需要排泄,但如果是:
创建单位在坐标
就不会创建点。
在触发中,直接找不到这动作,却可以在 设置a(单位变量)=XXX 及作用在单位的一类动作的副动作中找到。。。- -!!!
翻译成中文触发,是:
单位-创建单位在坐标
创建1(只能是1个)个(?)类型单位给玩家(?)在?(X坐标),?(Y坐标),面向(?)角度
如:设置 u = (新建 玩家1(红色) 的 步兵 在(0.00,0.00),面向角度:0.00 度)
利用它,我们可以直接以坐标创建单位而不经过点的转折(物品,特效等也是)。
这样创建出来的单位无法通过 最后创建的单位 获取到,因为其实最后创建的单位本来也是一个全局变量,在创建单位在点的动作之中系统设置了最后创建的单位这个变量=创建的单位,而创建单位在坐标却省了中间环节,所以无法被最后创建的单位捕捉~~具体应用中还需多加考量。我们可以这么刷兵:
& && &&&时间 - 每 2.00 秒触发事件
& && &&&单位 - 对 (新建 玩家12(棕色) 的 步兵 在(xxx(刷兵点X坐标),xxx(刷兵点Y坐标)),面向角度:0.00 度) 发布 攻击移动 命令到坐标(xxx(目标攻击点X坐标),xxx(目标攻击点Y坐标))完全环保了~不牵扯任何点。。。
刷多个也只是循环而已
& && &&&时间 - 每 2.00 秒触发事件
& && &&&For循环整数A从 1 到 5, 做动作
& && && && &Loop - 动作
& && && && && & 单位 - 对 (新建 玩家12(棕色) 的 步兵 在(xxx(刷兵点X坐标),xxx(刷兵点Y坐标)),面向角度:0.00 度) 发布 攻击移动 命令到坐标:((xxx(目标攻击点X坐标),xxx(目标攻击点Y坐标))
效率方面更不用担心。。。
正常创建多个单位动作内部其实也是循环+创建单位在坐标,而且为了适用于各种情形而增加了许多我们或许没用的设置。我们直接用坐标创建是完全合理的。其他类似的动作有很多,基本上可以以坐标代替点了,如创建物品,特效,设置单位X坐标+设置单位Y坐标效率远胜于移动单位到点(适合短距离,长距离小心设置单位X坐标后进入了某地触发一些意料外的事件),点不一定非得设置-删除而可以移动一个点到坐标。。。大家在应用中多多留意吧。。。当然有些点是不可替代的,如: 单位 - 对 (新建 玩家1(红色) 的 步兵 在 (技能施放点) 面向角度:0.00 度) 发布 人族步兵 - 激活防御 命令 这句动作就怎么也无法省去点的操作,因为不能直接获得 (技能释放点) 的坐标。
如果写: 单位 - 对 (新建 玩家1(红色) 的 步兵 在(((技能施放点) 的X轴坐标),((技能施放点) 的Y轴坐标)),面向角度:0.00 度) 发布 人族步兵 - 激活防御 命令 结果将是泄漏2个点
我们经常看见本来纯T的教程或演示里选取单位组前出现 自定义代码: set bj_wantDestroyGroup = true。这是什么?
首先要知道set。set的意思就是设置,设置变量的设置,set a = 1 就是 设置a=1,当然其中格式还有些区别~不过我们现在不需要理会。
bj_wantDestroyGroup是游戏内自带的一个布尔全局变量(如之前的(最后创建的单位)也是游戏内自带的一个全局变量,但是单位类型),系统预设为false(假)。在每一次创建单位组时(相关的动作函数内),会先检查bj_wantDestroyGroup,如果其值为true(真),系统将把bj_wantDestroyGroup 还原为 false(假),并会在创建的单位组使用后自动移除。set bj_wantDestroyGroup = true需要放在会创建单位组的动作的上面一行,且使用这个后就不要额外再用变量记录法排泄了。
自定义代码:set bj_wantDestroyGroup = true
选取XX内单位内所有单位作动作-
。。。动作或者:
自定义代码:set bj_wantDestroyGroup = true
if XX内单位内所有单位数量!=0
。。。动作
下面两个触发的效果是一样的:
dian1:点变量
zu:单位组变量
& && &&&单位 - 任意单位 发动技能效果
& && &&&(施放技能) 等于 属性战争践踏
& && &&&设置 dian1 = ((触发单位) 的位置)
& && &&&设置 zu = (半径为 300.00 圆心为 dian1 且满足 ((((匹配单位) 是 (触发玩家) 的敌对单位) 等于 TRUE) and (((匹配单位) 是 建筑) 等于 FALSE)) 的所有单位)
& && &&&单位组 - 选取 zu 内所有单位做动作
& && && && &Loop - 动作
& && && && && & 单位 - 命令 (触发单位) 对 (选取单位) 造成 (转换 (((触发单位) 的力量值(包括 加成)) x ((触发单位) 的 属性战争践踏 技能等级)) 为实数) 点伤害(不是 攻击伤害, 不是远程攻击) 攻击类型: 法术 伤害类型: 普通 装甲类型: 无
& && &&&单位组 - 删除 zu
& && &&&点 - 清除 dian1
dian1:点变量
& && &&&单位 - 任意单位 发动技能效果
& && &&&(施放技能) 等于 属性战争践踏
& && &&&设置 dian1 = ((触发单位) 的位置)
& && &&&自定义代码: set bj_wantDestroyGroup = true
& && &&&单位组 - 选取 (半径为 300.00 圆心为 dian2 且满足 ((((匹配单位) 是 (触发玩家) 的敌对单位) 等于 TRUE) and (((匹配单位) 是 建筑) 等于 FALSE)) 的所有单位) 内所有单位做动作
& && && && &Loop - 动作
& && && && && & 单位 - 命令 (触发单位) 对 (选取单位) 造成 (转换 (((触发单位) 的力量值(包括 加成)) x ((触发单位) 的 属性战争践踏 技能等级)) 为实数) 点伤害(不是 攻击伤害, 不是远程攻击) 攻击类型: 法术 伤害类型: 普通 装甲类型: 无
& && &&&点 - 清除 dian1记住这样的小行代码并使用可以使编辑更方便,当然也会有很多人喜欢用变量法,毕竟与点的排泄类似,更容易掌握操作,效率也是高一点点的。而且使用set bj_wantDestroyGroup = true也并不是那么可靠~。
一些情况下(其实是在动作里连带创建单位组&=2时)将会混乱。当遇到单位组-选取全图内XX类型的单位做动作时,使用set bj_wantDestroyGroup = true的方法,将会有不能正确选出单位的bug。
还好这种动作相比其他的使用频率并不算多,并不影响这个方法的流传。
2种不能使用set bj_wantDestroyGroup = true的方法:
单位在死亡后会形成尸体,尸体状态下依然可以捕捉单位的点、类型、自定义值等数据。。。而在尸体消失的时候系统会自动清理该单位的相关数据,不用特别理会。
这里说的泄漏,大多指无用单位在地图上堆积过多,如创建马甲后未能及时清除,地图上暂时没用的怪物之类太多,敌方小兵刷得太多等。
在刷怪时不要在同一时间段出现太多单位,单位本身加上命令、技能等耗用的空间并不小,而且尸体也是会占用很多内存的,尽量把单位个数在时间上分配均匀。如果尸体确定充足的话可以在游戏平衡性常数中考虑减短尸体腐烂时间(一般尸体不用留那么久的)。单位(特别是普通的小怪)最好不要有光环、球体之类及华丽技能,一群小兵配上一圈圈光影是很恐怖的(系统光环判定也很烦),不只是为内存考虑。。。技能,攻击等的投射物也应尽管减少存在的量。
有时不用一些成堆的野怪放置在野怪区而是判断单位进入再临时刷,为了减少单位数。
减少一点地图中预设置物体的初步设置,譬如:单位生命,魔法,等级,三围属性,已备技能,单位死亡掉落物品,单位(模型也都适用)的大小比例等。通常大家喜欢把BOSS的模型缩放设成数倍,显得强悍~实际这些东西是会增加地图读取时间,和影响游戏进程的。
英雄与一般单位不同,死后仍会保留信息以供复活什么,当英雄死亡后不准备再用时切记删除,像敌方的小boss一类。在一般情况下,下面的野怪复活触发是可以正常运转的:
& && &&&单位 - 中立敌对 的单位 死亡
& && &&&//-------- 大家不会有人在等待30秒之前就设置dian1吧~ --------
& && &&&等待 30.00 秒
& && &&&设置 dian1 = ((触发单位) 的位置)
& && &&&单位 - 创建 1 个 ((触发单位) 的类型) 给 中立敌对 在 dian1 ,面向角度为 默认建筑朝向 度
& && &&&点 - 清除 dian1
或者说,只要死亡的单位的尸体在30秒后还是完好的,就可以正常复活。之所以有时无法正常运转,是因为尸体被破坏或转换成其他单位。如果尸体不存在的话,30秒后就无法捕捉到触发单位了,如果尸体被转化成甲虫,那么30秒后创建的将是甲虫。。。
事实上,腐尸甲虫,复活,复仇之魂一类技能常给作图带来一些麻烦与限制(同样也可用其特性方便一些额外需求),如果对此要求不多的话,或许可以考虑模拟。。。就想到这么多了。。。
马甲一般在施法时创建,施放自己的技能完毕或造成伤害后清除,对于普通技能,给予3~5秒生存时间就好(技能投射物伤害延时等),特殊需持续的技能额外确定如纠缠须根,流星雨等。有时可以令一个马甲连续施放技能而不用多次创建。当使用负生命回复马甲时记得设置死亡方式 不会腐化,无法召唤 ,使马甲死亡后不产生尸体而直接删除。
一个马甲总是有应用的必要,所以永久性的存于游戏中,这种马甲往往能使复杂的操作变简单或在维系功能上起重要作用。双重物品栏用以存储物品的马甲就属于永久马甲。
这样一个技能:
每秒对附近的一个敌人放出纠缠须根。
这个技能的要求并不算苛刻,但具体应当怎么做?
& && &&&时间 - 每 1.00 秒触发事件
& && &&&设置 dian1 = (守望者 0000 &预设& 的位置)
& && &&&单位 - 创建 1 个 荆棘结界马甲 给 玩家1(红色) 在 dian1 ,面向角度为 默认建筑朝向 度
& && &&&单位 - 设置 最后创建的单位 [R] 的 纠缠根须 等级为 (守望者 0000 &预设& 的 荆棘结界 技能等级)
& && &&&自定义代码: set bj_wantDestroyGroup = true
& && &&&单位 - 对 最后创建的单位 [R] 发布 暗夜精灵族丛林守护者 - 纠缠根须 命令到目标: ((半径为 512.00 圆心为 dian1 且满足 ((((匹配单位) 是 建筑) 等于 FALSE) and ((((匹配单位) 是 玩家1(红色) 的敌对单位) 等于 TRUE) and (((匹配单位) 是 死亡的 [R]) 等于 FALSE))) 的所有单位) 中随机选取的一个单位)
& && &&&点 - 清除 dian1
这个方法是可行的。
但纠缠须根可是有数十秒持续时间的,生存几十秒的马甲每秒创建一个。。。这个技能未免太花瓶了。。。我们不妨:
& && &&&时间 - 游戏开始 0.00 秒
& && &&&设置 majia[循环整数A [R]] = (新建 (玩家 循环整数A [R]) 的 步兵 在(xxx,xxx),面向角度:0.00 度) //某阴暗不为人知的角落。。。
& && &&&单位 - 任意单位 学习技能
& && &&&(学习技能) 等于 荆棘结界
& && &&&如果所有条件成立则做动作1,否则做动作2
& && && && &If - 条件
& && && && && & ((触发单位) 的 荆棘结界 技能等级) 等于 1
& && && && &Then - 动作
& && && && && & 单位 - 为 majia[((触发玩家) 的玩家索引号)] 添加 纠缠根须
& && && && &Else - 动作
& && && && && & 单位 - 使 majia[((触发玩家) 的玩家索引号)] 的 纠缠根须 等级提升1级
未命名触发器 002 复制
& && &&&时间 - 每 1.00 秒触发事件
& && &&&设置 dian1 = (守望者 0000 &预设& 的位置)
& && &&&自定义代码: set bj_wantDestroyGroup = true
& && &&&单位 - 对 majia[((守望者 0000 &预设& 的所有者) 的玩家索引号)] 发布 暗夜精灵族丛林守护者 - 纠缠根须 命令到目标: ((半径为 512.00 圆心为 dian1 且满足 ((((匹配单位) 是 建筑) 等于 FALSE) and ((((匹配单位) 是 (守望者 0000 &预设& 的所有者) 的敌对单位) 等于 TRUE) and (((匹配单位) 是 死亡的 [R]) 等于 FALSE))) 的所有单位) 中随机选取的一个单位)
& && &&&点 - 清除 dian1
看起来3个触发很烦琐,实际上这么设置在多技能中是更方便直观的,而且如果改一改也是方便多人使用的。===禁===物品:
物品被用掉后系统会自动删除,书一类会播放死亡动画,有很小的亮点在原位置,几秒后删除(这几秒内用触发把物品给英雄仍有效果- -囧。。。)。一般不用特意管理,最多也不过给玩家一个能清除物品的命令或设置物品在地上后几秒没人捡就删除罢了。也可参照一些单位的方法处理。
自定义的单位、物品、技能在操作中可能会有点卡,我们可以在游戏一开始时把所有单位物品都创建1个然后删除,当然预先在地图上放置进游戏再删除也一样。
具体原因不详,MS可以理解为当第一个xx出现在游戏时系统注册相关资料,卡的也就是他了- -
注意所创建删除的必需是游戏中出现的第一个该类型单位(物品),否则无效的。
可破坏物相比单位,物品占的地方少一些,游戏中也是有所应用的~
可破坏物可以通过复活来刷新,最常见的就是树木重生了:不同于单位物品,可破坏物死亡后数据不会自动清除,所以对于没用了的可破坏物一定要记得删除掉。kepohuai
& && &&&地图初始化
& && &&&可破坏物 - 选取 (可用地图区域) 内所有可破坏物做动作
& && && && &Loop - 动作
& && && && && & 触发器 - 为 shumufuhuo &预设& 添加事件: (可破坏物 - (选取的可破坏物) 死亡)shumufuhuo
& && &&&如果所有条件成立则做动作1,否则做动作2
& && && && &If - 条件
& && && && && & ((死亡的可破坏物) 的类型) 等于 夏季树木
& && && && &Then - 动作
& && && && && & 等待 30.00 秒
& && && && && & 可破坏物 - 复活 (死亡的可破坏物) 并设置生命值为 ((死亡的可破坏物) 的最大生命值) , 显示 复活动画
& && && && &Else - 动作
& && && && && & 可破坏物 - 删除 (死亡的可破坏物)
触发在游戏中同样会占用内存空间~这是无可置疑的。现在我们能作的只是把已经没有用处的触发清理一些。关闭触发动作只是不再控制执行,但触发仍在占用内存。对不再使用的触发,用删除触发可以清理。确定已经不需要再用的触发就统统删除了吧。游戏初始化及游戏开始xx秒的触发就是很好的例子。
& && && &&&地图初始化
设置可见度
设置玩家X金钱为XX
//等等一堆动作后。。。
& && &&&触发器 - 删除 (当前触发)
下面是用触发的动态注册事件的例子:dongtaizhuce
& && &&&时间 - 游戏开始 0.00 秒
& && &&&设置 zu = ((可用地图区域) 内的所有单位)
& && &&&单位组 - 选取 zu 内所有单位做动作
& && && && &Loop - 动作
& && && && && & 触发器 - 为 shanghai &预设& 添加事件: (单位 - (选取单位) 接受伤害)
& && &&&单位组 - 删除 zu
dongtaizhuce2
& && &&&单位 - 单位进入 (可用地图区域)
& && &&&触发器 - 为 shanghai &预设& 添加事件: (单位 - (触发单位) 接受伤害)shanghai
//你想要做的动作。。。
但这仅仅适用于小规模的注册~如果将它用在正式的地图将会随着时间的推移越来越卡。因为每当有单位被创建就为触发添加一个事件,但单位死亡、尸体消失后为该单位注册的事件并不会消失,仍占用着内存的地方,注册的单位多了自然会卡。WE没有删除事件的动作(函数),所以想使用动态注册事件最好还是用J的方法(jass中可以创建触发,为每个单位创建一个触发分别对应,单位死亡时就删除所对应的触发)。实在无法的话,也可以用一些比较囧的设置如分割,降低所带来的泄漏:dongtaizhuce
& && &&&时间 - 游戏开始 0.00 秒
& && &&&设置 zu = ((可用地图区域) 内的所有单位)
& && &&&单位组 - 选取 zu 内所有单位做动作
& && && && &Loop - 动作
& && && && && & 触发器 - 为 shanghai &预设& 添加事件: (单位 - (选取单位) 接受伤害)
& && &&&单位组 - 删除 zu
& && &&&等待 600.00 秒
& && &&&触发器 - 删除 zhucechufa
& && &&&设置 zhucechufa = shanghai2 &预设&
& && &&&设置 zu = ((可用地图区域) 内的所有单位)
& && &&&单位组 - 选取 zu 内所有单位做动作
& && && && &Loop - 动作
& && && && && & 触发器 - 为 zhucechufa 添加事件: (单位 - (选取单位) 接受伤害)
& && &&&单位组 - 删除 zu
& && &&&等待 600.00 秒
& && &&&触发器 - 删除 zhucechufa
& && &&&设置 zhucechufa = shanghai3 &预设&
& && &&&设置 zu = ((可用地图区域) 内的所有单位)
& && &&&单位组 - 选取 zu 内所有单位做动作
& && && && &Loop - 动作
& && && && && & 触发器 - 为 zhucechufa 添加事件: (单位 - (选取单位) 接受伤害)
& && &&&单位组 - 删除 zudongtaizhuce2
& && &&&单位 - 单位进入 (可用地图区域)
& && &&&触发器 - 为 zhucechufa 添加事件: (单位 - (触发单位) 接受伤害)
计时器这东西确实没什么可说的。。。
只是提醒一下。有人喜欢这么写:
& && &&&单位 - 任意单位 死亡
& && &&&((触发玩家) 的玩家索引号) 小于或等于 8
& && &&&((触发单位) 是 英雄) 等于 TRUE
& && &&&计时器 - 开启 (新建的计时器) ,计时方式: 一次性 时间设置: 30.00 秒
& && &&&计时器 - 为 (最后启用的计时器) 创建计时器窗口,使用标题: 复活倒计时
& && &&&等待 30.00 秒
& && &&&英雄 - 立即复活 (触发单位) 在 gudingdian[1] , 显示 复活动画
& && &&&计时器 - 删除 最后创建的计时器窗口 [R]
& && &&&计时器 - 删除 最后启用的计时器 [R]
虽然是只用一个触发就完成了英雄计时器复活~其实呢。。~看过2.1就明白的。。。如果30秒内还有计时器被创建。。。屏幕就汗了。。。整个游戏都混乱也不是不可能的。。。
我们需要改成这样:
变量: yxfh:计时器变量数组(注意计时器是要在一开始正确设置数组数的)
& && &yxfhck:计时器窗口变量数组
jishiqi 复制
& && &&&单位 - 任意单位 死亡
& && &&&((触发玩家) 的玩家索引号) 小于或等于 8
& && &&&((触发单位) 是 英雄) 等于 TRUE
& && &&&计时器 - 开启 yxfh[((触发玩家) 的玩家索引号)] ,计时方式: 一次性 时间设置: 30.00 秒
& && &&&计时器 - 为 (最后启用的计时器) 创建计时器窗口,使用标题: 复活倒计时
& && &&&设置 yx额滴神啊```[((触发玩家) 的玩家索引号)] = 最后创建的计时器窗口 [R]
& && &&&计时器 - 设置 最后创建的计时器窗口 [R] 的状态为显示
& && &&&等待 30.00 秒
& && &&&英雄 - 立即复活 (触发单位) 在 gudingdian[1] , 显示 复活动画
& && &&&计时器 - 删除 yx额滴神啊```[((触发玩家) 的玩家索引号)]
当然用计时器到期事件是最好的。。。
上面应当是都了解的排泄。
时间 - 每 xxx 秒触发事件 其实就是一个永远开启的计时器,在写触发时比较方便,但自定义计时器容易控制,具体用哪个还是要看情况需求。在触发中使用计时器确实很不方便~很多地方需要我们设计出特别的计时方法,及对计时器循环混杂的使用。
例子:物品掉落后如果30秒不捡就消失:
& && &&&时间 - 每 1.00 秒触发事件
& && &&&物品 - 选取 (可用地图区域) 内所有物品做动作
& && && && &Loop - 动作
& && && && && & 物品 - 设置 (选取物品) 的自定义值为 (((选取物品) 的自定义值) + 1)
& && && && && & 如果所有条件成立则做动作1,否则做动作2
& && && && && && &&&If - 条件
& && && && && && && && &((选取物品) 的自定义值) 等于 30
& && && && && && &&&Then - 动作
& && && && && && && && &物品 - 删除 (选取物品)
& && && && && && &&&Else - 动作& & 事件
& && &&&单位 - 任意单位 获得物品
& && &&&物品 - 设置 (被操作物品) 的自定义值为 0
不舍得自定义值也可参照下文变量数组的方法。
计时器的精度是0.01秒(用0秒计时和0.01秒计时的效果是一样的)大家在作技能时需要连续够动单位之类可能用到了0.01秒的计时器(时间周期事件),事实上,这在一段时间内占用了较多的资源,1秒中执行100次动作,效率可想而知。人眼能感觉到画面流畅的速度是24祯(是这个字?),用0.04秒的计时器即可达到,考虑到速度的因素,一般0.03秒也足够了。据测试说计时器是占用资源最少的物体。。。
而且在计时中途直接删除计时器而不暂停的话仍然会响应到期。。。
由此似乎可以猜测一点计时器与游戏时间流程的关系。。。
临时变量的运用:
这里所说的临时变量泛指一瞬间操作完毕的变量。下为一开始基本排点的例子:
变量:dian1:点变量
& && &&&时间 - 每 2.00 秒触发事件
& && &&&设置 dian1 = (shuabingqu &预设& 的中心点)
& && &&&单位 - 创建 1 个 步兵 给 玩家1(红色) 在 dian1 ,面向角度为 默认建筑朝向 度
& && &&&点 - 清除 dian1其中dian1就起到了即时装载数据的作用,点并不如特效般有 最后创建的特效 可以直接引用,所以用dian1传递了创建的点。
而 最后创建的特效 也不过同 最后创建的单位 一样是全局变量,在创建特效的动作内部有设置最后创建的特效 =新建特效xx。。。玩家排泄时删除。。。与dian1的设置其实是相近的。单位组的排泄也是同点一样瞬间记录后删除:
设置zu=XX内单位
选取zu内所有单位作动作-
。。。动作
死亡之指:对友军加血,敌人伤害,但无法直接杀死敌人,值为死亡之指等级*力量
& && &&&单位 - 任意单位 发动技能效果
& && &&&(施放技能) 等于 死亡之指
& && &&&如果所有条件成立则做动作1,否则做动作2
& && && && &If - 条件
& && && && && & ((技能施放目标) 是 (触发玩家) 的同盟单位) 等于 TRUE
& && && && &Then - 动作
& && && && && & 单位 - 设置 (技能施放目标) 的生命值为 (((技能施放目标) 的 生命值) + (转换 (((触发单位) 的 死亡之指 技能等级) x ((触发单位) 的力量值(包括 加成))) 为实数))
& && && && &Else - 动作
& && && && && & 如果所有条件成立则做动作1,否则做动作2
& && && && && && &&&If - 条件
& && && && && && && && &(转换 (((触发单位) 的 死亡之指 技能等级) x ((触发单位) 的力量值(包括 加成))) 为实数) 大于或等于 ((技能施放目标) 的 生命值)
& && && && && && &&&Then - 动作
& && && && && && && && &单位 - 设置 (技能施放目标) 的生命值为 1.00
& && && && && && &&&Else - 动作
& && && && && && && && &单位 - 命令 (触发单位) 对 (技能施放目标) 造成 (转换 (((触发单位) 的 死亡之指 技能等级) x ((触发单位) 的力量值(包括 加成))) 为实数) 点伤害(是 攻击伤害, 不是远程攻击) 攻击类型: 法术 伤害类型: 神圣 装甲类型: 无以上是一个属性相关的无聊技能,但在作技能时我们要多次用到(转换 (((触发单位) 的 死亡之指 技能等级) x ((触发单位) 的力量值(包括 加成))) 为实数)这个数,一条条动作写起来实在很麻烦,而有了临时变量就可以变得方便许多:
r:实数变量
& && &&&单位 - 任意单位 发动技能效果
& && &&&(施放技能) 等于 死亡之指
& && &&&设置 r = (转换 (((触发单位) 的 死亡之指 技能等级) x ((触发单位) 的力量值(包括 加成))) 为实数)
& && &&&如果所有条件成立则做动作1,否则做动作2
& && && && &If - 条件
& && && && && & ((技能施放目标) 是 (触发玩家) 的同盟单位) 等于 TRUE
& && && && &Then - 动作
& && && && && & 单位 - 设置 (技能施放目标) 的生命值为 (((技能施放目标) 的 生命值) + r)
& && && && &Else - 动作
& && && && && & 如果所有条件成立则做动作1,否则做动作2
& && && && && && &&&If - 条件
& && && && && && && && &r 大于或等于 ((技能施放目标) 的 生命值)
& && && && && && &&&Then - 动作
& && && && && && && && &单位 - 设置 (技能施放目标) 的生命值为 1.00
& && && && && && &&&Else - 动作& && && && && && && && &单位 - 命令 (触发单位) 对 (技能施放目标) 造成 r 点伤害(是 攻击伤害, 不是远程攻击) 攻击类型: 法术 伤害类型: 神圣 装甲类型: 无
临时变量的运用可以让触发简单,也更具条理。===禁===临时变量可以在触发的传递中起很大作用。如果想把动作当成独立的模块使用,临时变量绝对是必不可少的。还有就是类似下面的触发,一个数据改变后仍需要用到原来的值:
& && &&&单位 - 任意单位 获得物品
& && &&&((被操作物品) 的类型) 等于 升级长剑
& && &&&设置 i = (((触发单位) 所持有的 长剑) 的自定义值)
& && &&&物品 - 删除 ((触发单位) 所持有的 长剑)
& && &&&英雄 - 创建 升级了的长剑 给 (触发单位)
& && &&&物品 - 设置 最后创建的物品 [R] 的自定义值为 i作用是升级后的长剑继承原长剑的自定义值,有什么作用么。。。要看游戏里的具体设置了汗~
一些重视效率的Weer喜欢先把临时变量设置成触发单位,凶手单位等触发内可以直接获取的东西。道理也并不复杂~恩要获得触发单位,系统应该要先得到当前的触发器,翻出触发器里的数据,找到触发单位这一个才传回来(我猜的- -),无形中增加了很多操作,如果是伤害来源,目标等还要在触发单位的基础上再查找,效率上就显得弱了。。。而通过变量获取单位则快捷很多。
& && &&&单位 - 任意单位 被攻击
& && &&&设置 u = (触发单位)
& && &&&设置 u2 = (攻击单位)
& && &&&如果所有条件成立则做动作1,否则做动作2
& && && && &If - 条件
& && && && && & (u 的生命百分比) 小于或等于 20.00
& && && && && & ((u 的所有者) 的控制者) 等于 电脑
& && && && && & (u 是 (u2 的所有者) 的同盟单位) 等于 TRUE
& && && && &Then - 动作
& && && && && & 单位 - 杀死 u
& && && && &Else - 动作
& && && && && & 单位 - 对 u2 发布 停止 命令
& && && && && & 单位 - 立即移动 u2 到 gudingdian[5] //小黑屋
上例中触发单位用到4处,攻击单位用到3处,用变量记录便方便了。
具体情况还需看个人习惯操作。各类型用一、二个临时变量即可解决绝大部分问题,而不需要专门为某个技能或功能创出大片全局变量专用。而且也不用担心变量的冲突。
个人临时变量的习惯是:
u:单位变量数组(有些时候可能有要用到索引的地方)
u1:单位变量
u2:单位变量
u3:单位变量
依此类推。。。
临时全局变量的安全性是可以保障的~但某些看似正常操作搭配也会导致其数据运行中途的变更,即混乱。
& && &&&时间 - 游戏开始 0.00 秒
& && &&&设置 s = “a”
& && &&&单位 - 对 守望者 0000 &预设& 发布 停止 命令
& && &&&游戏 - 对 玩家1(红色) 在屏幕位移(0.00,0.00)处显示文本: s
& && &&&单位 - 守望者 0000 &预设& 发布无目标指令
& && &&&设置 s = “b”
或许我们希望屏幕上能够显示a,但实际上s在显示之前就已经被改成了&b&。
对于这类刚发出就可以被事件捕捉的动作(发布命令,接受伤害。。。),即时被触发的触发动作是会接着马上运行,运行完毕或遇到等待时才返回运行原来的触发器未完成的动作。
因此就不能那么轻率的使用某个临时变量。
& && &&&单位 - 任意单位 发动技能效果
& && &&&(施放技能) 等于 暗影突袭
& && &&&设置 u1 = (触发单位)
& && &&&单位 - 命令 u1 对 (技能施放目标) 造成 100.00 点伤害(是 攻击伤害, 不是远程攻击) 攻击类型: 法术 伤害类型: 普通 装甲类型: 无
& && &&&特殊效果 - 删除 (新建特效 Abilities\Spells\Human\ThunderClap\ThunderClapCaster.mdl 在((u1 所在X轴坐标),(u1 所在Y轴坐标))处)
& && &&&//可以看出,我们想要英雄身上出现特效
& && &&&单位 - 女巫 0002 &预设& 接受伤害
& && &&&设置 u1 = (触发单位)
& && &&&如果所有条件成立则做动作1,否则做动作2
& && && && &If - 条件
& && && && && & (u1 的 生命值) 小于或等于 100.00
& && && && &Then - 动作
& && && && && & 单位 - 设置 u1 的 生命值 为 300.00
& && && && &Else - 动作第一个触发是一个简单的技能,第二个也只是很普通的测试触发而已。可将他们合到一起以后。。。效果不说了。
所以呢~在作图中还是要注意变量的冲突的,把握好用变量的地方。
很简单的东西,具体应用很容易就推出了恩。。。3.1概念续
排泄的前提是知道有泄漏,换言之,是有以后不会用到的东西被创建出来。有东西被创建才会消耗内存,当这个东西不再有用却依然存于游戏才有泄漏。在写触发时需要注意的是什么地方创建了东西而不会被清理。
整数、实数、布尔值:这3个是可以随便乱用的,不管用到多少都不会产生问题,所以能以这3种数据解决的东西就不必涉及其他了。
字符串被创建后无法删除,但一样的字符串不会额外占位,其所占用的空间极其微小,没有上万条造不成感觉,在T里基本没多少用的地方,现在也可以归到上面3条之内。
[如设置a=&a&//创建一个字符串
设置b=&b&//创建一个字符串
设置c=(a+b)//创建一个字符串
设置d=&(d&+&e&)//创建三个字符串
设置e=(&a&+&b&)//不创建字符串,之前有用过]
但我们也不必一见到其他的类型就想着删除,重要的是判断有没有废品需要清理。
泄漏需要的是有东西被创建再删除。像 (XXX区域的中心点)位置 新在(XXX区域的中心点)创建了点,但(触发单位)之类是原本就存于地图上的有用单位,排泄自然无从谈起。
面向角度,坐标,伤害,生命魔法一类数据是实数,技能、单位等级,包括单位、技能类型也都是整数,像这些都是不用理会的。
而所有玩家,可用地图区域等是系统在游戏初始化就设定好的,直接调用它们同样不会有任何问题。& & 动作
& && &&&触发器 - 为 (xx触发) 添加事件: (单位 - 单位进入 (左下角为(xxx, xxx),右上角为(xxx, xxx)的矩形区域)) //新建了一个矩形区域
& && &&&触发器 - 为 (xx触发) 添加事件: (单位 - 单位进入 (可用地图区域)) //可用地图区域是游戏默认有的,无新建
& && &&&触发器 - 为 (xx触发) 添加事件: (单位 - 单位进入 矩形区域 000 &预设&) //引用变量,无新建
写触发时应尽量精简,让电脑以最少的步骤达到效果。。。
需要额外提的是条件。
在触发中条件的执行效率比动作高很多(当然不是指动作中的if语句),所以多多在条件中判断吧~引用:
而对于GUI T使用者,由于T功能的限制,无法做到以上所说;但同样也应该注意以下平时的写法:条件限制尽量写完整,为的是能更少的触发不必要的动作。甚至对于以下两种方案的触发写法,我们也应该选择1而不是2。因为2要在很多不必要的时候触发动作的运行。
条件:A成立 or B成立
动作:if A成立则做动作XXX
& && &&&else 做动作XXXTrg2:
动作:if A成立则做动作XXX
& && &&&else B成立则做动作XXX对于单位组也是一样的,在选取单位组的时候就应当把无关单位排除出去,而不是在作动作时再判断。
选取单位组和对单位组作动作都会扫一遍所有单位,早早在选取单位组时就精简单位显然能减少对单位组作动作的负担。
也大可不必把排泄看得太重,主要还是看自己触发写的安逸。处处追求完美会使触发变得麻烦复杂,作者自己也倍受压抑。。。或许也是为什么高手通常不作图,一作几个月,而一般新手几天就完成一张图的原因之一吧~对自己要求太苛刻了。
根据资料,3个点的泄漏还不到1kb,100万点也才不过300mb,比起现在以G计数的电脑内存实在不足为虑~况且一张图泄10来万个点已经是很辉煌的战绩,100万是只存于测试中的数据了。
测试中注册50万个事件(只是事件)才有跳出延迟的感觉,可见即使用现在不为大家所认可的每个单位一个事件动态注册也没什么大不了。
与其费心关注1、2个点、组而另写语句传递数据不如多想办法在地图上减几个单位、物品、投射物来得直接。。。
太频繁而又不费力的泄漏还是要好好排~减少内存负荷,跳出延迟,而且某类数据堆多了是会影响对其操作效率的。。。CPU寻址麻烦才是泄漏的主要危害。
很多时候我们的地图会莫明其妙的掉线,掉线的原因多种多样,但通常它也并不是那么无迹可寻。有时是网络连接的不稳定,是我们无法控制与避免的,不需要管,也管不了。重点在于触发的写法~
本地玩家的意思是的电脑当前的玩家。对于玩家1返回的是玩家1,玩家2返回的是玩家2。。。
没学好语文~看下面的触发好了:
& && &&&时间 - 游戏开始 0.00 秒
& && &&&游戏 - 对 (本地玩家) 在屏幕位移(0.00,0.00)处显示文本: (转换 ((本地玩家) 的玩家索引号) 为字符串)
如果联网测试,就会发现玩家1的屏幕上显示的是1,而玩家2的屏幕上显示的却是2。。。
有的动作必需对所有玩家起作用,利用本地玩家,我们就可以做到对单个玩家作动作。
如可以在不同玩家机器上,对变量赋不同的值;单独显示文本,对不同玩家机器显示不同的信息;只对一个玩家创建漂浮文字;只对一个玩家创建闪电效果、特效,声音,图片,多面版,任务等非实质性数据
& && &&&时间 - 游戏开始 0.00 秒
& && &&&如果所有条件成立则做动作1,否则做动作2
& && && && &If - 条件
& && && && && & (本地玩家) 等于 玩家1(红色)
& && && && &Then - 动作
& && && && && & 多面板 - 设置 xx多面板 显示
& && && && &Else - 动作
那么就只有玩家一面前会显示多面板。因为只有玩家一能满足条件,对于其它玩家都不会响应动作。
但滥用本地玩家的后果也显而易见,联网中玩家的每一次动作,改变都要经过其他玩家的确认,同步,像多面板一类独立固定的东西不会连带错误,但给单独一个玩家创建单位,传到其他玩家处发现根本没有这个单位,当掉也是正常了。
还是尽量不要只对单玩家创建东西,虽然有时不会导致直接掉线,但也是一种隐患,会使数据在内存中的排号不一样,进而混乱
我们在给一个单独玩家创建特效时宁愿再给其他玩家分别创建一个空特效占位也不要使其不一致。。。其他类型数据也一样。
当然仅仅显示多面板之类是没有创建东西的。
等待这个动作的精度效率都比较低下~使用它也是会影响稳定的。使用等待在玩家间会随机出现误差,使数据不同步,达到一定程度就造成了掉线。循环动作中的等待因为连续而更容易使玩家掉线。
大家应当尽量少使用等待而改用其他以避免被其低效雷到。
计时器远比等待高效,低要求使用等待,高要求使用计时器,1秒时间以下一般不要用等待,等待的精度是0.125秒。
计时器在触发中使用不太方便,但是否有一些能或多或少代替等待的东西~
等待游戏时间的实质就是多个等待,各方面都比等待还要烂,应予遗弃。
等待直到条件成立:同等待游戏时间
播放消息:其实也是等待...
.....................................................................................................
我只知道一种方法...
单位计时:以单位的死亡引出动作:
当需要计时作动作时,创建一个隐藏马甲单位,生命恢复-1,生命上限10000,然后想要订多久就设置最后创建的单位生命为多少...
捕捉这种类型的单位死亡事件来作动作...
最可贵的是,单位有自定义值这个东西来保存各种数据...
当然。。。耗用的内存是比较多的。。。
曾经想过事件流...注册时间事件来计时...不过后来发现堆起来很可怕......
有些时候,诡异的掉线其问题在于导入的图标,模型等。
其原因有可能是资源自身的问题,也可能是导入的错误,或处理资源时对资源的损坏。。。
在使用前最好先把图标图片模型导进新建的图测试,没问题再用。
MS玩家电脑中的画质调高可以有效的避免这类问题。难道还牵扯了魔兽的运算方式。。。?对于连图标都不会导入的我是显然不能理解的饿~
此外,获取镜头,设置游戏速度,获取Z坐标及数据错乱(如给单位烧属性书),死循环(如单位接受伤害-命令伤害来源对触发单位造成xx伤害)等语句都容易跳错,这些很容易查觉,不单独说明了。。。
点的Z坐标是与地层高度,波动及装饰物等相关的,而每个玩家间对特效的显示要求不同,牛头放个战争践踏,有的玩家设置高,该玩家的电脑上就出现了地形波动,设置低的玩家则不会有,此时如果捕捉技能点的Z轴高度就会因玩家间不一致而掉线。ms这是唯一比较说的过去的解释。。。
据说随机数(骰子)过大也有影响,具体不清楚。。。不过没有几十万估计不可能了。。。
全局变量数组在T中是很实际的运用,而利用它的搭配记录,在很大一定程度上可以实现看起来是jass的功能。
首先~来简单说说关于全局变量数组的设置:
全局数组的数组大小选项不用理会,不管设置多少,实际的可用大小都是数组的最大值-8192(鱼。。。记不清了不知道是多少),超过则无效。但也是有特例的~~单位组,玩家组,计时器,对话框(饿。。。同样记不住了)这几类变量需要正确设置好数组大小,要么不能用的。
为什么有几类变量必需设置数组大小?
新建整数变量数组a,数组大小不管(就是默认,为1),但把默认值设为5。
& && &&&时间 - 游戏开始 0.00 秒
& && &&&For循环整数A从 0 到 4, 做动作
& && && && &Loop - 动作
& && && && && & 游戏 - 对 玩家1(红色) 在屏幕位移(0.00,0.00)处显示文本: (转换 a[循环整数A [R]] 为字符串)
进入游戏看看结果~
屏幕显示5,5,0,0,0
然后回到WE,把数组大小改为3,再次测试:
屏幕显示5,5,5,5,0
很好理解了吧~恩~数组大小其实是赋上初始值的数组成员的个数。
看看计时器变量的初始值~新建计时器~可见这几类变量数组超过数组大小部分并不是没有,而是没有被赋上初值所以不能直接操作。
那么我们就可以人为的控制变量了
变量数组最基本的例子之一复活英雄:
变量:fuhuo:计时器变量数组
fuhuochuang:计时器窗口变量数组(和计时器对应)
& && &&&时间 - 游戏开始 0.00 秒
& && &&&For循环整数A从 1 到 8, 做动作
& && && && &Loop - 动作
& && && && && & 触发器 - 为 未命名触发器 003 &预设& 添加事件: (时间 - fuhuo[循环整数A [R]] 到期)
& && && && && & 计时器 - 为 fuhuo[循环整数A [R]] 创建计时器窗口,使用标题: 英雄复活倒计...
& && && && && & 设置 fuhuochuang[循环整数A [R]] = 最后创建的计时器窗口 [R]
& && && && && & 计时器 - 设置 fuhuochuang[循环整数A [R]] 的状态为隐藏
& && &&&单位 - 任意单位 死亡
& && &&&((触发单位) 是 英雄) 等于 TRUE
& && &&&((触发玩家) 的玩家索引号) 小于或等于 8
& && &&&计时器 - 开启 fuhuo[((触发玩家) 的玩家索引号)] ,计时方式: 一次性 时间设置: 30.00 秒
& && &&&计时器 - 设置 fuhuochuang[((触发玩家) 的玩家索引号)] 的状态为显示
& && &&&For循环整数A从 1 到 8, 做动作
& && && && &Loop - 动作
& && && && && & 如果所有条件成立则做动作1,否则做动作2
& && && && && && &&&If - 条件
& && && && && && && && &(到期的计时器) 等于 fuhuo[循环整数A [R]]
& && && && && && &&&Then - 动作
& && && && && && && && &英雄 - 立即复活 hero[循环整数A [R]] 在 ((可用地图区域) 的中心点) , 显示 复活动画
& && && && && && && && &计时器 - 设置 fuhuochuang[循环整数A [R]] 的状态为隐藏
& && && && && && &&&Else - 动作
为防止多个英雄死亡时一个计时器的冲突,fuhuo变量数组为每个玩家创建了一个计时器,一一对应以正常运行。
以上差不多就是这种运用的基本理念了。
但通常我们只为英雄创出复活等功能,而每个玩家一般也只会有一个英雄,因此我们可以轻松的利用玩家索引号使玩家,英雄,计时器相互调用。而有时候,我们却需要更广泛的应用。
这里我们需要一个记录任意单位杀敌数的触发。
最简单的是用每个单位的自定义值记录,杀死敌人时令自定义值+1,需要时读取自定义值就可以得到杀敌数。
& && &&&单位 - 任意单位 死亡
& && &&&单位 - 设置 (凶手单位) 的自定义值为 (((凶手单位) 的自定义值) + 1)
& && &&&玩家 - 玩家1(红色) 选择 一个单位
& && &&&游戏 - 对 玩家1(红色) 在屏幕位移(0.00,0.00)处显示文本: (单位杀敌数: + (转换 ((触发单位) 的自定义值) 为字符串))
不过呢~一个杀敌数固然可以直接用自定义值记录,如果还有饥饿值,疲劳度,忠诚度等一片数据,单单一个自定义值就显得比较弱了。
这里所用的方法,也需要自定义值,但自定义值所能代表的就不止是一个整数了。
以杀敌数为例,我们看看全局变量数组最基础的设置方法:
shu:整数变量,记录单位共编号数
shadishu:整数变量数组,记录杀敌数
& && &&&单位 - 单位进入 (可用地图区域)
& && &&&设置 shu = (shu + 1)
& && &&&单位 - 设置 (触发单位) 的自定义值为 shu
& && &&&单位 - 任意单位 死亡
& && &&&//增加凶手单位的杀敌数记录
& && &&&设置 shadishu[((凶手单位) 的自定义值)] = (shadishu[((凶手单位) 的自定义值)] + 1)
& && &&&玩家 - 玩家1(红色) 选择 一个单位
& && &&&游戏 - 对 玩家1(红色) 在屏幕位移(0.00,0.00)处显示文本: (单位杀敌数: + (转换 shadishu[((触发单位) 的自定义值)] 为字符串))
给出现的单位编号并存在自定义值里,通过编号找到对应的shadishu里保存杀敌数的地方。
应该很容易理解吧~不多解释了。
上面的触发是最原始粗糙的,所以实用起来是会有问题的。要知道,游戏中的单位是不段变化的,这个死了,那个又被创建出来,但这个触发中shu的值只加不减,如果超过8129,那么单位死亡,设置 shadishu[((触发单位) 的自定义值)] = (shadishu[((触发单位) 的自定义值)] + 1) 这句就是无效的。
所以我们要对没有用了的位置及时清空,再装新的数据(葱头:13)
我们可以在记录中用循环判断哪一个编号是没人用的:
shu:整数变量,记录单位共编号数
shadishu:整数变量数组,记录杀敌数
& && &&&单位 - 单位进入 (可用地图区域)
& && &&&For循环整数A从 1 到 shu, 做动作
& && && && &Loop - 动作
& && && && && & 如果所有条件成立则做动作1,否则做动作2
& && && && && && &&&If - 条件
& && && && && && && && &//如果shadishu[循环整数A]是空地方
& && && && && && && && &shadishu[循环整数A [R]] 等于 -1
& && && && && && &&&Then - 动作
& && && && && && && && &单位 - 设置 (触发单位) 的自定义值为 循环整数A [R]
& && && && && && && && & //表示这个位置已经被占了
& && && && && && && && &设置 shadishu[循环整数A [R]] = 0
& && && && && && && && &//不再执行最后的动作了
& && && && && && && && &自定义代码: 退出当前循环 [R]
& && && && && && &&&Else - 动作
& && &&&//如果从1到shu都没有空位,就加1个了~
& && &&&设置 shu = (shu + 1)
& && &&&单位 - 设置 (触发单位) 的自定义值为 shu
& && &&&单位 - 任意单位 死亡
& && &&&//增加凶手单位的杀敌数记录
& && &&&设置 shadishu[((凶手单位) 的自定义值)] = (shadishu[((凶手单位) 的自定义值)] + 1)
& && &&&//-1表示这里是空的地方,可以做新创建出来的单位的编号
& && &&&设置 shadishu[((触发单位) 的自定义值)] = -1
& && &&&玩家 - 玩家1(红色) 选择 一个单位
& && &&&游戏 - 对 玩家1(红色) 在屏幕位移(0.00,0.00)处显示文本: (单位杀敌数: + (转换 shadishu[((触发单位) 的自定义值)] 为字符串))
用随机数的循环次数或许会更少:
shadishu:整数变量数组,记录杀敌数
i2:整数变量,临时变量 //[~i~]素斜体符号。。。所以用i2
& && &&&单位 - 单位进入 (可用地图区域)
& && &&&For循环整数A从 1 到 5000, 做动作
& && && && &Loop - 动作
& && && && && & 设置 i = (随机整数,最小值: 1 最大值: 8192)
& && && && && & 如果所有条件成立则做动作1,否则做动作2
& && && && && && &&&If - 条件
& && && && && && && && &//如果shadishu[i2]是空地方
& && && && && && && && &shadishu[i2] 等于 -1
& && && && && && &&&Then - 动作
& && && && && && && && &单位 - 设置 (触发单位) 的自定义值为 i
& && && && && && && && &//表示这个位置已经被占了
& && && && && && && && &设置 shadishu[i2] = 0
& && && && && && && && &//不再执行后面的循环了
& && && && && && && && &自定义代码: 退出当前循环 [R]
& && && && && && &&&Else - 动作
因为如果依次循环的话不知道要循环几次,而随机数0-8129如果以正常的有800个单位在地图上算,第一次就有90%几率找到空位
相对复杂的方法:
shu:整数变量,记录地图上一共有多少个单位
danwei:单位变量数组,danwei[单位A自定义值]=单位A
shadishu:整数变量数组,记录杀敌数的东西
daji:整数变量数组,记录受打击数
[重点:shadishu[某数]所代表的就是danwei[某数]的杀敌数!且这个单位的自定义值就是这个某数(单位的编号)]
& && &&&单位 - 单位进入 (可用地图区域)
& && &&&设置 shu = (shu + 1)
& && &&&单位 - 设置 (触发单位) 的自定义值为 shu
& && &&&设置 danwei[shu] = (触发单位)
& && &&&单位 - 任意单位 死亡
& && &&&//增加凶手单位的杀敌数记录
& && &&&设置 shadishu[((凶手单位) 的自定义值)] = (shadishu[((凶手单位) 的自定义值)] + 1)
& && &&&//清理死亡单位的杀敌数数据
& && &&&//把最后的单位编号换成死亡单位编号,原最后的单位编号清除
& && &&&设置 shadishu[((触发单位) 的自定义值)] = shadishu[shu]
& && &&&设置 shadishu[shu] = 0
& && &&&设置 daji[((触发单位) 的自定义值)] = daji[shu]
& && &&&设置 daji[shu] = 0
& && &&&单位 - 设置 danwei[shu] 的自定义值为 ((触发单位) 的自定义值)
& && &&&设置 danwei[((触发单位) 的自定义值)] = danwei[shu]
& && &&&玩家 - 玩家1(红色) 选择 一个单位
& && &&&游戏 - 对 玩家1(红色) 在屏幕位移(0.00,0.00)处显示文本: (单位杀敌数: + (转换 shadishu[((触发单位) 的自定义值)] 为字符串))
& && &&&游戏 - 对 玩家1(红色) 在屏幕位移(0.00,0.00)处显示文本: (单位受打击数: + (转换 daji[((触发单位) 的自定义值)] 为字符串))
& && &&&单位 - 任意单位 被攻击
& && &&&设置 daji[((触发单位) 的自定义值)] = (daji[((触发单位) 的自定义值)] + 1)
具体用那种方法就看即时需要了。
在此基础上可以增加更多东西。
比如记录受打击值:单位受到攻击的总次数(好无聊。。。),可以刮开上面触发中被我设成白字的部分看看- -,另几种方法也可以依此操作。
这就是把杀敌数绑定在了单位身上。当然其他各种类型也都可以依此绑定在单位上。
还有一个万能循环的。。。优点是不用自定义值。。。不过东西多了以后这个效率就。。。
shu:整数变量,记录单位共编号数
danwei:单位变量数组
shadishu:整数变量数组,记录杀敌数
& && &&&单位 - 单位进入 (可用地图区域)
& && &&&For循环整数A从 1 到 shu, 做动作
& && && && &Loop - 动作
& && && && && & 如果所有条件成立则做动作1,否则做动作2
& && && && && && &&&If - 条件
& && && && && && && && &//如果shadishu[循环整数A]是空地方
& && && && && && && && &//不用danwei[循环整数A [R]]是否为无判断,因为整数判断的效率比较高
& && && && && && && && &shadishu[循环整数A [R]] 等于 -1
& && && && && && &&&Then - 动作
& && && && && && && && &单位 - 设置 (触发单位) 的自定义值为 循环整数A [R]
& && && && && && && && & //表示这个位置已经被占了
& && && && && && && && &设置 shadishu[循环整数A [R]] = 0
& && && && && && && && &//不再执行最后的动作了
& && && && && && && && &自定义代码: 退出当前循环 [R]
& && && && && && &&&Else - 动作
& && &&&//如果从1到shu都没有空位,就加1个了~
& && &&&设置 shu = (shu + 1)
& && &&&单位 - 设置 (触发单位) 的自定义值为 shu
& && &&&单位 - 任意单位 死亡
& && &&&For循环整数A从 1 到 shu, 做动作
& && && && &Loop - 动作
& && && && && & 如果所有条件成立则做动作1,否则做动作2
& && && && && && &&&If - 条件
& && && && && && && && &danwei[循环整数A [R]] 等于 (触发单位)
& && && && && && &&&Then - 动作
& && && && && && && && &设置 shadishu[循环整数A [R]] = -1
& && && && && && &&&Else - 动作
& && && && && && && && &如果所有条件成立则做动作1,否则做动作2
& && && && && && && && && & If - 条件
& && && && && && && && && && &&&danwei[循环整数A [R]] 等于 (凶手单位)
& && && && && && && && && & Then - 动作
& && && && && && && && && && &&&设置 shadishu[循环整数A [R]] = (shadishu[循环整数A [R]] + 1)
& && && && && && && && && & Else - 动作
& && &&&玩家 - 玩家1(红色) 选择 一个单位
& && &&&游戏 - 对 玩家1(红色) 在屏幕位移(0.00,0.00)处显示文本: (单位杀敌数: + (转换 shadishu[((触发单位) 的自定义值)] 为字符串))
另一种实例,如变量比较多而容易理解的野怪定点复活:
shu:整数变量,记录单位共编号数
danwei:单位变量数组
dingdian:点变量数组,记录单位位置
dingdianlx:单位类型变量数组,记录单位类型
& && &&&时间 - 游戏开始 0.00 秒
& && &&&单位组 - 选取 ((可用地图区域) 内属于 中立敌对 的所有单位) 内所有单位做动作
& && && && &Loop - 动作
& && && && && & 设置 danwei[i2] = (选取单位)
& && && && && & 设置 dingdian[i2] = ((选取单位) 的位置)
& && && && && & 设置 dingdianlx[i2] = ((选取单位) 的类型)
& && && && && & 设置 i2 = (i2 + 1)
& && &&&单位 - 中立敌对 的单位 死亡
& && &&&For循环整数A从 0 到 1000, 做动作
& && && && &Loop - 动作
& && && && && & 如果所有条件成立则做动作1,否则做动作2
& && && && && && &&&If - 条件
& && && && && && && && &(触发单位) 等于 danwei[循环整数A [R]]
& && && && && && &&&Then - 动作
& && && && && && && && &单位 - 命令 (触发单位) 对 沙包 0000 &预设& 造成 (转换 循环整数A [R] 为实数) 点伤害(不是 攻击伤害, 不是远程攻击) 攻击类型: 法术 伤害类型: 火焰 装甲类型: 无
& && && && && && && && &自定义代码: 退出当前循环 [R]
& && && && && && &&&Else - 动作
& && &&&单位 - 沙包 0000 &预设& 接受伤害
& && &&&等待 30.00 秒
& && &&&设置 i2 = (转换 (单位所受伤害) 为整数)
& && &&&设置 danwei[i2] = (新建 中立敌对 的 dingdianlx[i2] 在 dingdian[i2] 面向角度:0.00 度)
//沙包设置:生命10000,回血10000。。。
计时器可以这么用。。。
tm:计时器变量数组 //数组大小1000
panduan:整数变量数组
tmb:布尔变量数组,记录计时器是否运行中,比判断剩余时间效率应比较高
& && &&&时间 - 游戏开始 0.00 秒
& && &&&For循环整数A从 1 到 1000, 做动作
& && && && &Loop - 动作
& && && && && & 触发器 - 为 未命名触发器 2 &预设& 添加事件: (时间 - tm[循环整数A [R]] 到期)
未命名触发器 2
& && &&&For循环整数A从 1 到 1000, 做动作
& && && && &Loop - 动作
& && && && && & 如果所有条件成立则做动作1,否则做动作2
& && && && && && &&&If - 条件
& && && && && && && && &(到期的计时器) 等于 tm[循环整数A [R]]
& && && && && && &&&Then - 动作
& && && && && && && && &如果所有条件成立则做动作1,否则做动作2
& && && && && && && && && & If - 条件
& && && && && && && && && && &&&panduan[循环整数A [R]] 等于 0
& && && && && && && && && & Then - 动作
& && && && && & A动作//如果是一次性计时,记得设置tmb[循环整数A]=false
& && && && && && && && && & Else - 动作
& && && && && && && && && && &&&如果所有条件成立则做动作1,否则做动作2
& && && && && && && && && && && && &If - 条件
& && && && && && && && && && && && && & panduan[循环整数A [R]] 等于 1
& && && && && && && && && && && && &Then - 动作
& && && && && && && &B动作 //有需要时暂停计时器
& && && && && && && && && && && && &Else - 动作
& && && && && && && && && && && && && && && && &If - 条件。。。。。。。。。。。。
& && && && && && &&&Else - 动作
& & For循环整数A从 1 到 1000, 做动作
& && &&&Loop - 动作
& && && && &如果所有条件成立则做动作1,否则做动作2
& && && && && & If - 条件
& && && && && && &&&tmb[循环整数A [R]] 等于 FALSE
& && && && && & Then - 动作
& && && && && && &&&设置 panduan[循环整数A [R]] = 1/2/3。。。//要运行什么功能就设为几
& && && && && && &&&计时器 - 开启 tm[循环整数A [R]] ,计时方

我要回帖

更多关于 魔兽争霸3触发器任务 的文章

 

随机推荐