找回密码
 点一下
查看: 1719|回复: 3

过滤函数个东西……

[复制链接]
发表于 2011-2-25 21:04:03 | 显示全部楼层 |阅读模式
过滤函数的效率应该是很高的才对,不然选取时就不用多此一举了
  1. function FilterHero takes nothing returns boolean
  2.         return IsUnitType(GetFilterUnit(), UNIT_TYPE_HERO)
  3. endfunction
  4. call TriggerRegisterPlayerUnitEvent( gg_trg_xx, Player(0), EVENT_PLAYER_UNIT_DEATH, Filter(function FilterHero))
复制代码


无论如何在英雄死亡的时候 都不会触发。
用debug显示 得到的GetFilterUnit()居然是凶手单位的名字,而在条件中触发单位就能正常指代死亡单位
用EVENT_PLAYER_UNIT_SPELL_FINISH事件没有任何问题,而用玩家死亡却不行,哪个单位死亡当然要过滤那个死亡的单位,怎么会指代 凶手呢?
逼我不得规规矩矩注册 条件和动作 这哪儿说理去呀?

有研究这方面的朋友吗?
发表于 2011-3-2 21:57:57 | 显示全部楼层
对过滤了解不是很透彻 下面是个人见解。

GetFilterUnit()..这个似乎会得到一些没用的单位 然后通过他的返回值过滤掉没用的
你输出 GetFilterUnit 的名字 当然可能是凶手单位了

你试试在动作里输出GetTriggerUnit的名字 看看是不是全死亡单位是英雄..如果是的话 说明你写的代码没有错误
回复

使用道具 举报

 楼主| 发表于 2011-3-3 00:16:38 | 显示全部楼层

回 1楼(zq8827213) 的帖子

代码当然没有错误
放到动作或者条件里 触发单位当然会是 死亡单位

下面又做了玩家单位 被攻击事件 测试
  1. function Trig_aaa_Conditions takes nothing returns boolean
  2.     call BJDebugMsg(GetUnitName(GetTriggerUnit()))
  3.     return false
  4. endfunction
  5. function Filteraa takes nothing returns boolean
  6.     call BJDebugMsg(GetUnitName(GetFilterUnit()))
  7.     return IsUnitType(GetFilterUnit(), UNIT_TYPE_HERO)
  8. endfunction
  9. //===========================================================================
  10. function InitTrig_aaa takes nothing returns nothing
  11.     set gg_trg_aaa = CreateTrigger(  )
  12.     call TriggerRegisterPlayerUnitEvent( gg_trg_aaa, Player(0), EVENT_PLAYER_UNIT_ATTACKED, Condition(function Filteraa))
  13.     call TriggerRegisterPlayerUnitEvent( gg_trg_aaa, Player(1), EVENT_PLAYER_UNIT_ATTACKED, Condition(function Filteraa))
  14.     call TriggerAddCondition( gg_trg_aaa, Condition(function Trig_aaa_Conditions) )
  15. endfunction
复制代码


只注册玩家2被攻击事件时显示如下: 攻击单位为 大法师


匹配是过滤作用,而最后的到的匹配单位应该==事件触发单位,
也就是死亡事件指代 死亡单位==触发单位 被攻击事件指代 被攻击单位==触发单位

用以上测试结果GetFilterUnit()永远指代相对的单位
而这样也是一样
  1. function Filteraa takes nothing returns boolean
  2.     if IsUnitType(GetFilterUnit(), UNIT_TYPE_HERO) then
  3.         set udg_u=GetFilterUnit()
  4.     else
  5.         set udg_u=GetFilterUnit()
  6.     endif
  7.     return true
  8. endfunction
复制代码

udg_u最终还是 攻击者
过滤函数没有将触发事件的一部分不符合单位过滤掉
说明过滤函数匹配单位的问题
回复

使用道具 举报

 楼主| 发表于 2011-3-3 00:20:34 | 显示全部楼层
甚至可以这么写了

玩家单位被英雄攻击的注册事件

既然指代攻击单位
用过滤函数写return IsUnitType(GetFilterUnit(), ConvertUnitType(0))
然后再将动作写成条件那么效率就会很高了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-4-27 22:29 , Processed in 0.083416 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表