找回密码
 点一下
查看: 5301|回复: 41

移除光出错条件的诡异问题[重新整理]

[复制链接]
发表于 2008-7-13 23:11:45 | 显示全部楼层 |阅读模式
我重新传了个图 新BUG演示.w3x    这个是下面提到的农民问题 rpbug.w3x
现在去掉了所有vj语句
只是个普通的魔兽图

看这个图
进入地图后马上按ESC于是魔兽弹出了(速度一定要快 慢了就失败了)
但是进去后一会儿再按就正常了 不会有任何问题

问题在于这句
call TriggerRemoveCondition
去掉就正常了
已知可能的原因是
把所有的条件清空可能会造成崩溃
(参考 rpbug.w3x 把农民全打成半排血崩溃)
问题在于
1.为什么要进入图后马上按才会弹出呢?过会就完全正常了
2.那个loop的时候20改成5000(全局变量也要记得改)则不会弹出...为何
3.是否真的要DestroyTrigger前TriggerRemoveCondition
(看b触发  //看清楚是是b的不是func里面的
如果call DestroyTrigger(gg_trg_b)去掉
则地图完全正常了 留下则还会弹出
是否说了了其实b中DestroyTrigger时候已经清除掉了那个条件

4.InitTrig_a按照那个T顶上的注释写却不会出错是为何呢?

=========下面的全部作废============
看这个图
进入地图后马上按ESC于是魔兽弹出了(速度一定要快 慢了就失败了)
但是进去后一会儿再按就正常了 不会有任何问题

问题在于这句
call TriggerRemoveCondition(hhh[i].tri, hhh[i].cond)

去掉就不会有这个问题
开启了另一个触发好像也就没出错了(事件-游戏0秒)
为啥呢?实在太诡异了


---------
顺便再问一下
那个Destroy前真的要Remove条件和动作么?
我的某图里留下一个有Condition的触发不Destroy然后Remove其他所有触发的条件并且Destroy他们则无问题
但是若Destroy则会弹出 是不是说明其实Destroy的时候魔兽会自动RemoveCondition

567.w3m

22 KB, 下载次数: 29

新BUG演示.w3x

22 KB, 下载次数: 50

发表于 2008-7-13 23:16:12 | 显示全部楼层
vjass不了解,唉唉~~

是不是条件当动作来写的呢?

guo的jass教程里有专门的修正,就是动态注册事件,把动作写入条件,当所有注册的触发被干掉的时候,会弹错,教程里关于这个问题还有一张我的示意图………………
回复

使用道具 举报

 楼主| 发表于 2008-7-13 23:16:53 | 显示全部楼层
不是的吧..
你看看我的那个图里面另一个触发也是做条件写
可是开启不会出任何问题

我换动作试试
回复

使用道具 举报

发表于 2008-7-13 23:34:25 | 显示全部楼层
条件里写动作本身没有什么问题,问题在销毁的时候,当条件的引用数归0 时会出问题
你另一个触发不会弹错是因为你根本没有执行移除条件销毁触发的语句
回复

使用道具 举报

 楼主| 发表于 2008-7-13 23:37:08 | 显示全部楼层

好像是那个问题
不过为什么一段时间(差不多1秒后)就无任何BUG了呢?
回复

使用道具 举报

发表于 2008-7-13 23:40:19 | 显示全部楼层
引用第4楼hke于2008-07-13 23:37发表的  :

好像是那个问题
不过为什么一段时间(差不多1秒后)就无任何BUG了呢?

据某锅说是RP,恩恩,或许
回复

使用道具 举报

 楼主| 发表于 2008-7-13 23:44:14 | 显示全部楼层
一段时间后也是清空了条件啊
跟RP没问题吧

按照某人的演示图(就是把条件都清空了)
是每次都会发生的
为啥我那个图是过后就不会发生了呢
(这个图把所有农民打掉一半血就弹出了)

rpbug.w3x

19 KB, 下载次数: 44

回复

使用道具 举报

发表于 2008-7-13 23:50:18 | 显示全部楼层
这个不会就是我那个图吧………………
其实解决只要0秒开启计时器,然后通过计时器删除也就是延后一下就没问题了,或者直接改成动作
那个出问题是因为清除条件本身就是写在这个条件里的………………
回复

使用道具 举报

 楼主| 发表于 2008-7-13 23:50:33 | 显示全部楼层
顺便再问一下
那个Destroy前真的要Remove条件和动作么?
我的某图里留下一个有Condition的触发不Destroy然后Remove其他所有触发的条件并且Destroy他们则无问题
但是若Destroy则会弹出 是不是说明其实Destroy的时候魔兽会自动RemoveCondition
回复

使用道具 举报

发表于 2008-7-13 23:52:25 | 显示全部楼层
你可以试下,把removecondition去掉会不会跳错,不会的话说明并没有remove掉吧
回复

使用道具 举报

 楼主| 发表于 2008-7-13 23:54:15 | 显示全部楼层
去掉是不会出错
可是你不觉得这个能说明什么么?

------
我的某图里留下一个有Condition的触发不Destroy然后Remove其他所有触发的条件并且Destroy他们则无问题
但是若Destroy则会弹出 是不是说明其实Destroy的时候魔兽会自动RemoveCondition

还有个问题就是为啥1秒后就没出问题了?
回复

使用道具 举报

发表于 2008-7-13 23:55:53 | 显示全部楼层
1秒后,这个条件已经不在运行了吧………………
出错的都是最后一个,而且正在运行中的条件被自身的代码Remove掉了………………
回复

使用道具 举报

 楼主| 发表于 2008-7-13 23:56:36 | 显示全部楼层

Re:VJASS的诡异问题

那个条件是按下ESC触发的啊
任何时候都会触发的
Remove是发生在条件中的
回复

使用道具 举报

发表于 2008-7-13 23:57:03 | 显示全部楼层

Re:VJASS的诡异问题

其实在我认为,销毁触发器的时候应该是条件和动作都自动销毁了的

可是猪头告诉我,要手动清除~~
回复

使用道具 举报

 楼主| 发表于 2008-7-13 23:58:08 | 显示全部楼层

Re:Re:VJASS的诡异问题

引用第13楼马甲君于2008-07-13 23:57发表的 Re:VJASS的诡异问题 :
其实在我认为,销毁触发器的时候应该是条件和动作都自动销毁了的

可是猪头告诉我,要手动清除~~
我和你想的一样
不过老狼说要手动...
太权威了
回复

使用道具 举报

 楼主| 发表于 2008-7-14 11:06:36 | 显示全部楼层
重新整理了下
大家帮忙看看吧
回复

使用道具 举报

发表于 2008-7-14 11:10:48 | 显示全部楼层
唉,一般我都是吧条件写到动作里面的。

顺便问下,有没有移除触发事件的函数。   
回复

使用道具 举报

 楼主| 发表于 2008-7-14 11:13:11 | 显示全部楼层
引用第16楼thody于2008-07-14 11:10发表的  :
唉,一般我都是吧条件写到动作里面的。

顺便问下,有没有移除触发事件的函数。   
动作写条件运行起来快很多
你可以搜索下以前的帖子

事件是无法移除的
回复

使用道具 举报

发表于 2008-7-14 11:18:46 | 显示全部楼层
  1. function func takes nothing returns boolean
  2.           local integer i=0
  3.           local trigger t = GetTriggeringTrigger()
  4.           loop
  5.               exitwhen i>20
  6.               if t != udg_tri[i] then
  7.                   call TriggerRemoveCondition(udg_tri[i], udg_cond[i])
  8.                   call DestroyTrigger(udg_tri[i])
  9.                   set udg_tri[i]=null
  10.                   set udg_cond[i]=null
  11.               endif
  12.               set i=i+1
  13.           endloop
  14.           call BJDebugMsg("func")
  15. return false
  16. endfunction
  17. function InitTrig_a takes nothing returns nothing
  18.     local integer i=0
  19.           loop
  20.               exitwhen i>20
  21.               set udg_tri[i]=CreateTrigger()
  22.               call TriggerRegisterPlayerEvent(udg_tri[i],Player(0),ConvertPlayerEvent(17)) //ESC
  23.               set udg_cond[i]=TriggerAddCondition(udg_tri[i] , Condition(function func))
  24.               set i=i+1
  25.           endloop
  26. endfunction
复制代码
这样就不会弹了。
回复

使用道具 举报

发表于 2008-7-14 11:19:08 | 显示全部楼层
同上sss
据说无事件的 所以只能删整个触发

我进去10几秒了 按ESc还是弹出
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 22:04 , Processed in 0.302387 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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