找回密码
 点一下
查看: 1853|回复: 18

命令单位之后整个后面的代码执行就乱套了

[复制链接]
发表于 2008-9-21 14:09:51 | 显示全部楼层 |阅读模式
图和代码都传上来了,看10楼
发表于 2008-9-21 14:11:11 | 显示全部楼层
那把那两个函数也帖上来吧
回复

使用道具 举报

 楼主| 发表于 2008-9-21 14:18:54 | 显示全部楼层
[jass]
function ZZLD_Timer_Right takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local unit u = GetUnit(H2S(t),"u")
    local real angle = GetReal(H2S(t),"angle") - 90
    local real d = GetReal(H2S(t),"d")
   
    if(d > 0) then
        call SetUnitX(u,GetMapX(22.0 * CosBJ(angle) + GetUnitX(u)))
        call SetUnitY(u,GetMapY(22.0 * SinBJ(angle) + GetUnitY(u)))
        call SetReal(H2S(t),"d",d-22)
        call SetUnitFacing(u,angle + 180)
    else
        call CleanCV(H2S(t))
        call DestroyTimer(t)
        call PauseUnit(u,false)
        call BJDebugMsg("!!!!!!!!")
    endif
   
    set u = null
    set t = null
endfunction
function ZZLD_Timer_Left takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local unit u = GetUnit(H2S(t),"u")
    local real angle = GetReal(H2S(t),"angle") + 90
    local real d = GetReal(H2S(t),"d")
   
    if(d > 0) then
        call SetUnitX(u,GetMapX(22.0 * CosBJ(angle) + GetUnitX(u)))
        call SetUnitY(u,GetMapY(22.0 * SinBJ(angle) + GetUnitY(u)))
        call SetReal(H2S(t),"d",d-22)
        call SetUnitFacing(u,angle - 180)
    else
        call CleanCV(H2S(t))
        call DestroyTimer(t)
        call PauseUnit(u,false)
        call BJDebugMsg("!!!!!!!!")
    endif
   
    set u = null
    set t = null
endfunction
[/jass]
回复

使用道具 举报

 楼主| 发表于 2008-9-21 14:20:36 | 显示全部楼层
本来都能正确的移动啦,结果一加使用技能就乱套了
    call GroupEnumUnitsInRange(lGroup,50*i*CosBJ(angle)+x1,50*i*SinBJ(angle)+y1,300,Condition(function ZZLD_Filter))
第一个是ZZLD_Filter里面的,不是因为GroupEnumUnitsInRange这个语句的原因吧?

我把创建单位并使用技能写到 call GroupEnumUnitsInRange的上面,也会出现同样的问题。

[jass]    loop
    exitwhen i > s
    call GroupEnumUnitsInRange(lGroup,50*i*CosBJ(angle)+x1,50*i*SinBJ(angle)+y1,300,Condition(function ZZLD_Filter))
    set i = i + 1
    endloop[/jass]
回复

使用道具 举报

发表于 2008-9-21 14:32:43 | 显示全部楼层

Re:特别诡异的一个问题!

8晓得,出现了什么奇异的情况呢?把创建单位放到计时器之后会不会有问题呢?

有时候感觉无关的顺序会造成一些问题的
回复

使用道具 举报

 楼主| 发表于 2008-9-21 14:41:56 | 显示全部楼层
就是,本来计时器是把选取的单位向2边弹开的,弹开的距离和方向都要经过点与直线的关系来确定。。就是我前几天问的兽王的大。
如果不加命令单位施放技能,可以正常弹开,为了加上减速效果,我创建单位来施放技能,结果,单位就乱弹了,有些弹的距离很短,有些本来该往左弹结果往右弹,反正全部乱套了,有些还不弹
回复

使用道具 举报

发表于 2008-9-21 15:12:43 | 显示全部楼层
把有错的技能发出来吧
回复

使用道具 举报

 楼主| 发表于 2008-9-22 13:34:11 | 显示全部楼层
