魔兽地图编辑器 触发教程怎么样点成删除触发单位持有的XX,我点那个单位持有类型出来后不是默认触发单位。

查看: 8289|回复: 5
点排除教程
作图必学,不然地图内存不足 = =!
点击注册会员,更多精品好玩的地图等你来下载!
才可以下载或查看,没有帐号?
1.1基础概念
创建出东西就会占内存空间。
创建出的东西没用了还占着地方就变成了泄漏。
排泄就是随时将已经用不到的东西清理掉,以保证游戏畅通。
& && &&&时间 - 每 1.00 秒触发事件
& && &&&//shuabingqu=刷兵区
& && &&&单位 - 创建 1 个 步兵 给 玩家12(棕色) 在 (shuabingqu &预设& 的中心点) ,面向角度为 默认建筑朝向 度
这只是个普通的刷兵触发。。。但。。。
& && &&&单位 - 创建 1 个 步兵 给 玩家12(棕色) 在 (shuabingqu &预设& 的中心点) ,面向角度为 默认建筑朝向 度[/quote]
这个动作是创建单位在点,想创建单位必需有一个点以供创建,而不能直接给系统XX区域的中心,所以在运行到(shuabingqu &预设& 的中心)的时候系统会自动创建一个点以供其刷兵,这条动作可以分段理解成:
& && &&&点 - 创建一个点在(shuabingqu &预设& 的中心)
& && &&&单位 - 创建 1 个 步兵 给 玩家12(棕色) 在 (最后创建的点) ,面向角度为 默认建筑朝向 度
步兵正常的出来了,但系统自己创建的临时用点却没有被清除,它将会一直存于内存里什么也不干却白白占用内存空间。一张图里单位多了会卡,点也是一样,相对于单位,点的泄漏较小但更为隐蔽。而每次有新的东西建立,内存就需要分个空间来储存。不止是点,单位组,特效等很多东西都会在游戏中不知不觉的堆积。
可以看到我在 步兵 这里也标了红色,因为这个单位也是新创建的东西,他也占用了内存,但他不能算作泄漏,因为我们是需要这个单位的,没了这些单位游戏还怎么玩啊~泄漏是针对于无用的东西的,像上面的点,游戏需要的东西占用内存自然是天经地义。
而将泄漏置之不理将会空占内存,使电脑寻址困难,影响运算速度,游戏速度越来越慢(卡),影响玩家游戏进程,游戏结束后还需要占用玩家大量时间由电脑自行排除泄漏。
或许大家会觉得泄漏并不是什么值得一提的事,自己什么也没处理的地图在测试时跑了3、40分钟依然流畅的很,的确现在的机器不需要我们很精细的死抠内存了,但你可能也会注意到在弹出计分屏时的廷迟,而且还要考虑到联机情形,更何况WE本身就是一种很好的娱乐不是么^ ^
一般来说,动作下方的注释里对动作是否可能泄漏有提醒:会创建XXX,如果不确定是否泄漏可以参照查看下。
&&下载 (19.06 KB)
此外,加了R字头的原有动作一般能直达动作核心,提高效率简化操作,两个一样效果的动作最好养成使用[R]标识的习惯哦~
变量在我们的排泄中起了很重要的作用,如果还不熟悉变量的同学可以看看下面的连接:
【搁浅】变量教程
[原创]变量全解
写给新手的一点点自己的心得(附一些演示)
[教程] 再次写给新手的东西,有关变量(zxcf:板凳也可以看)
那么,我们怀着消遣的心态来排泄吧~
&==话说我对CPU和内存的概念不清。。。有时候都算进内存了。。。谅解。。。==&
1.2点排泄基础
点是最大的泄漏源.
某简略刷兵进攻触发如下:
& && &&&时间 - 每 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的单位始终在15个,一个小时差不多就要泄漏800=15280个点
由此可见排点的重要。
ps:在创建单位动作中点泄漏和单位个数无关,创建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
和开始一样,这里也是用变量记录点而后清除。这种变量的操作在一瞬间完成,不会持续影响变量的值,所以你可以除初始记录的点外都共用一、二个变量进行排泄。
ps:掉宝一般也可以使用:创建物品给英雄(死掉的敌人单位)动作,这当然也可以给单位,但由于敌人是死亡的,不管单位或英雄都无法得到物品,物品自然会掉在地上。
随机点也是一样操作~
变量: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 秒
当然,对于循环中没有设置点动作的触发自然不要在循环内清除。
ps:循环整数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
这就是刚刚排泄单位组的方法。
ps:注意选取的动作之内不能有等待一类的动作哦
排点的各类注意事项也大多能应用于单位组,这里不一一列推。
易误用动作
单位组 - 删除 最后创建的单位组 [R] 这条动作是完全与你新建的单位组无关的,不能用以排泄。
最后创建的单位组 [R] 是指最后一批通过创建单位动作创建出来的那些单位。
&&下载 (25.18 KB)
它的断句应该是:最后创建的单位_组,而不是:最后创建的_单位组,不要误用。
举例是王道。。。
& && &&&单位 - 创建 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] 会永远使最后创建的单位组[R]传回空,最好不要写~(也没必要写饿)
以上都是以R字头动作为准的,如果用原版动作是要删掉这个单位组的,因为原动作为防新人乱用,给你的单位组是复制版- -。。。
还有一个动作是 清空单位组。。。
这个的效果是把单位组里的单位都清出单位组。。。
但这个单位组本身还是存在的,只是里面没单位罢了,所以万万不能把他和删除单位组等同。。。
如玩家组也和单位组的处理大同小异(甚至更简单),而且使用频率也少得多,所以就不细说了。而选取物品、可破坏物之类则是把区域内一个个扫一遍,并没有一个专门的组的概念,所以根本没有东西创建,也不用排泄了。
关于玩家组,预设一栏都是不用也不能删除的,另外,所有玩家[旧] 也不必删除
ps:单位组,顾名思义就是数个单位的组合,你可以根据自己需要设定其中的单位进出,当你如下方式记录时:设置zu=XX圆心XX范围内符合XXX条件的单位 加入单位组的是里面的单位,而不是XX圆心XX范围内符合XXX条件的单位 这个判定的条件,即选取后XX圆心XX范围内再进入什么单位都与zu无关。
1.4特效,闪电,漂浮文字
创建特效后特效有时在播放完毕后会自行消失,似乎是自行清除了,但看不见的不代表不存在,实际上它依然存在于原来的地方,只是因为特效动画播完了变成透明,所以看上去没有任何问题,不过实际上依然会占用内存空间的,而且比点什么的体积大的多。
而建立在单位身上的特效,在单位死亡尸体腐烂后,就看不到了,但是和前面一样依然会占用空间。
一般的删除特效相比点与单位组实在太过简单了~
在大多数情况下,只需要创造出特效后立刻 删除 (最后创建的特效),虽然特效被立即删除,但还是会播放一遍特效动画,对于只播一次的特效,就可以马上删掉。
dian1:点变量
& && &&&单位 - 任意单位 发动技能效果
& && &&&(施放技能) 等于 刀阵旋风
& && &&&设置 dian1 = ((触发单位) 的位置)
& && &&&特殊效果 - 在 dian1 创建特效: Abilities\Spells\Human\ThunderClap\ThunderClapCaster.mdl
& && &&&点 - 清除 dian1
& && &&&特殊效果 - 删除 (最后创建的特效)
一些特效需要持续播放一段时间,可以针对相应的触发设置额外的特效变量记录后计时通过变量删除,注意控制好变量一定不要冲突,否则万一留下一两个光影在地图上一闪一闪就囧了。
ps:如果模型没有动作就是一次性特效,可以马上删除,如果看到有stand,attack之类动作就是要有持续时间的了。。。
对于一次性特效,很多时候你甚至可以:
& && &&&单位 - 任意单位 发动技能效果
& && &&&(施放技能) 等于 刀阵旋风
& && &&&特殊效果 - 删除 (新建特效 Abilities\Spells\Human\ThunderClap\ThunderClapCaster.mdl 在(((触发单位) 所在X轴坐标),((触发单位) 所在Y轴坐标))处)
用一个语句创建并删除,且无需用点。
这里所用到的坐标在第二篇会单独说的哦~
当然对于需要控制的特效最简单的是把马甲(或者技能)的模型设置成特效的样子。。。触发里想完美推荐这个
闪电效果的清除用 删除闪电效果 动作,具体操作与持续的特效相近~
闪电效果应该是算比较特殊的一类,当你创建闪电效果时如果这个闪电效果在某玩家的视野范围外则对于电脑前的此玩家而言这个闪电效果根本就不会创建,但其他视野范围内的玩家则会创建,也就是说闪电效果的创建对于玩家们而言是不同步的。。。我们可以利用这个特性作出部分反MH(开全图)的触发,原理是在一个不可能被玩家看见的地方创建一个闪电效果,如果能捕捉到闪电就可以判定为MH,具体就请去搜索了。
由于用触发创建闪电效果异常繁琐,而且清理不易,所以个人觉得对于没有特殊需要的,利用死亡之指技能改出需要的闪电再利用马甲释放这样比较方便应用。
ps:以前我在这说闪电也有数量限制,那是错的,我鱼妹,抱歉了
漂浮文字在游戏中最多不能存在超过100个,多了新建的漂浮文字会自动覆盖第100个的。
清除方式为:
& && &&&漂浮文字 - 创建漂浮文字: &zxcf& 在 dian1 ,Z轴高度: 0.00 ,字体大小: 10.00 ,颜色值:(100.00%, 100.00%, 100.00%) ,透明度: 0.00%
& && &&&漂浮文字 - 设置 (最后创建的漂浮文字) : 禁用 永久显示.//这点很重要
& && &&&漂浮文字 - 设置 (最后创建的漂浮文字) 的生命周期为 5.00 秒
或者也可以在适当时候
& && &&&漂浮文字 - 删除 (xxx) //一般来说,这个xxx是个变量。。。
排泄的前提是知道有泄漏,换言之,是有以后不会用到的东西被创建出来。有东西被创建才会消耗内存,当这个东西不再有用却依然存于游戏才有泄漏。在写触发时需要注意的是什么地方创建了东西而不会被清理。
整数、实数、布尔值:这3个是可以随便乱用的,不管用到多少都不会产生问题,所以能以这3种数据解决的东西就不必涉及其他了。
字符串被创建后无法删除,但一样的字符串不会额外占位,且其所占用的空间极其微小,没有上万条造不成感觉,在T里基本没多少用的地方,现在也可以归到上面3条之内。
ps:如设置a=&a&//创建一个字符串
设置b=&b&//创建一个字符串
设置c=(a+b)//创建一个字符串
设置d=&(d&+&e&)//创建三个字符串
设置e=(&a&+&b&)//不创建字符串,之前有用过
但我们也不必一见到其他的类型就想着删除,重要的是判断有没有废品需要清理。
泄漏需要的是有东西被创建再删除。像 (XXX区域的中心点)位置 新在(XXX区域的中心点)创建了点,但(触发单位)之类是原本就存于地图上的有用单位,排泄自然无从谈起。
面向角度,坐标,伤害,生命魔法一类数据是实数,技能、单位等级,包括单位、技能类型也都是整数,像这些都是不用理会的。
而所有玩家,可用地图区域等是固定的,在游戏初始化就设定好的,直接调用它们同样不会有任何问题。
(左下角为(xxx, xxx),右上角为(xxx, xxx)的矩形区域) //新建了一个矩形区域
(可用地图区域) //可用地图区域是游戏默认有的,无新建
矩形区域 000 &预设& //引用变量,无新建
额外解释两个看论坛出现的问题:
矩形区域的中心点也应该是固定的,那么中心点不是也该在初始化设定好了等着随便调用的吗?原因是,在游戏中途是可以新建或改变区域位置大小的,所以初始化设定就不适用了。
不过,玩家的开始点总是一直固定的了,为什么用它还会新建点?想必是暴雪因怕变故(我们乱玩)不想我们接触到开始点了。。。
写触发时应尽量精简,让电脑以最少的步骤达到效果。。。
其实需要提的是条件。
在触发中条件的执行效率比动作高很多(当然不是指动作中的if语句),所以多多在条件中判断吧~引用老狼经典帖:
而对于GUI T使用者,由于T功能的限制,无法做到以上所说;但同样也应该注意以下平时的写法:条件限制尽量写完整,为的是能更少的触发不必要的动作。甚至对于以下两种方案的触发写法,我们也应该选择1而不是2。因为2要在很多不必要的时候触发动作的运行。
条件:A成立 or B成立
动作:if A成立则做动作XXX
& && &&&else 做动作XXX
动作:if A成立则做动作XXX
& && &&&else B成立则做动作XXX
至于条件效率比较高的原因就是众说纷纭,难下定论了。。。
不过可不要一时大意在条件里出现 (触发单位) 的位置 这样的泄漏动作啦。
对于单位组也是一样的,在选取单位组时候的条件里就应当把无关单位排除出去,而不是在作动作时再判断。
选取单位组和对单位组作动作都会扫一遍所有单位,早早在选取单位组时就精简单位显然能减少对单位组作动作的负担。
无聊的后话
也大可不必把排泄看得太重,主要还是看自己触发写的安逸。处处追求完美会使触发变得麻烦复杂,作者自己也倍受压抑。。。或许也是为什么高手通常不作图,一作几个月,而一般新手几天就完成一张图的原因之一吧~对自己要求太苛刻了。
根据资料,3个点的泄漏还不到1kb,100万点也才不过300mb,比起现在以G计数的电脑内存实在不足为虑~况且一张图泄10来万个点已经是很辉煌的战绩,100万是只存于测试中的数据了。
测试中注册50万个事件(只是事件)才有跳出延迟的感觉,可见即使用现在不为大家所认可的每个单位一个事件动态注册也没什么大不了。
与其费心关注1、2个点、组而另写语句传递数据不如多想办法在地图上减几个单位、物品、投射物来得直接。。。
不过太频繁而又不费力的泄漏还是要好好排的~减少内存负荷,跳出延迟,而且某类数据堆多了是会影响对其操作效率的。。。CPU寻址麻烦才是泄漏的主要危害呢。
不要走极端就是了。。。
2.2触发数据
在一次触发中,有些数据是不变的,有些数据则会因为时间操作而变化。
我们用创建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] 发布 人族山丘之王 - 雷霆一击 命令
& && &&&点 - 清除 dian1
1秒后重新定义点。。。
不过这1秒内如果英雄移动了位置,雷霆一击释放的地方就有点不对了。。。
daozhendian:点变量
& && &&&单位 - 任意单位 发动技能效果
& && &&&(施放技能) 等于 刀阵旋风
& && &&&设置 daozhendian = ((触发单位) 的位置)
& && &&&单位 - 创建 1 个 刀阵旋风马甲 给 (触发玩家) 在 daozhendian ,面向角度为 默认建筑朝向 度
& && &&&单位 - 对 最后创建的单位 [R] 发布 燃烧军团阿克蒙德 - 混乱之雨 命令到目标点: daozhendian
& && &&&等待 1.00 秒
& && &&&单位 - 创建 1 个 刀阵旋风马甲 给 (触发玩家) 在 daozhendian ,面向角度为 默认建筑朝向 度
& && &&&单位 - 对 最后创建的单位 [R] 发布 人族山丘之王 - 雷霆一击 命令
& && &&&点 - 清除 daozhendian
用一个专门为刀阵旋风的点来记录位置。。。但仍不能支持多人多玩家使用。。。
至少这章。。。我是找不到一个完美的办法了。。。
不过如果你不介意建一个魔法释放点为1秒的马甲或是把马甲所释放的&雷霆一击&的释法时间改成1的话想实现它还是很简单的。
循环整数A和B其实也是全局变量,这也就是为什么循环整数A/B中等待会混乱的原因了。。。运行的时候如果循环整数已经被改变,下一轮判断时自然不准。。。所以暴雪为了嵌套循环而弄出来另一个功能一样的循环整数B而不是只用循环整数A。不过在等待的情况下这两个显然都是不能保证的,真的有需要的话,用额外的自定义变量吧~
单次触发内绑定数据
最后创建的单位 是一个全局变量,每次创建单位都被记录,所以不能用于有等待的单位传递,那么如下的触发又是否正确?
& && &&&单位 - 任意单位 死亡
& && &&&((触发玩家) 的玩家索引号) 小于或等于 8
& && &&&((触发单位) 是 英雄) 等于 TRUE
& && &&&等待 30.00 秒
& && &&&英雄 - 立即复活 (触发单位) 在 gudingdian[1] , 显示 复活动画 //gudingdian[1]是要复活的地方
有人可能回答错,其原因是:30秒后触发单位怎么还能捕捉到?即使可以得到触发单位,但这30秒里要是有人再死,触发单位还会是原来的触发单位?
这是可以的。
我们说最后创建的单位会随创建单位动作而改变,不能用于等待,因为当看到它的代码时会发现&最后创建的单位&是一个全局变量,任何一次创建单位的动作都会直接改变它的值。
而触发单位不同,它是在响应事件时直接绑定于触发的局部变量(资源?)(不知道这么说好不好- -,反正看作一个不需释放无法改变的局部变量就差不多),只作用于其所对应的单次触发,在每次触发响应中都是互不影响的值。如同在一个触发未运行完毕时又被触发,则2个一样语句的动作各行其事,互不干扰,这种变量也不会有任何改变。其它如被操作物品,触发玩家等也有一样的性质。
这种特性在一定程度上可以方便我们操作,甚至有时能代替局部变量的功能。
存于事件的数据
给我们的有关触发的数据中,还有一种类型的数据,如技能释放目标,命令发布点,发布命令等。他们是绑定在响应的事件上,如果这个事件被另一次响应,那么这些数据就会被更新(清除),注意是绑定在每个事件而不是触发,如果响应的事件不同是不会有影响的,总之如果没有确切的计划,用他们的情况下等待也是很危险的。
另技能释放目标,技能目标点比较特别,技能释放完毕后也会无法捕捉了。
2.3点续-坐标
其实一个点可以看作就是由X坐标与Y坐标2个实数组成的(Z坐标可以54)。
以坐标代替点是一个很好的提效方法,例如当一个区域仅仅是为了提供中心点刷兵时,完全可以将它舍去,这时触发由:
变量: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 度)
利用它,我们可以直接以坐标创建单位而不经过点的转折(物品,特效等也是)。
这样创建出来的单位无法通过 最后创建的单位 获取到,因为其实最后创建的单位本来也是一个全局变量,在创建单位在点的动作之中系统设置了最后创建的单位这个变量=创建的单位,而创建单位在坐标却省了中间环节,所以无法被最后创建的单位捕捉~~具体应用中还需多加考量。
ps:用放置单位池单位也无法用最后创建的单位捕捉的~而且更尴尬的是它甚至在触发中不能以 设置u=它 的形式出现。。。
我们可以这么刷兵:
& && &&&时间 - 每 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坐标效率远胜于移动单位到点,点不一定非得设置-删除而可以移动一个点到坐标。。。大家在应用中多多留意吧。。。
当然有些点是不可直接替代的,如: 单位 - 对 (新建 玩家1(红色) 的 步兵 在 (技能施放点) 面向角度:0.00 度) 发布 人族步兵 - 激活防御 命令 这句动作就怎么也无法省去点的操作,因为我们不能直接获得 (技能释放点) 的坐标。
如果写: 单位 - 对 (新建 玩家1(红色) 的 步兵 在(((技能施放点) 的X轴坐标),((技能施放点) 的Y轴坐标)),面向角度:0.00 度) 发布 人族步兵 - 激活防御 命令 结果将是泄漏2个点- -
大家都知道,用极坐标位移点是很麻烦的,因为只有它会泄露两个点,在清理中造成了极大的不便。
在坐标中又应该怎么代替这个鱼妹的动作呢?
& & 单位 - 立即移动 (触发单位) 到 (从 ((触发单位) 的位置) 开始,距离 200.00 ,方向为 ((触发单位) 的面向角度) 度的位移处)
& & 单位 - 立即移动 (触发单位) 到(((触发单位) 所在X轴坐标) + (200.00 x (Cos((((触发单位) 的面向角度) x (3.14 / 180.00))))),((触发单位) 所在Y轴坐标) + (200.00 x (Sin((((触发单位) 的面向角度) x (3.14 / 180.00))))))
& & 单位 - 设置 (触发单位) 的X坐标为 (((触发单位) 所在X轴坐标) + (200.00 x (Cos((((触发单位) 的面向角度) x (3.14 / 180.00))))))
& & 单位 - 设置 (触发单位) 的Y坐标为 (((触发单位) 所在Y轴坐标) + (200.00 x (Sin((((触发单位) 的面向角度) x (3.14 / 180.00))))))
恩,就是三角函数~算法方面不解释了(其实是我不懂算法原理。。。)
其中最后一种方法的效率是最高的,而且移动时不打断单位动作,无视障碍。
但也应该看情况调用。如果自己移动的要求比较符合第1或2项就没必要专门为了效率选择第3项。
还有用第3项进行长途移动的话有可能因为单次位移触发一些意料之外的事件。
2.4单位组续-bj_wantDestroyGroup
我们经常看见本来纯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的方法:
&&下载 (25.7 KB)
&&下载 (21.09 KB)
2.5单位,物品,可破坏物
单位在死亡后会形成尸体,尸体状态下依然可以捕捉单位的点、类型、自定义值等数据。。。
而在尸体消失的时候系统会自动清理该单位的相关数据,不用特别理会。
这里说的泄漏,大多指无用单位在地图上堆积过多,如创建马甲后未能及时清除,地图上暂时没用的怪物之类太多,敌方小兵刷得太多等。
几个或许需要注意的地方:
1.在刷怪时不要在同一时间段出现太多单位,单位本身加上命令、技能等耗用的空间并不小,而且尸体也是会占用很多内存的,尽量把单位个数在时间上分配均匀。
2.如果尸体确定充足的话可以在游戏平衡性常数中考虑减短尸体腐烂时间(一般尸体都不用留那么久的)。
3.单位(特别是普通的小怪)最好不要有光环、球体之类及华丽技能,一群小兵配上一圈圈光影是很恐怖的(系统光环判定也很烦),不只是为内存考虑。。。技能,攻击等的投射物也应尽管减少存在的量。还有单位(模型也都适用)的大小比例等。通常大家喜欢把BOSS的模型缩放设成数倍,显得强悍~实际这是会影响游戏进程的。
4.有时不用一些成堆的野怪放置在野怪区而是判断单位进入再临时刷,为了减少存在的单位数。
5.减少一点地图中预设置物体的初步设置,譬如:单位生命、魔法、等级、三围这些东西会增加地图读取时间的。不过如果真的这样设置比较方便也不必在乎这点。
6.英雄与一般单位不同,死后仍会保留信息以供复活什么,当英雄死亡后不准备再用时切记删除,像敌方的小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
这个方法应用上是可行的。
但纠缠须根可是有数十秒持续时间的,生存几十秒的马甲每秒创建一个。。。这个技能未免太花瓶了。。。
ps:为什么纠缠根须的马甲要活几十秒?因为纠缠根须要伤害敌人几十秒,如果被纠缠根须绕死而放纠缠根须的人找不到的话可是不给钱和经验的
& && &&&时间 - 游戏开始 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个触发很烦琐,实际上这么设置在多技能中是更方便直观的,而且如果改一改也方便多人使用,再想增加什么技能也很容易。
而且永久马甲可以作为一些东西的临时数据库及配合触发传递数据。。。
但用永久马甲施法时可要注意转身这个问题~单位的转身速度是有上限的,而指定目标的施法必须先要让施法者面对技能目标,这就会占用一点时间,所以不能短时间内连续让马甲放太多目标技能,否则很可能遗漏掉。
如果非要让马甲在极短时间内连续技能呢?
既然不能让马甲转身,我们就把他移到刚好面对技能目标的位置上,这样就可以直接放出技能了。。。
& & 单位 - 立即移动 (马甲) 到 (从 ((目标) 的位置) 开始,距离 100.00 ,方向为 (((马甲) 的面向角度) + 180.00) 度的位移处)
缺点是投射物
还有个很简便的方法(推荐饿~)。。。给马甲暗夜古树的扎根技能(留着不用释放),就可以无限制转身释放技能了。。。
当然,最常用马甲的还是类似下面的复合技能:
魔盾:给予目标一个能抵抗300点伤害的护盾,持续45秒 (反魔法外壳+灵魂锁链,英雄释放其中任意一个,马甲释放另一个)
双重刀阵旋风:放出两重刀阵旋风 (英雄释放刀阵旋风时移动马甲至英雄位置并同样命令释放刀阵旋风)
很久以前的一个演示,里面原地复活就是利用的永久马甲
怪物复活,攻击几率技能.w3x (17.63 KB) 下载次数: 1
物品被用掉后系统会自动删除,书一类会播放死亡动画,有很小的亮点在原位置,几秒后删除(这几秒内用触发把物品给英雄仍有效果- -囧。。。)。一般不用特意管理,最多也不过给玩家一个能清除物品的命令或设置物品在地上后几秒没人捡就删除罢了。也可参照一些单位的方法处理。
在地上没人捡xx秒后消失见计时器那一章
自定义的单位、物品、技能在操作中可能会有点卡,我们可以在游戏一开始时把所有单位物品都创建1个然后删除,当然预先在地图上放置进游戏再删除也一样。
具体原因不详,MS可以理解为当第一个xx出现在游戏时系统注册相关资料,卡的也就是他了- -
注意所创建删除的必需是游戏中出现的第一个该类型单位(物品),否则无效的。
可破坏物相比单位,物品占的内存少一些,游戏中也是有很普遍应用的~
可破坏物可以通过复活来刷新,最常见的就是树木重生了。
& && &&&地图初始化
& && &&&可破坏物 - 选取 (可用地图区域) 内所有可破坏物做动作
& && && && &Loop - 动作
& && && && && & 触发器 - 为 shumufuhuo &预设& 添加事件: (可破坏物 - (选取的可破坏物) 死亡) //用区域内死亡的事件有数量限制
shumufuhuo
& && &&&如果所有条件成立则做动作1,否则做动作2
& && && && &If - 条件
& && && && && & ((死亡的可破坏物) 的类型) 等于 夏季树木
& && && && &Then - 动作
& && && && && & 等待 30.00 秒
& && && && && & 可破坏物 - 复活 (死亡的可破坏物) 并设置生命值为 ((死亡的可破坏物) 的最大生命值) , 显示 复活动画
& && && && &Else - 动作
& && && && && & //如果嫌这样不好看的话也可以等待下
& && && && && & 可破坏物 - 删除 (死亡的可破坏物)
不同于单位物品,可破坏物死亡后数据不会自动清除,所以对于没用了的可破坏物一定要记得删除掉。
一个触发在游戏中同样会占用内存空间~这是无可置疑的。现在我们能作的只是把已经没有用处的触发清理一些。
关闭触发动作只是不再控制执行,但触发仍在占用内存。对不再使用的触发,用删除触发可以清理。确定已经不需要再用的触发就统统删除了吧。游戏初始化及游戏开始xx秒的触发就是很好的例子。
& && && &&&地图初始化
设置可见度
设置玩家X金钱为XX
//等等一堆动作后。。。
& && &&&触发器 - 删除 (当前触发)
下面是用触发的动态注册事件的例子:
dongtaizhuce
& && &&&时间 - 游戏开始 0.00 秒
& && &&&设置 zu = ((可用地图区域) 内的所有单位)
& && &&&单位组 - 选取 zu 内所有单位做动作
& && && && &Loop - 动作
& && && && && & 触发器 - 为 shanghai &预设& 添加事件: (单位 - (选取单位) 接受伤害)
& && &&&单位组 - 删除 zu
dongtaizhuce2
& && &&&单位 - 单位进入 (可用地图区域)
& && &&&触发器 - 为 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 添加事件: (单位 - (选取单位) 接受伤害)
& && &&&单位组 - 删除 zu
dongtaizhuce2
& && &&&单位 - 单位进入 (可用地图区域)
& && &&&触发器 - 为 zhucechufa 添加事件: (单位 - (触发单位) 接受伤害)
这就是假设游戏共20分钟的写法~依此类推~
使用分割所造成的泄漏就肯定已经在我们的接受范围内了。
初始化事件
我们在游戏开始时运行动作的触发分两种事件:
& && &&&时间 - 游戏开始 0.00 秒
& && && &&&地图初始化
其中,地图初始化是在读取地图时就开始执行的,如果你在地图初始化的触发里加入了播放声音的动作,那么在游戏读到70%左右时就可以听到了.这也就是他的弊端-如果在游戏初始化中加入大量动作的话,势必会增加读图的时间.,影响地图整体感官.
所以就有了把初始化的触发改成游戏开始 0.00 秒做动作的做法.但要在游戏开始 0.00 秒时执行这么大的工作量是很危险的,不止会在游戏开始时卡一下,也因此可能造成掉线情况.
因此我们将两个事件均匀调平,既不能把动作全部移到0.00秒才开始运行,也最好不要都放在初始化占读取时间,看动作流程必要性安排.
普遍流行的是,在游戏开始时进入电影模式,并播放文字:游戏初始化中(当然也可以是其他的掩人耳目的文字),在电影模式的几秒中之内分段执行预备的初始化函数.虽然在整体时间上未必比放在游戏初始化动作短,但给玩家的感觉是明显不一样的.
ps:进入矩形区域的事件:进入区域事件的函数里其实是用一个不规则区域来代替原来的矩形区域,注册的其实是进入这个不规则区域的事件,而不规则区域的基本单位大小是一个单元格大小,所以在添加矩形区域时就会扩大一些范围,导致不准确,要获取区域的话用不规则区域中的触发区域
3.1临时变量
临时变量的运用
这里所说的临时变量泛指一瞬间操作完毕的变量。
下为一开始基本排点的例子:
变量:dian1:点变量
& && &&&时间 - 每 2.00 秒触发事件
& && &&&设置 dian1 = (shuabingqu &预设& 的中心点)
& && &&&单位 - 创建 1 个 步兵 给 玩家1(红色) 在 dian1 ,面向角度为 默认建筑朝向 度
& && &&&点 - 清除 dian1
其中dian1起到了即时装载数据的作用,点并不如特效般有 最后创建的特效 可以直接引用,所以用dian1传递了创建的点。
而 最后创建的特效 其实也不过同 最后创建的单位 一样是全局变量,在创建特效的动作内部有设置最后创建的特效=新建特效xx。。。
玩家排泄时删除。。。与我们dian1的设置其实是相近的。
单位组的排泄也是同点一样瞬间记录后删除:
设置zu=XX内单位
选取zu内所有单位作动作-
。。。动作
临时变量可以在触发的传递中起很大作用。如果想把动作当成独立的模块使用,临时变量绝对是必不可少的。
还有就是类似下面的触发,一个数据改变后仍需要用到原来的值:
& && &&&单位 - 任意单位 获得物品
& && &&&((被操作物品) 的类型) 等于 升级长剑
& && &&&设置 i = (((触发单位) 所持有的 长剑) 的自定义值)
& && &&&物品 - 删除 ((触发单位) 所持有的 长剑)
& && &&&英雄 - 创建 升级了的长剑 给 (触发单位)
& && &&&物品 - 设置 最后创建的物品 [R] 的自定义值为 i
作用是升级后的长剑继承原长剑的自定义值,有什么作用么。。。要看游戏里的具体设置了汗~
死亡之指:对友军加血,敌人伤害,但无法直接杀死敌人,值为死亡之指等级*力量
& && &&&单位 - 任意单位 发动技能效果
& && &&&(施放技能) 等于 死亡之指
& && &&&如果所有条件成立则做动作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 点伤害(是 攻击伤害, 不是远程攻击) 攻击类型: 法术 伤害类型: 神圣 装甲类型: 无
临时变量的运用可以让编写触发变得更简单,也更具条理。
一些重视效率的Weer喜欢先把临时变量设置成触发单位,凶手单位等触发内可以直接获取的东西。道理也并不复杂~恩要获得触发单位,系统应该要先得到当前的触发器,翻出触发器里的数据,找到触发单位这一个才传回来(我猜的- -),无形中增加了很多操作,如果是伤害来源,目标等还要在触发单位的基础上再查找,效率上就显得弱了。。。而通过变量获取单位则快捷很多。
& && &&&单位 - 任意单位 被攻击
& && &&&设置 u = (触发单位)
& && &&&设置 u2 = (攻击单位)
& && &&&如果所有条件成立则做动作1,否则做动作2
& && && && &If - 条件
& && && && && & (u 的生命百分比) 小于或等于 20.00
& && && && && & ((u 的所有者) 的控制者) 等于 电脑
& && && && && & (u 是 (u2 的所有者) 的同盟单位) 等于 TRUE
& && && && &Then - 动作
& && && && && & 单位 - 杀死 u
& && && && &Else - 动作
& && && && && & 单位 - 对 u2 发布 停止 命令
& && && && && & 单位 - 立即移动 u2 到 gudingdian[5] //小黑屋
上例中触发单位用到4处,攻击单位用到3处,用变量记录会更高效。
具体情况还需看个人习惯操作。
像上面一系列运算那种类型的也可以起到提升效率的作用哦~
各类型用一、二个临时变量即可解决绝大部分问题,而不需要专门为某个技能或功能创出大片全局变量专用。而且也不用担心变量的冲突,因此用它是个好习惯呢。
临时全局变量的安全性虽说一般是可以保障的~但某些看似正常操作搭配也可能会导致其数据运行中途的变更,即混乱。这点不得不注意:
& && &&&时间 - 游戏开始 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 - 动作
所以呢~在作图中还是要注意变量的冲突的,把握好用变量的地方。
恩~找到个现成的题目哦:找出下面触发的问题所在^ ^
MH是5个设定好的单位,master是要触发事件的英雄
ps:个人临时变量命名的习惯是:
ua:单位变量数组(有些时候可能有要用到索引的地方)
u:单位变量
u2:单位变量
u3:单位变量
依此类推。。。
计时器这东西确实没什么可说的。。。
只是提醒一下。
有人喜欢写新建计时器和窗口等待x秒后删除最后创建的计时器~其实呢。。~看过2.1就明白的。。。如果30秒内还有计时器被创建。。。屏幕就汗了。。。整个游戏都混乱也不是不可能的。。。
我们需要工整地设置成这样:
变量: yxfh:计时器变量数组(注意计时器是要在一开始正确设置数组数的)
& && &yxfhck:计时器窗口变量数组
& && &&&单位 - 任意单位 死亡
& && &&&((触发玩家) 的玩家索引号) 小于或等于 8
& && &&&((触发单位) 是 英雄) 等于 TRUE
& && &&&计时器 - 开启 yxfh[((触发玩家) 的玩家索引号)] ,计时方式: 一次性 时间设置: 30.00 秒
& && &&&计时器 - 为 (最后启用的计时器) 创建计时器窗口,使用标题: 复活倒计时
& && &&&设置 yxfhck[((触发玩家) 的玩家索引号)] = 最后创建的计时器窗口 [R]
& && &&&计时器 - 设置 最后创建的计时器窗口 [R] 的状态为显示
& && &&&等待 30.00 秒
& && &&&英雄 - 立即复活 (触发单位) 在 gudingdian[1] , 显示 复活动画
& && &&&计时器 - 删除 yxfhck[((触发玩家) 的玩家索引号)]
当然用计时器到期事件是最好的。。。
在触发中使用计时器确实不方便~很多地方需要我们设计出特别的计时方法,及对计时器循环混杂的使用。
例子:物品掉落后如果30秒不捡就消失:
& && &&&时间 - 每 1.00 秒触发事件
& && &&&物品 - 选取 (可用地图区域) 内所有物品做动作
& && && && &Loop - 动作
& && && && && & 物品 - 设置 (选取物品) 的自定义值为 (((选取物品) 的自定义值) + 1)
& && && && && & 如果所有条件成立则做动作1,否则做动作2
& && && && && && &&&If - 条件
& && && && && && && && &((选取物品) 的自定义值) 等于 30
& && && && && && &&&Then - 动作
& && && && && && && && &物品 - 删除 (选取物品)
& && && && && && &&&Else - 动作
& && &&&单位 - 任意单位 获得物品
& && &&&物品 - 设置 (被操作物品) 的自定义值为 0
时间 - 每 xxx 秒触发事件 其实就相当于一个永远开启的计时器(效率差一丁点完全不影响),在写触发时比较方便(不要占变量表的位置好啊),但自定义计时器容易控制,具体用哪个还是要看情况需求。
计时器的精度是0.0001秒(用0秒计时和0.0001秒计时的效果是一样的,但计时器会有一点延迟的...其实就是0.01)
大家在作技能时需要连续够动单位之类可能用到了0.01秒的计时器(时间周期事件),事实上,这在一段时间内占用了较多的资源,1秒中执行100次动作,效率可想而知。人眼能感觉到画面流畅的速度是24祯(是这个字?),用0.04秒的计时器即可达到,考虑到速度的因素,一般0.03秒也足够了。
据测试说计时器是占用资源最少的物体。。。
而且在计时中途直接删除计时器而不暂停的话仍然会响应到期。。。
由此似乎可以猜测一点计时器与游戏时间流程的关系。。。
3.3简述掉线
很多时候我们的地图会莫明其妙的掉线,掉线的原因多种多样,但通常它也并不是那么无迹可寻。
有时是网络连接的不稳定,是我们无法控制与避免的,不需要管,也管不了。
重点在于触发的写法~
如果地图在读取的时候就掉,请检查有没有违规数据,优化方法,模型贴图错误,初始化触发。
如果不是读取,那么这才是接下来的内容。
本地玩家的意思是的电脑当前的玩家。对于玩家1返回的是玩家1,玩家2返回的是玩家2。。。
没学好语文啊~看下面的触发好了:
& && &&&时间 - 游戏开始 0.00 秒
& && &&&游戏 - 对 (本地玩家) 在屏幕位移(0.00,0.00)处显示文本: (转换 ((本地玩家) 的玩家索引号) 为字符串)
如果联网测试,就会发现玩家1的电脑屏幕上显示的是1,而玩家2的电脑屏幕上显示的却是2。。。
有的动作必需对所有玩家起作用,利用本地玩家,我们就可以做到只对单个玩家作动作。
如可以在不同玩家机器上,对变量赋不同的值;单独显示文本,对不同玩家机器显示不同的信息;只对一个玩家创建漂浮文字;只对一个玩家创建闪电效果、特效,声音,图片,多面版,任务,改变项目文本等非实质性数据
& && &&&时间 - 游戏开始 0.00 秒
& && &&&如果所有条件成立则做动作1,否则做动作2
& && && && &If - 条件
& && && && && & (本地玩家) 等于 玩家1(红色)
& && && && &Then - 动作
& && && && && & 多面板 - 设置 xx 多面板 显示
& && && && &Else - 动作
那么就只有扮演玩家一的电脑屏幕上会显示多面板。因为只有玩家一能满足条件,对于其它玩家都不会响应动作。
但滥用本地玩家的后果也显而易见,联网中玩家的每一次动作,改变都要经过其他玩家的确认,同步,像多面板一类独立固定不需要同步的东西不会连带错误,但给单独一个玩家创建单位,传到其他玩家处发现根本没有这个单位,当掉也是正常了。
尽量不要只对单玩家创建东西,虽然有时不会导致直接掉线,但也是一种隐患,会使数据在内存中的排号不一样(详见UnionBug章),进而引发混乱。
我们在给一个单独玩家创建特效时宁愿再给其他玩家分别创建一个空特效占位也不要使其不一致。。。其他类型数据也一样。
当然仅仅显示多面板之类是没有创建东西的。
等待这个动作的精度效率都比较低下~使用它也是会影响稳定的。使用等待在玩家间会随机出现误差,使数据不同步,达到一定程度就造成了掉线。循环动作中的等待因为连续而更容易使玩家掉线。
大家应当少频繁使用等待而改用其他以避免被其低效雷到。
计时器远比等待高效,低要求使用等待,高要求使用计时器,1秒时间以下一般不要用等待,等待的精度ms是0.125秒。
等待的效率低,但动作中那些有等待效果的其他动作又如何呢?
等待游戏时间的实质就是多个等待,各方面都比等待还要烂,应予遗弃。
等待直到条件成立:同等待游戏时间
播放消息:其实也是等待...
呃。。。其实还有个条件是有等待效果的,判断什么单位被玩家选择。。。不过依然和等待差不多,纯提醒罢了。
一个可行的方案是:
单位计时:以单位的死亡(也可以是施法,变身的廷时等)引出动作:
当需要计时作动作时,创建一个隐藏马甲单位,生命恢复-1,生命上限10000,然后想要订多久就设置最后创建的单位生命为多少,就可以自由操纵计时的时间...
捕捉这种类型的单位死亡事件来作动作...
最可贵的是,单位有自定义值这个东西来保存各种数据...
当然。。。耗用的内存是比较多的。。。
魔兽的联网运行方式是传递命令,各电脑独自演算。每个玩家在游戏中发布的任意命令(像是操作英雄放技能或者买东西之类的)都会通过网络传输给游戏中的其他玩家。但只会传递玩家的操作,而操作的结果则是在各玩家的电脑上分别进行推算的。
既然有传输就会出现误差不同步,很多麻烦的东西就是这么来的。
而一个玩家传递出去的操作也包含了他们自己的结果(这个不确定,但基本上这个结果应该属于这个命令是成功或失败(如买东西钱不够),命令之后有什么改变),传到其他玩家电脑上再一次判断命令结果并传回,如果其他玩家的结果和传出的结果不一样的话那个玩家就会掉了(为什么结果会不一样?就是做了不同步的事呗,以乱用本地玩家最普遍)。而如果迟迟得不到一个玩家命令回应的话,就说明网络断了,出现等待玩家的计时框。
所以能在本地玩家上用的也就是那些不需要其他玩家回应的动作。
有些时候,诡异的掉线其问题在于导入的图标,模型等。
其原因有可能是资源自身的问题,也可能是导入的错误,或处理资源时对资源的损坏。。。
在使用前最好先把图标图片模型导进新建的图测试,没问题再用。
MS玩家电脑中的画质调高可以有效的避免这类问题。难道还牵扯了魔兽的运算方式。。。?对于连图标都不会导入的我是显然不能理解的饿~
此外,获取当前镜头(正确做法是用本地玩家单独获取一个玩家的镜头),设置游戏速度,获取Z坐标及数据错乱(如给单位烧属性书),死循环(如单位接受伤害-命令伤害来源对触发单位造成xx伤害)等语句都容易跳错,这些很容易查觉,不单独说明了。。。
ps:点的Z坐标是与地层高度,波动及装饰物等相关的,而每个玩家间对特效的显示要求不同,牛头放个战争践踏,有的玩家设置高,该玩家的电脑上就出现了地形波动,设置低的玩家则不会有,此时如果捕捉技能范围内点的Z轴高度就会因玩家间不一致而掉线。ms这是唯一比较说的过去的解释。。。
据说随机数(骰子)过大也有影响,具体不清楚。。。不过没有几十万估计不可能了。。。
3.4变量数组应用
全局变量数组在T中是很强大的运用功能,而利用它的搭配记录,在很大一定程度上可以实现看起来是jass的绑定,储存功能。
全局变量数组的基本设置
创建变量数组时全局数组的数组大小选项不用理会,不管设置多少,实际的可用大小都是数组的最大值-8192(从0-8191),超过则无效。但也是有特例的~~单位组,玩家组,计时器,对话框(饿。。。记不住了)这几类变量需要正确设置好数组大小,要么是不能正常使用的。
为什么这几类变量必需设置数组大小呢?
我们可以做个测试:
新建整数变量数组a,数组大小不管(就是默认,为1),但把默认值设为5。
& && &&&时间 - 游戏开始 0.00 秒
& && &&&For循环整数A从 0 到 4, 做动作 //数组索引从0开始哦
& && && && &Loop - 动作
& && && && && & 游戏 - 对 玩家1(红色) 在屏幕位移(0.00,0.00)处显示文本: (转换 a[循环整数A [R]] 为字符串)
进入游戏看看结果~
屏幕显示5,5,0,0,0
然后回到WE,把数组大小改为3,再次测试:
屏幕显示5,5,5,5,0
很好理解了吧~恩~数组大小其实是赋上初始值的数组成员的个数。
看看计时器变量的默认初始值~新建计时器~,其他需要正确设置的也都是新建xxx,可见这几类变量数组超过数组大小部分并不是没有,而是没有被赋上初值所以不能直接被我们操作。
那么我们就可以人为的控制变量了。
变量数组最基本的例子之一复活英雄:
变量: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的值只加不减,如果超过8191,那么单位死亡,设置 shadishu[((触发单位) 的自定义值)] = (shadishu[((触发单位) 的自定义值)] + 1) 这句就是无效的。
所以我们要对没有用了的位置及时清空,再装新的数据
我们可以在记录中用循环判断哪一个编号是没人用的再补进去:
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[((触发单位) 的自定义值)] 为字符串))
不过用随机数的循环次数或许会更少:
& && &&&单位 - 单位进入 (可用地图区域)
& && &&&For循环整数A}

我要回帖

更多关于 魔兽争霸3地图编辑器 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信