找回密码
 点一下
查看: 1926|回复: 9

刚学JASS出了个BUG自己该不过来

[复制链接]
发表于 2009-12-30 20:10:58 | 显示全部楼层 |阅读模式
我就是做的普通攻击带击退的但是击退的速度越变越快,问题应该出在创建Timer上 就是每次攻击都新建一个Timer 绑定数据然后循环计时 运行触发 因为每次绑定的数据都一样 所以就出BUG了 所以谁帮忙看下怎么改 自己实在是想不出办法了
[jass]
function MachokeCond takes nothing returns boolean

    return ( UnitHasBuffBJ(GetAttacker(), 'B006') == true )

endfunction


function mach takes nothing returns nothing
   
   local timer Mact = GetExpiredTimer()

    local unit Macu = i2u(GetStoredInteger(udg_GG,"Mac",I2S(h2i(Mact))))

    local unit Macumb = i2u(GetStoredInteger(udg_GG,"Macmb",I2S(h2i(Mact))))

    local real MacAngle = Atan2BJ(( GetUnitY(Macumb) - GetUnitY(Macu) ), ( GetUnitX(Macumb) - GetUnitX(Macu) ))

    if ( GetUnitUserData(Macumb) < 10 ) then

    call SetUnitUserData( Macumb, ( GetUnitUserData(Macumb) + 1 ) )

    call DestroyEffect( AddSpecialEffectLoc("Abilities\\Weapons\\AncientProtectorMissile\\AncientProtectorMissile.mdl", Location(GetUnitX(Macumb),GetUnitY(Macumb))) )

    call SetUnitPosition( Macumb, (GetUnitX(Macumb)+((3*GetUnitUserData(Macumb))*CosBJ(MacAngle))), (GetUnitY(Macumb)+((5*GetUnitUserData(Macumb))*SinBJ(MacAngle)) ))

    elseif ( GetUnitUserData(Macumb) == 10 ) then

    call FlushStoredMission(udg_GG,"Macmb")

    call FlushStoredMission(udg_GG,"Mac")

    call DestroyTimer(Mact)

    endif   

endfunction

function MachokeLoop takes nothing returns nothing

    local unit Mac = GetAttacker()

    local unit Macmb = GetAttackedUnitBJ()

    local integer MacIndex = GetHeroStatBJ(bj_HEROSTAT_STR, Mac, true)

    local timer MacT = CreateTimer()

    call UnitDamageTarget( Mac, Macmb, I2R(MacIndex), false, false, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS )

    call StoreInteger(udg_GG,"Mac",I2S(h2i(MacT)),h2i(Mac))

    call StoreInteger(udg_GG,"Macmb",I2S(h2i(MacT)),h2i(Macmb))

    call SetUnitUserData( Macmb, 0 )

    call TimerStart(MacT0.05,true, function mach )

    set Mac = null

    set Macmb = null

endfunction


function Machoke takes unit mk returns nothing

    local trigger mac = CreateTrigger()

    call TriggerRegisterAnyUnitEventBJ( mac, EVENT_PLAYER_UNIT_ATTACKED )

    call TriggerAddCondition( mac, Condition( function MachokeCond ) )

    call TriggerAddAction( mac, function MachokeLoop )

    set mac = null
endfunction
[/jass]
发表于 2009-12-30 20:41:27 | 显示全部楼层
出现啥效果了?
回复

使用道具 举报

 楼主| 发表于 2009-12-30 21:19:52 | 显示全部楼层
就是比如每0.05秒移动3的距离 再次攻击这个单位的时候就变成每0.025秒移动了 间隔越来越低了
回复

使用道具 举报

发表于 2009-12-30 21:37:59 | 显示全部楼层

因为你每次都绑定
所以第二次攻击后就是两个timer在移动了
这个好办
你可以这样
每次移动完单位都清空缓存的那个子key
然后
每次攻击前都检查对目标绑定的timer是否存在
GC有这个函数
如果存在就是已经在移动的了
那么根据你设计的效果重置timer或者不管都行
如果不存在就正常创建
如果不会用这个函数
那么多绑定个boolean值也可以
不过要先测试下读取未使用过的布尔值的返回值是什么(应该是false)
然后移动中的就设为ture
用这个值判断也可以
回复

使用道具 举报

 楼主| 发表于 2009-12-31 22:03:33 | 显示全部楼层
那个函数是什么? 就是判定Timer是否存在的函数 我……找不到。。
回复

使用道具 举报

发表于 2009-12-31 22:36:03 | 显示全部楼层
HaveStoredInteger
因为GC都是存储integer来代替存储handle
所以你可以判断这个
或者不清空
直接将用过的绑定timer的GC的项目设为0
然后每次判断这个timer的存储位置的integer是否为0即可
因为GC存储的空的integer位置读取的值为0
所以即使是第一次也可以判断出正确的结果
回复

使用道具 举报

 楼主| 发表于 2010-1-1 10:13:52 | 显示全部楼层
那个 羞~~怎么把项目设置成0  是call StoreInteger(udg_GG,"Mac",I2S(h2i(MacT)),0) 储存一个0进去么?
回复

使用道具 举报

发表于 2010-1-1 11:59:56 | 显示全部楼层
引用第6楼b76234567于2010-01-01 10:13发表的  :
那个 羞~~怎么把项目设置成0  是call StoreInteger(udg_GG,"Mac",I2S(h2i(MacT)),0) 储存一个0进去么?
不需要。
一个空项目中的数值就是0
回复

使用道具 举报

发表于 2010-1-1 12:14:03 | 显示全部楼层
引用第6楼b76234567于2010-01-01 10:13发表的  :
那个 羞~~怎么把项目设置成0  是call StoreInteger(udg_GG,"Mac",I2S(h2i(MacT)),0) 储存一个0进去么?
移动完的用这个方法设为0
没有移动过的不必理会
如7楼所说,默认就是0
回复

使用道具 举报

发表于 2010-1-10 14:18:31 | 显示全部楼层
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 15:57 , Processed in 0.034826 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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