太诡异了
只是创建单位都没问题,一加上发布命令后面就全乱了
七天后我把技能帖上来,希望能得到高手解答
回复

使用道具 举报

发表于 2008-9-22 13:50:25 | 显示全部楼层
能不能是同一个trigger里面多个 timer用getexpiredtimer()来传递数据发生的错误呢
回复

使用道具 举报

 楼主| 发表于 2008-9-22 14:05:02 | 显示全部楼层
这么高深哦
我原来都还没遇到过这种混乱的情况呢,不过因该和命令单位的语句有关吧,注释掉就一切正常…
我实在无言只有把他写在计时器执行完了要销毁的时候执行了…这样就是单位被弹开后才减速,好jiong
而且这个问题导致我好多技能都不敢做了
回复

使用道具 举报

 楼主| 发表于 2008-9-28 14:12:06 | 显示全部楼层
我来把图和代码发上来了。。。
真的很诡异哦,默认的是用//注释掉了那条命令单位的语句的,意思是你可以先进地图试一试,发现一切很正常,再修改把//注释删掉,就会发现仅仅是这么一条命令单位的语句就会让接下来的函数运行出现奇怪的问题。。。

也可以把创建单位和命令单位的语句写到ZZLD_Filter里面(我最先是写到这个里面的,但是没有保存,要加的话里面的if语句加全要加4次,懒得了就直接写在外面了),会发现写在ZZLD_Filter里面也是会导致下面的函数运行出现问题的。。。

高手帮忙解答一下吧。。。

代码:
[jass]
function ZZLD_Timer_Right takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local unit u = GetUnit(H2S(t),"u")
    local unit u3
    local real angle = GetReal(H2S(t),"angle") - 90
    local real d = GetReal(H2S(t),"d")
   
    if(d > 0) then
        call SetUnitX(u,GetMapX(22.0 * CosBJ(angle) + GetUnitX(u)))
        call SetUnitY(u,GetMapY(22.0 * SinBJ(angle) + GetUnitY(u)))
        call SetReal(H2S(t),"d",d-22)
        call SetUnitFacing(u,angle + 180)
    else
        call CleanCV(H2S(t))
        call DestroyTimer(t)
        call PauseUnit(u,false)
        set u3 = CreateUnitYX(GetOwningPlayer(u),'h000',GetUnitX(u),GetUnitY(u),'A00S')
        call IssueNeutralTargetOrder( GetOwningPlayer(u), u3, "slow", u )
    endif
   
    set u3 = null
    set u = null
    set t = null
endfunction
function ZZLD_Timer_Left takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local unit u = GetUnit(H2S(t),"u")
    local real angle = GetReal(H2S(t),"angle") + 90
    local real d = GetReal(H2S(t),"d")
    local unit u3
   
    if(d > 0) then
        call SetUnitX(u,GetMapX(22.0 * CosBJ(angle) + GetUnitX(u)))
        call SetUnitY(u,GetMapY(22.0 * SinBJ(angle) + GetUnitY(u)))
        call SetReal(H2S(t),"d",d-22)
        call SetUnitFacing(u,angle - 180)
    else
        call CleanCV(H2S(t))
        call DestroyTimer(t)
        call PauseUnit(u,false)
        set u3 = CreateUnitYX(GetOwningPlayer(u),'h000',GetUnitX(u),GetUnitY(u),'A00S')
        call IssueNeutralTargetOrder( GetOwningPlayer(u), u3, "slow", u )
    endif
   
    set u3 = null
    set u = null
    set t = null
