魔兽地图编辑器吧 关注:65,105贴子:3,837,311

又遇到了诡异的bug ----计时器运行失败

只看楼主收藏回复



IP属地:浙江1楼2020-11-17 17:25回复
    debug函数是在计时器运行之前输出 “计时器handle start with”,
    计时器是一次运行, 所调用的函数再次debug 输出 “此次计时器handle end with”, 运行完就做排泄和销毁


    IP属地:浙江2楼2020-11-17 17:29
    回复
      结果不知为何一个计时器运行失败(图中标黄的那个)..也就是没有call back..所以也就没有输出 计时器handle end
      这个bug有很高的机率出现


      IP属地:浙江3楼2020-11-17 17:32
      回复
        多说一句 计时器是无条件运行的!! 不会出现因为条件不满足而不运行的情况, 属于一创建就运行的那种


        IP属地:浙江4楼2020-11-17 17:37
        回复
          有吧友遇到过类似情况吗


          IP属地:浙江5楼2020-11-17 17:43
          回复
            总体上看应该是自己问题


            6楼2020-11-17 17:49
            收起回复



              IP属地:浙江7楼2020-11-17 17:58
              回复
                相关代码


                IP属地:浙江8楼2020-11-17 17:58
                回复


                  IP属地:浙江9楼2020-11-17 18:14
                  回复
                    如果默认计时器不会莫名罢工的话,那么可以继续排查的地方大概是DisplayTimedTextToPlayer
                    可以给计时器再添加1个DisplayTimedTextToPlayer,参数全部用常量,输出空行就行,目的是保证call back是有的
                    测试时能看到每个callback的记录都是空行+有内容行的形式,如果哪个callback只单独1个空行,说明DisplayTimedTextToPlayer可能因为参数问题而没有执行成功


                    IP属地:广东10楼2020-11-17 18:20
                    回复
                      求解啊,我已经两天没睡好觉额


                      IP属地:浙江11楼2020-11-17 18:46
                      回复
                        @隙间的小喵

                        用了你建议的debug常量的办法,但是出现了最不幸的情况,这个计时器就是没有回调成功,也就是没有运行


                        IP属地:浙江12楼2020-11-17 20:23
                        收起回复
                          简单的测试方法,开局给玩家100000金钱
                          做一个触发,玩家1按1次ESC同时跑100个计时器,每个计时器都是固定0.5秒后callback让玩家1的钱-1
                          你可以在该图的不同的环境下按一下ESC,如果个位数或十位数不是0就能直观地知道有多少tm罢工了
                          接着再排查可能是什么东西导致tm罢工的
                          如果该方法跑不出罢工的tm,说明问题出在龙晶上,如果能跑出,说明地图的其他JASS可能存在问题


                          IP属地:广东14楼2020-11-17 21:24
                          回复
                            function m_callback takes nothing returns nothing
                            call SetPlayerStateBJ(Player(0), PLAYER_STATE_RESOURCE_GOLD, OperatorIntegerSubtract(GetPlayerState(Player(0), PLAYER_STATE_RESOURCE_GOLD), 1))
                            endfunction
                            function tr_select_f takes nothing returns nothing
                            local timer tm
                            set bj_forLoopAIndex = 1
                            set bj_forLoopAIndexEnd = 100
                            loop
                            exitwhen bj_forLoopAIndex > bj_forLoopAIndexEnd
                            set tm=CreateTimer()
                            call TimerStart(tm,0.5,false,function m_callback)
                            set bj_forLoopAIndex = bj_forLoopAIndex + 1
                            endloop
                            call DisplayTextToPlayer(Player(0), 0, 0, I2S(GetHandleId(tm)))
                            endfunction
                            function InitTrig_J takes nothing returns nothing
                            local trigger tr_select = CreateTrigger()
                            call TriggerRegisterPlayerEventEndCinematic(tr_select, Player(0))
                            call TriggerAddAction(tr_select, function tr_select_f)
                            call SetPlayerStateBJ(Player(0), PLAYER_STATE_RESOURCE_GOLD, 100000)
                            endfunction
                            新建触发名字就叫J,然后清空了把上面这段拖进去就能用来测了


                            IP属地:广东15楼2020-11-17 21:28
                            收起回复
                              可能获取不了trackunit


                              IP属地:北京16楼2020-11-17 22:01
                              收起回复