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

诡异就是多了一句set act=null就会出现致命错误

[复制链接]
发表于 2010-6-5 13:48:17 | 显示全部楼层 |阅读模式
function cishablood takes nothing returns nothing
local trigger trg=GetTriggeringTrigger()
local triggeraction act=LAtg(2,trg,"act")
local effect fx=AddSpecialEffectTargetUnitBJ( "chest", GetTriggerUnit(), "Objects\\Spawnmodels\\Human\\HumanBlood\\HeroBloodElfBlood.mdl" )
call TriggerRemoveAction(trg,act)       /////还有这句,这句和下面那句set act=null不能共存,两句只要删掉一句就不会有错误act只是一个局域变量代表了Triggeraction而已,而Triggeraction销毁后是否就不需要清空局域变量?为什么我有另外的触发这两个语句却可以并存。。。
call DisplayTimedTextToPlayer(Player(0),0,0,1,I2S(GetHandleId(act)))
call DestroyEffect(fx)
call DestroyTrigger(trg)
set act=null       ///////////////////////////////////////////5555就是这句,如果没有这句就不会出现致命错误,但是如果没有这句,那么临时的局域变量就没法清空,求教
set trg=null
endfunction
function Trig_cisha_Actions takes nothing returns nothing
local trigger trg=CreateTrigger()
local event ev=TriggerRegisterUnitEvent(trg,GetTriggerUnit(),EVENT_UNIT_DAMAGED)
local triggeraction act=TriggerAddAction(trg,function cishablood)
call SAtg(2,trg,"act",act)
set  trg=null
set ev=null
set act=null
endfunction
//===========================================================================
function InitTrig_cisha takes nothing returns nothing
    set gg_trg_cisha = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_cisha, EVENT_PLAYER_UNIT_ATTACKED )
    call TriggerAddCondition( gg_trg_cisha, Condition( function Trig_cisha_Conditions ) )
call TriggerAddAction( gg_trg_cisha, function Trig_cisha_Actions )
endfunction
发表于 2010-6-5 14:30:44 | 显示全部楼层
问题很可能是出在“在触发内删除触发动作”这点上。如果你确信只是set act=null会导致出现问题的话,那么你试着把所有的act都用LAtg(2,trg,"act")代替吧,这样就没有局部变量的set null问题了。

另外一点是,TriggerCondition不需要删除,它随着触发的销毁而销毁,所以建议你把function cishablood 做成一个Condition。
回复

使用道具 举报

发表于 2010-6-5 15:30:18 | 显示全部楼层
你可以试一下这个触发本身不把自己销毁,而是开一个计时器去销毁试试看
回复

使用道具 举报

 楼主| 发表于 2010-6-5 18:17:55 | 显示全部楼层
TriggerEvent需要删除吗?貌似没有删除事件的函数。。。还有条件真的不需要删除吗?怎么我看了老狼的教程他也会删条件啊?那我想问,条件是否需要删除,TriggerRemoveCondition这个函数没有意义?还有,2楼的方法,是我一开始就用的,但是发现这样做事没办法删除动作的,这一句call DisplayTimedTextToPlayer(Player(0),0,0,1,I2S(GetHandleId(act))),一开始里面的act就是LAtg(2,trg,“act”)结果,打出来的是0,而像上面那样,用一个变量act承接LAtg(XXX)再打在屏幕上就会出现这个动作的ID,所以2楼的方法不管用。至于3楼版主的我也想过,但是这是多么的麻烦,这个触发的动作里面如果用计时器,就要创建计时器绑定在触发器上面,再把动作绑定在计时器上面,销毁的时候从触发器里面拿出计时器,在从计时器里面拿出动作,这个,多麻烦,一个触发器销毁的时候就销毁其动作,把动作绑定在触发器上就是最方便的,我的其他几个触发都是有set act=null的但不会出错,但是惟独这个……或许可能是次动作中的问题吧
回复

使用道具 举报

发表于 2010-6-5 18:44:14 | 显示全部楼层
引用第3楼frozenleave于2010-06-05 18:17发表的  :
还有,2楼的方法,是我一开始就用的,但是发现这样做事没办法删除动作的,这一句call DisplayTimedTextToPlayer(Player(0),0,0,1,I2S(GetHandleId(act))),一开始里面的 act就是LAtg(2,trg,“act”)结果,打出来的是0,而像上面那样,用一个变量act承接LAtg(XXX)再打在屏幕上就会出现这个动作的ID,所以2楼的方法不管用。
这个我很难理解,我不觉得会出现这样的情况。

另外的就是TriggerCondition,http://bbs.islga.org/read-htm-tid-28353-keyword-%D1%D0%BE%BF.html,也就是说TriggerRemoveCondition在你要删除触发的情况下,是无意义的。

----------- 帖子于 18:44 更新 --------- 之前内容发布于 18:41 ------------

另外要说的是,老狼之前的教程有提到过一个RPbug,机理的话没有讲清楚,我记得似乎和DisplayTimedTextToPlayer这一类的函数有关联。
回复

使用道具 举报

 楼主| 发表于 2010-6-5 19:06:17 | 显示全部楼层
Rpbug貌似是一个完全无语法错误的函数系统却报错。但是对于DisplayXXX那个的确是这样虽然难以理解,但是这个的返回值确实为0了。另外,以后我肯定把动作写在条件里了。。。
回复

使用道具 举报

发表于 2010-6-5 19:13:00 | 显示全部楼层
好多后来的研究都跟先前的资料有出入,所以你也可以多在论坛找找相关的资料。

对于猪头大大的建议建议你也考虑下,因为如果不会使用Timer的话,好多东西还是很难实现的,至少是很难变的高效些。
回复

使用道具 举报

发表于 2010-6-5 19:42:45 | 显示全部楼层
rpbug当时发现的是在触发中清除所有注册的触发条件时出现的,清除动作时似乎并不会出问题(或者说是不记得会不会了),但这个情况可能有点类似,用计时器延时删除应该不会再出现这个问题
回复

使用道具 举报

 楼主| 发表于 2010-6-5 19:57:27 | 显示全部楼层
额,如果用timer绑定触发,触发绑定触发动作,这样删除的确可以。延时删除的话,个人觉得会比较麻烦,因为本来就没有CreateTImer的必要,却为了一个Triggeraction开始一个timerstart而后又要删除timer和哈希表里面的东西。那遇到这样的情况我把动作改到条件里面好了。不过我这个疾风步砍了溅血的触发还得用版主大大的办法,的确有用。但是比较麻烦。。
回复

使用道具 举报

发表于 2010-6-5 22:36:46 | 显示全部楼层
引用第3楼frozenleave于2010-06-05 18:17发表的  :
另外要说的是,老狼之前的教程有提到过一个RPbug,机理的话没有讲清楚,我记得似乎和DisplayTimedTextToPlayer这一类的函数有关联。

那个,rpbug是guo在做那个jass教程的时候有人反馈的,那个原来一直采用老狼的那种写法,然后再删除全部触发的时候出现了crash,那个时候我也遇到了但以为是我没写好就想办法绕掉了= =
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-25 18:23 , Processed in 0.038860 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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