endfunction
function ZZLD_Filter takes nothing returns nothing
    local unit u1 = GetTriggerUnit()
    local unit u = GetFilterUnit()
    local unit u2 = GetSpellTargetUnit()
    local timer t = CreateTimer()
    local real k
    local real b
    local real q
    local real d
    local real maxX
    local real minX
    local real maxY
    local real minY
    local real angle = AngleBetweenUnits(u1,u2)
    local real x1 = GetUnitX(u1)
    local real y1 = GetUnitY(u1)
    local real x2 = GetUnitX(GetSpellTargetUnit())
    local real y2 = GetUnitY(GetSpellTargetUnit())
    local real x3 = GetUnitX(u)
    local real y3 = GetUnitY(u)
    local real damage = 100//
    local group lGroup = GetGroup(H2S(u1),"ZZLD")
    local unit uc
   
    if(y1 >= y2) then
        set maxY = y1
        set minY = y2
    else
        set maxY = y2
        set minY = y1
    endif
    if(x1 >= x2) then
        set maxX = x1
        set minX = x2
    else
        set maxX = x2
        set minX = x1
    endif
   
    if(u!=u2 and IsUnitInGroup(u,lGroup) == false and GetUnitState(u,UNIT_STATE_LIFE)>1 and IsUnitEnemy(u, GetOwningPlayer(u1)) and IsUnitType(u, UNIT_TYPE_STRUCTURE) == false and GetUnitAbilityLevel(u, 'A006') == 0 ) then
        call GroupAddUnit(lGroup,u)
        if(x1-x2 == 0) then
            if(y3 <= maxY and y3 >= minY) then
                call CDamage(u1,u,damage)
                set d = 350 - JDZ(x3-x1)
                call SetReal(H2S(t),"d",d)
                call SetUnit(H2S(t),"u",u)
                call SetReal(H2S(t),"angle",angle)
                call PauseUnit(u,true)
                if(x3 >= x1) then
                    call TimerStart(t,.035,true,function ZZLD_Timer_Right)
                else
                    call TimerStart(t,.035,true,function ZZLD_Timer_Left)
                endif
            endif
        else
        if(y1-y2 == 0) then
            if(x3 <= maxX and x3 >= minX) then
                call CDamage(u1,u,damage)
                set d = 350 - JDZ(y3-y1)
                call SetReal(H2S(t),"d",d)
                call SetUnit(H2S(t),"u",u)
                call SetReal(H2S(t),"angle",angle)
                call PauseUnit(u,true)
                if(y3 >= y1) then
                    call TimerStart(t,.035,true,function ZZLD_Timer_Left)
                else
                    call TimerStart(t,.035,true,function ZZLD_Timer_Right)
                endif
            endif
        else
        set k = (y2-y1)/(x2-x1)
        set b = y1 - k*x1
        set q = y3 - k*x3 - b
        set angle = AtanBJ(k)
        if(JDZ(k)>=1) then
            if(y3>=minY and y3<=maxY) then
                call CDamage(u1,u,damage)
                set d = 350 - JDZ(q/SquareRoot(1+k*k))
                call SetReal(H2S(t),"d",d)
                call SetUnit(H2S(t),"u",u)
                call SetReal(H2S(t),"angle",angle)
                call PauseUnit(u,true)
                if(q <= 0) then
                    call TimerStart(t,.035,true,function ZZLD_Timer_Right)
                else
                    call TimerStart(t,.035,true,function ZZLD_Timer_Left)
                endif
            endif
        else
            if(x3<=maxX and x3>=minX) then
                call CDamage(u1,u,damage)
                set d = 350 - JDZ(q/SquareRoot(1+k*k))
                call SetReal(H2S(t),"d",d)
                call SetUnit(H2S(t),"u",u)
                call SetReal(H2S(t),"angle",angle)
                call PauseUnit(u,true)
                if(q <= 0) then
                    call TimerStart(t,.035,true,function ZZLD_Timer_Right)
                else
                    call TimerStart(t,.035,true,function ZZLD_Timer_Left)
                endif
            endif
        
        endif
        endif
        endif
    endif
    set lGroup = null
    set t = null
    set u1 = null
    set u = null
    set uc = null
