ou99孽缘 发表于 2011-9-18 14:40:33

关于地图的排泄问题详解下。。。

点的泄漏
点是最大的泄漏源.
某简略刷兵进攻触发如下:
    事件
      时间 - 每 2.00 秒触发事件
    条件
    动作
      单位 - 创建 1 个 步兵 给 玩家12(棕色) 在 (shuabingqu <预设> 的中心点) ,面向角度为 默认建筑朝向 度
      单位 - 对 (最后创建的单位 ) 发布 攻击移动 命令到目标点: (城堡 0000 <预设> 的位置)

    事件
      时间 - 每 5.00 秒触发事件
    条件
    动作
      单位 - 创建 1 个 牧师 给 玩家12(棕色) 在 (shuabingqu <预设> 的中心点) ,面向角度为 默认建筑朝向 度
      单位 - 对 (最后创建的单位 ) 发布 攻击移动 命令到目标点: (城堡 0000 <预设> 的位置)
      单位 - 创建 1 个 矮人火枪手 给 玩家12(棕色) 在 (shuabingqu <预设> 的中心点) ,面向角度为 默认建筑朝向 度
      单位 - 对 (最后创建的单位 ) 发布 攻击移动 命令到目标点: (城堡 0000 <预设> 的位置)

    事件
      时间 - 每 5.00 秒触发事件
    条件
    动作
      单位组 - 选取 (属于 玩家12(棕色) 的所有单位) 内所有单位做动作
            Loop - 动作
                单位 - 对 (选取单位) 发布 攻击移动 命令到目标点: (城堡 0000 <预设> 的位置)
//本触发是为防止怪物进攻途中受干扰而呆立或往回跑故每5秒重复命令。
计算一下点的个数:
      单位 - 创建 1 个 xx 给 玩家12(棕色) 在 (shuabingqu <预设> 的中心点) ,面向角度为 默认建筑朝向 度
这里创建了一个点在(shuabingqu <预设> 的中心点)

      单位 - 对 (最后创建的单位 ) 发布 攻击移动 命令到目标点: (城堡 0000 <预设> 的位置)
创建了一个点在 (城堡 0000 <预设> 的位置)

      单位组 - 选取 (属于 玩家12(棕色) 的所有单位) 内所有单位做动作
            Loop - 动作
                单位 - 对 (选取单位) 发布 攻击移动 命令到目标点: (城堡 0000 <预设> 的位置)
这个很可怕,每一次都会泄漏相当于玩家12所有单位数量的点~
照上面刷兵,如果玩家12的单位始终在15个,一个小时差不多就要泄漏1800+2880+10800=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 ,面向角度为 默认建筑朝向 度
      单位 - 对 最后创建的单位 发布 攻击移动 命令到目标点: dian2
      点 - 清除 dian1
      点 - 清除 dian2
用变量记录创建点,刷兵动作使用刚才记录的点变量,完毕后再用变量把创建的点删除,全程没有东西创建出来占内存,就达到了排泄的效果。

简化一点可以成为下面触发:
变量:dian1:点变量
    事件
      时间 - 每 2.00 秒触发事件
    条件
    动作
      设置 dian1 = (shuabingqu <预设> 的中心点)
      单位 - 创建 1 个 步兵 给 玩家12(棕色) 在 dian1 ,面向角度为 默认建筑朝向 度
      点 - 清除 dian1
      设置 dian1 = (城堡 0000 <预设> 的位置)
      单位 - 对 最后创建的单位 发布 攻击移动 命令到目标点: dian1
      点 - 清除 dian1
前后都只是一个变量,在操作上较为简洁。要记住的是每次设置变量后都要像上面的触发删除一次,而不能:
变量:dian1:点变量
    事件
      时间 - 每 2.00 秒触发事件
    条件
    动作
      设置 dian1 = (shuabingqu <预设> 的中心点)
      单位 - 创建 1 个 步兵 给 玩家12(棕色) 在 dian1 ,面向角度为 默认建筑朝向 度
      设置 dian1 = (城堡 0000 <预设> 的位置)
      单位 - 对 最后创建的单位 发布 攻击移动 命令到目标点: dian1
      点 - 清除 dian1
这样删除的只是最后创建的在(城堡 0000 <预设> 的位置)的点。


重复使用常用点
像以上的触发均用到(城堡 0000 <预设> 的位置)和(shuabingqu <预设> 的中心点)2个点,我们可以预先把可以多次利用的点用变量记录下来,然后直接套用以减少排泄的反复操作。

那么,上面的刷兵可以这样写:
变量:gudingdian:点变量数组
(gudingdian=固定点- -)
    事件
      地图初始化
    条件
    动作
      设置 gudingdian = (shuabingqu <预设> 的中心点)
      设置 gudingdian = (城堡 0000 <预设> 的位置)
      。。。。。。

    事件
      时间 - 每 2.00 秒触发事件
    条件
    动作
      单位 - 创建 1 个 步兵 给 玩家12(棕色) 在 gudingdian ,面向角度为 默认建筑朝向 度
      单位 - 对 最后创建的单位 发布 攻击移动 命令到目标点: gudingdian

    事件
      时间 - 每 5.00 秒触发事件
    条件
    动作
      单位 - 创建 1 个 牧师 给 玩家12(棕色) 在 gudingdian ,面向角度为 默认建筑朝向 度
      单位 - 对 最后创建的单位 发布 攻击移动 命令到目标点: gudingdian
      单位 - 创建 1 个 矮人火枪手 给 玩家12(棕色) 在 gudingdian ,面向角度为 默认建筑朝向 度
      单位 - 对 最后创建的单位 发布 攻击移动 命令到目标点: gudingdian

    事件
      时间 - 每 5.00 秒触发事件
    条件
    动作
      单位组 - 选取 (属于 玩家12(棕色) 的所有单位) 内所有单位做动作
            Loop - 动作
                单位 - 对 (选取单位) 发布 攻击移动 命令到目标点: gudingdian
恩~这才是正常的写法啊。直接读取变量点是不会新创建点的,避免了反复新建-删除的麻烦。
gudingdian和gudingdian在游戏中就不要再另作赋值了。

相关情况
单独不确定的点还是必需使用变量新建-删除法的。
如怪物掉宝:
设置掉宝的基本方法是这样:
    事件
      单位 - 任意单位 死亡
    条件
      ((触发单位) 的所有者) 等于 中立敌对
      (随机整数,最小值: 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
选取单位(玩家等类同)作动作=把下面的动作循环(选取的单位个数)次,选取单位分别为第一、二、三个单位...依此类推

benso001 发表于 2011-9-18 17:43:33

其实,这个东西看起来不难,关键是麻烦,看过很多破解图,绝大多数都没有去这样排泄,但是玩的时候也不是很卡啊?


比如:刷兵的时候,单位—创建 15 个 XX单位 在 XXXX区域的中心位置面向默认角度   前面没有设置点,后面也没有删除点,也就是没有排泄

benso001 发表于 2011-9-18 17:45:21

怪物死亡掉宝也木有设置点删除点的   
页: [1]
查看完整版本: 关于地图的排泄问题详解下。。。