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

注册这个动态事件为什么会出问题

[复制链接]
发表于 2008-1-20 17:26:01 | 显示全部楼层 |阅读模式
[jass]function Trig_Sleep_Action takes nothing returns nothing
    call UnitDamageTargetBJ( GetEventDamageSource(), GetTriggerUnit(), 50.00,ATTACK_TYPE_HERO, DAMAGE_TYPE_NORMAL )
    call DestroyTrigger(GetTriggeringTrigger())
endfunction

function Trig_shuimianbegin_Actions takes nothing returns nothing
    local trigger trig=CreateTrigger()
    local unit target=GetSpellTargetUnit()
    call TriggerRegisterUnitEvent( trig,target,EVENT_UNIT_DAMAGED)
    call TriggerAddCondition(trig,Condition(function Trig_Sleep_Action))
endfunction
[/jass]
我已经确定问题就是在Trig_Sleep_Action和注册动态事件那一行里,不知道为什么一运行到那一行,魔兽就自动关闭
发表于 2008-1-20 17:42:13 | 显示全部楼层
function Trig_Sleep_Action缺少bool型的返回直吧- -
回复

使用道具 举报

发表于 2008-1-20 17:44:35 | 显示全部楼层
貌似………………这是反复重复触发造成的吧………………
call UnitDamageTargetBJ( GetEventDamageSource(), GetTriggerUnit(), 50.00,ATTACK_TYPE_HERO, DAMAGE_TYPE_NORMAL )
这个代码又再一次的触发了trig,不断反复………………
回复

使用道具 举报

发表于 2008-1-20 17:45:13 | 显示全部楼层
引用第1楼trevors于2008-01-20 17:42发表的  :
function Trig_Sleep_Action缺少bool型的返回直吧- -

记得有高人研究过,condition返回nothing也可以的………………
回复

使用道具 举报

发表于 2008-1-20 18:10:45 | 显示全部楼层
哦- -...
原来如此..
如果返回是nothing,还会不会做后面的action呢
刚刚学JASS,不懂的东西太多了- -
回复

使用道具 举报

发表于 2008-1-20 18:12:58 | 显示全部楼层
引用第2楼zhuzeitou于2008-01-20 17:44发表的  :
貌似………………这是反复重复触发造成的吧………………
call UnitDamageTargetBJ( GetEventDamageSource(), GetTriggerUnit(), 50.00,ATTACK_TYPE_HERO, DAMAGE_TYPE_NORMAL )
这个代码又再一次的触发了trig,不断反复………………
感觉就是这个原因了,以前用T做的时候也遇到过..
回复

使用道具 举报

发表于 2008-1-20 19:42:44 | 显示全部楼层
function Trig_Sleep_Action takes nothing returns nothing
      call UnitDamageTargetBJ( GetEventDamageSource(), GetTriggerUnit(), 50.00,ATTACK_TYPE_HERO, DAMAGE_TYPE_NORMAL )
      call DestroyTrigger(GetTriggeringTrigger()) 《------这里是泄漏点之一
endfunction

function Trig_shuimianbegin_Actions takes nothing returns nothing
      local trigger trig=CreateTrigger()
      local unit target=GetSpellTargetUnit()
      call TriggerRegisterUnitEvent( trig,target,EVENT_UNIT_DAMAGED)《----这是万恶之源,连锁爆炸效果
      call TriggerAddCondition(trig,Condition(function Trig_Sleep_Action)) 《-----这里是泄露点之二
endfunction
------------------

关于Condition,这东西不要乱用,虽然他效率高,但是用在只触发一次的东西上面得不偿失。

因为Condtion的原理好像是返回一个底层代码的存储块,相当于把jass变成直接调用计算机语言的函数,占用一定的存储空间,如果不删除会发生泄露。
回复

使用道具 举报

发表于 2008-1-20 19:57:53 | 显示全部楼层
引用第6楼eff于2008-01-20 19:42发表的  :
关于Condition,这东西不要乱用,虽然他效率高,但是用在只触发一次的东西上面得不偿失。

因为Condtion的原理好像是返回一个底层代码的存储块,相当于把jass变成直接调用计算机语言的函数,占用一定的存储空间,如果不删除会发生泄露。
.......

那么………………triggeraction会不会造成泄漏呢??
回复

使用道具 举报

 楼主| 发表于 2008-1-27 01:27:31 | 显示全部楼层
引用第6楼eff于2008-01-20 19:42发表的  :
function Trig_Sleep_Action takes nothing returns nothing
      call UnitDamageTargetBJ( GetEventDamageSource(), GetTriggerUnit(), 50.00,ATTACK_TYPE_HERO, DAMAGE_TYPE_NORMAL )
      call DestroyTrigger(GetTriggeringTrigger()) 《------这里是泄漏点之一
endfunction

.......
诶,事实只能说明你的JASS有待加强,注册动态事件你还是不太了解。问题我已经解决了,和你们说的一点关系都没有,只是因为我头脑发热,把销毁触发器写在造成伤害之后,当我对目标单位制造伤害时,这个触发器又被触发了一次,如此反复造成了死循环。
正确的写法是这样的,你们也理解一下代码吧,有好处的
[jass]
function Trig_Sleep_Action takes nothing returns nothing
      call DestroyTrigger(GetTriggeringTrigger())
      call UnitDamageTargetBJ( GetEventDamageSource(), GetTriggerUnit(), 50.00,ATTACK_TYPE_HERO, DAMAGE_TYPE_NORMAL )      
endfunction

function Trig_shuimianbegin_Actions takes nothing returns nothing
      local trigger trig=CreateTrigger()
      local unit target=GetSpellTargetUnit()
      call TriggerRegisterUnitEvent( trig,target,EVENT_UNIT_DAMAGED)
      call TriggerAddCondition(trig,Condition(function Trig_Sleep_Action))
endfunction
[/jass]

问题是在触发器还没有把自己删除掉,而触发器的动作有触发了它自己。

这里我想说一下TRIGGER的实现过程
当TRIGGER被引发时,系统就会调用TRIGGER的条件函数判断条件是否成立。如果成立则调用TRIGGER的动作函数。把动作和条件一起写的好处是在TRIGGER调用条件函数时,附带的把动作也执行了,因为不返回值,在JASS的机制中这也就是FALSE,(当然你也可以给定一个FALSE的返回值)系统就不会再去执行TRIGGER的动作函数。
回复

使用道具 举报

发表于 2008-1-27 13:07:55 | 显示全部楼层
引用第8楼thynson于2008-01-27 01:27发表的  :

诶,事实只能说明你的JASS有待加强,注册动态事件你还是不太了解。问题我已经解决了,和你们说的一点关系都没有,只是因为我头脑发热,把销毁触发器写在造成伤害之后,当我对目标单位制造伤害时,这个触发器又被触发了一次,如此反复造成了死循环。
正确的写法是这样的,你们也理解一下代码吧,有好处的
[jass]
function Trig_Sleep_Action takes nothing returns nothing
.......

貌似我不是说了嘛………………是重复触发事件造成死循环额………………

另外,用触发条件做动作很有可能会出bug的,传说中的rpbug………………

PS:可怜的eff大人………………
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 03:14 , Processed in 0.031140 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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