|
发表于 2010-6-28 17:15:46
|
显示全部楼层
如果回答严格按照LZ的要求,那么看看问题吧,是“单位接近事件怎么捕捉被接近单位”,在响应事件符合要求的前提下给单位动态绑定“单位接近事件”并使用缓存或类似的方法将单位绑定于触发上才是最好的解决方法。
如果要抛开这个前提呢,可选择的方法也有很多,rex你推荐使用伤害系统,在我看来也只是你的个人习惯而已,试问现在哪个系统的使用方式还不算完善呢?要我做这个东西的话,我会选择计时器系统+两个单位组,这样不仅可以侦测到接近单位,远离单位也同样可以侦测到,而接近或远离的对象可以是某个单位也可以是一个圆形区域,在我看来,它才是比较好的一个方法。
[codes=jass]
globals
    group Jishiqi_group
    unit Jishiqi_unit
endglobals
function Jishiqi_xuanqu takes nothing returns boolean
    call GroupRemoveUnit( Jishiqi_group, GetFilterUnit() )
    return true
endfunction
function Jishiqi_daoqi takes nothing returns nothing
    local timer t=GetExpiredTimer()
    local string s=I2S(H2I(t))
    local unit u=I2U(GetStoredInteger(Huancun,s,"Unit"))
    local real x=GetUnitX(u)
    local real y=GetUnitY(u)
    local real r=GetStoredReal(Huancun,s,"Banjing")
    local group g1=I2G(GetStoredInteger(Huancun,s,"Group"))
    local group g2
    set g2=CreateGroup()
    set Jishiqi_group=g1
    set Jishiqi_unit=u
    call GroupEnumUnitsInRange(g2 ,x, y , r , Condition(function Jishiqi_xuanqu))
    //现在,g2中所包含的就是中心单位范围内的单位
    //g1中的就是远离中心单位的单位了
    call DestroyGroup(Jishiqi_group)
    call StoreInteger(Gem_newhero,s,"Group",G2I(g2))
    set g1=null
    set g2=null
    set u=null
    set t=null
endfunction
[/codes]
[codes=jass]
//如果要侦测接近事件,把选取函数做如下改动就可以了
function Jishiqi_xuanqu takes nothing returns boolean
    local unit u=GetFilterUnit()
    if(IsUnitInGroup(u ,Jishiqi_group))then
        call GroupRemoveUnit( Jishiqi_group, u )
    else
        //action
        //此时就侦测到了单位接近事件中的单位
    endif
    set u=null
    return true
endfunction
[/codes]
这个方法中带'Aloc'的技能是无法选取的,如果想附带更多的条件,只需要在函数Jishiqi_xuanqu里面调整就可以了。
当然,我也仅仅只是对这个方法比较熟悉而已。 |
|