endfunction
function Trig_ZZLD_Actions takes nothing returns nothing
    local real x1 = GetUnitX(GetTriggerUnit())
    local real y1 = GetUnitY(GetTriggerUnit())
    local real x2 = GetUnitX(GetSpellTargetUnit())
    local real y2 = GetUnitY(GetSpellTargetUnit())
    local real angle = Angle(x1,y1,x2,y2)
    local real s = ((SquareRoot((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)))/50) - 1
    local real i = 1
    local group lGroup = CreateGroup()
    local group lGroup2 = CreateGroup()
    local unit u
    call SetHandle(H2S(GetTriggerUnit()),"ZZLD",lGroup2)
    loop
    exitwhen i > s
    call GroupEnumUnitsInRange(lGroup,50*i*CosBJ(angle)+x1,50*i*SinBJ(angle)+y1,300,Condition(function ZZLD_Filter))
    set u = CreateUnitYX(GetOwningPlayer(GetTriggerUnit()),'h000',50*i*CosBJ(angle)+x1,50*i*SinBJ(angle)+y1,'A000')
    //call IssueImmediateOrder( u, "thunderclap" )
    set i = i + 1
    endloop
    call DestroyGroup(lGroup)
    set lGroup = null
    call DestroyGroup(lGroup2)
    set lGroup2 = null
    set u = null
endfunction

function Trig_ZZLD_Conditions takes nothing returns boolean
    if ( not ( GetSpellAbilityId() == 'A00E' ) ) then
        return false
    endif
    return true
endfunction
function InitTrig_ZZLD takes nothing returns nothing
    set gg_trg_ZZLD = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_ZZLD, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_ZZLD, Condition( function Trig_ZZLD_Conditions ) )
    call TriggerAddAction( gg_trg_ZZLD, function Trig_ZZLD_Actions )
endfunction

[/jass]

Issue.w3x

93 KB, 下载次数: 35

回复

使用道具 举报

发表于 2008-9-28 20:07:01 | 显示全部楼层
call GroupEnumUnitsInRange(lGroup,50*i*CosBJ(angle)+x1,50*i*SinBJ(angle)+y1,300,Condition(function ZZLD_Filter))

原因就是  把//注释删掉后   ,GetSpellTargetUnit() 也就是技能释放目标
在 ZZLD_Filter函数里根本得不到  返回的是null
所以了    就出现了奇怪的现象
大概就是如此吧

最简单的解决方法当然就是用个全局变量  把技能释放目标传递过去了
回复

使用道具 举报

发表于 2008-9-28 21:05:18 | 显示全部楼层
我看不懂嘎
回复

使用道具 举报

 楼主| 发表于 2008-9-28 21:40:42 | 显示全部楼层
啊,为什么有一句命令单位的指令之后,ZZLD_Filter里面就得不到GetSpellTargetUnit() 了啊?
回复

使用道具 举报

发表于 2008-9-28 22:58:44 | 显示全部楼层
原因真的不太清楚
不过 事实就是如此   


感觉有些类似   加了等待之后  再使用技能释放目标 就会无效
回复

使用道具 举报

 楼主| 发表于 2008-9-28 23:17:54 | 显示全部楼层
但是用T写施放了技能也能捕捉到 GetSpellTargetUnit()  啊?
为什么用jass就不行了呢?
还是说GetSpellTargetUnit() 传不到Condition里面?

不过用JASS写的filter判断里面加关于 GetSpellTargetUnit()  的判断也能正常运行啊?
回复

使用道具 举报

 楼主| 发表于 2008-9-28 23:48:53 | 显示全部楼层
不好意思,最后的那个“JASS”应该是“WE”
回复

使用道具 举报

发表于 2008-9-28 23:49:16 | 显示全部楼层
其实我一直有个印象   就是GetSpellTargetUnit() 传不到Condition里面
但是在没加那一句命令单位的指令时  ,    你的技能也证明了是可以传递的

对此,我也很疑惑

另外 你可以看下  用个全局变量来传递 技能释放目标 就ok了

1111.w3x

95 KB, 下载次数: 28

回复

使用道具 举报

 楼主| 发表于 2008-9-29 08:35:36 | 显示全部楼层
这样啊。。。
谢谢了。。。
虽然不明白原因,以后还是避免这样吧。。。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-25 01:01 , Processed in 0.038287 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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