找回密码
 点一下
楼主: 麦德三世

[小题目]如何做出单位生命值变化的触发

[复制链接]
发表于 2006-4-25 20:37:12 | 显示全部楼层
事件是删不掉滴
回复

使用道具 举报

发表于 2006-4-25 20:38:06 | 显示全部楼层
TriggerRegisterUnitStateEvent 的功用也好奇怪...那个不等于貌似完全米效果嘛.....
回复

使用道具 举报

发表于 2006-4-25 20:39:48 | 显示全部楼层
没兴趣,搬个凳子保持观望
回复

使用道具 举报

发表于 2006-4-25 20:50:21 | 显示全部楼层
恩~不知道是不是这个效果~~~
回复

使用道具 举报

发表于 2006-4-25 20:53:26 | 显示全部楼层
每秒一次的减法你也太54麦德的存在了吧
回复

使用道具 举报

发表于 2006-4-25 20:59:10 | 显示全部楼层
....不对啊~~我再试试~
回复

使用道具 举报

发表于 2006-4-25 21:31:19 | 显示全部楼层
WE要能随意删除事件就好鸟,这样问题就简单鸟.....不过反正不能也米关系,既然不能删,那就创建无事件触发....只要单位生命不等于生命最大值就说明生命有变化,之后判断生命是否真的在变化就好了....然后我现在卡死在一个地方鸟5555
回复

使用道具 举报

发表于 2006-4-25 21:43:37 | 显示全部楼层
我要崩溃了.单位生命事件居然米反应...
回复

使用道具 举报

发表于 2006-4-25 21:54:13 | 显示全部楼层
原帖由 amp34 于 2006-4-25 21:43 发表
我要崩溃了.单位生命事件居然米反应...




你的失败,我的快乐.;P
回复

使用道具 举报

发表于 2006-4-25 21:58:05 | 显示全部楼层
我看了你的了...嗯.
郁闷吖....
原来我们的想法都素一样D.

现在终于得了..
要小于生命-1.大于生命+1才得.为什么?这是为什么?
回复

使用道具 举报

发表于 2006-4-25 22:07:38 | 显示全部楼层
生命回复素线状的,所以每一刻都在变,(当然计算机里是不存在真正的线状的)
就不能直接用当前生命了
至少也要有个0.01的差,不过要是0.01的话,那就满屏的数字飘了
回复

使用道具 举报

发表于 2006-4-25 22:10:20 | 显示全部楼层
嗯嗯.我终于发现这个问题了....
原来是这个样子的.呃.............

真素太郁闷了.
另外.把删除触发写在触发里.应该也不会有问题的.
回复

使用道具 举报

发表于 2006-4-25 22:12:05 | 显示全部楼层
删除触发写在触发里

你到写写看?
回复

使用道具 举报

发表于 2006-4-25 22:14:56 | 显示全部楼层

懒得自己做了,大概是这样:

原帖由 Red_Wolf 于 2006-4-25 20:35 发表
回复是线状加血的而不是点状的,所以把最小显示伤害累计到1了,免得满屏的数字乱跳~


Red_Wolf的代码是:
[jass]
function ShowDamage takes nothing returns nothing
    set udg_lifeX = GetUnitState(GetTriggerUnit(),UNIT_STATE_LIFE)
    call DisplayTextToPlayer(Player(0),0,0, R2S(udg_lifeX - udg_lifeY) )
    set udg_lifeY = udg_lifeX   
    call DisableTrigger( GetTriggeringTrigger() )
    call TriggerExecute( gg_trg_T1 )
endfunction

function Damage takes unit u returns nothing
    local trigger trg = CreateTrigger(  )
    local triggeraction act = TriggerAddAction( trg, function ShowDamage )
    call TriggerRegisterUnitStateEvent( trg, u, UNIT_STATE_LIFE, LESS_THAN, udg_lifeY - 1 )
    call TriggerRegisterUnitStateEvent( trg, u, UNIT_STATE_LIFE, GREATER_THAN, udg_lifeY + 1 )
    loop
    exitwhen GetTriggerExecCount(trg)==1
    call TriggerSleepAction(1)
    endloop
    call TriggerRemoveAction(trg,act)
    call DestroyTrigger(trg)
    set trg = null
    set act = null   
endfunction
[/jass]

loop + TriggerSleepAction 还不就是每秒执行一次

应该:
Damage只是新建触发器
然后在ShowDamage删除自身触发器

至于参数的传递可以用GameCache
而且这样还能做成多人的
回复

使用道具 举报

发表于 2006-4-25 22:15:18 | 显示全部楼层
对了,这个没有重叠事件到可以写
回复

使用道具 举报

发表于 2006-4-25 22:26:15 | 显示全部楼层
就是写在触发里.自己去看.嗯.
如果有人问我.为什么要写两次相同的内容.
那我回答.回为有一次加了禁用触发.嗯.

可以N英雄同时作用.
和老狼的一样.只是改了一下.
嗯嗯.我是看过老狼的才真正完成的.嗯.
回复

使用道具 举报

发表于 2006-4-25 22:27:10 | 显示全部楼层
原帖由 zyl910 于 2006-4-25 22:14 发表


Red_Wolf的代码是:

function ShowDamage takes nothing returns nothing
    set udg_lifeX = GetUnitState(GetTriggerUnit(),UNIT_STATE_LIFE)
    call DisplayTextToPlayer(Player(0),0,0, R2S(udg_ ...

对.我的就是在那个里面删除的.嗯.老狼应该以为不可以.
所以随便加上测试给他.
回复

使用道具 举报

发表于 2006-4-25 22:30:07 | 显示全部楼层
[jass]
function changelife_Actions takes nothing returns nothing
    local trigger changelife = null
    local unit triggerunit = null
    local real life = 0
    set triggerunit = GetTriggerUnit()
    set life = GetUnitStateSwap(UNIT_STATE_LIFE, triggerunit)

    //=====================================================
    //****************过程*****************
    //=====================================================
    call DisplayTextToForce( GetPlayersAll(), GetUnitName(triggerunit) + \"\'s life:\" + R2S(life) )
    //=====================================================

    set changelife = CreateTrigger()
    call TriggerRegisterUnitStateEvent(changelife, triggerunit, UNIT_STATE_LIFE, LESS_THAN, life - 1)
    call TriggerRegisterUnitStateEvent(changelife, triggerunit, UNIT_STATE_LIFE, GREATER_THAN, life + 1)
    call TriggerAddAction( changelife, function changelife_Actions )
    call DestroyTrigger( GetTriggeringTrigger() )
endfunction

function Trig_changelife_Actions takes nothing returns nothing
    local trigger changelife = null
    local unit triggerunit = null
    local real life = 0

    set triggerunit = GetTriggerUnit()
    set life = GetUnitStateSwap(UNIT_STATE_LIFE, triggerunit)
    call DisplayTextToForce( GetPlayersAll(), GetUnitName(triggerunit) + \"\'s life:\" + R2S(life) )

    set changelife = CreateTrigger( )

    call TriggerRegisterUnitStateEvent(changelife, triggerunit, UNIT_STATE_LIFE, LESS_THAN, life - 1)
    call TriggerRegisterUnitStateEvent(changelife, triggerunit, UNIT_STATE_LIFE, GREATER_THAN, life + 1 )
    call TriggerAddAction( changelife, function changelife_Actions )
endfunction

//===========================================================================
function InitTrig_changelife takes nothing returns nothing
    set gg_trg_changelife = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_changelife, EVENT_PLAYER_HERO_SKILL )
    call TriggerAddAction( gg_trg_changelife, function Trig_changelife_Actions )
endfunction
[/jass]
这个是我的.嗯嗯.华丽的三连击.警告我吧....
回复

使用道具 举报

发表于 2006-4-25 22:57:28 | 显示全部楼层
动作没有删掉,触发没set null
还有麦德要的是显示伤害不是血量
回复

使用道具 举报

发表于 2006-4-25 23:47:43 | 显示全部楼层
[jass]
function changelife_Actions takes nothing returns nothing
    local trigger changelife = null
    local unit triggerunit = null
    local real life = 0
    local real maxlife = 0
    local real step = 0
    local real lesslife = 0
    local real greaterlife = 0

    set triggerunit = GetTriggerUnit()
    set life = GetUnitStateSwap(UNIT_STATE_LIFE, triggerunit)
    set maxlife = GetUnitStateSwap(UNIT_STATE_MAX_LIFE, triggerunit)

    //设置捕捉变化的频率.现在为最大生命*0.01就是每1%的变化捕捉一次.
    set step = maxlife * 0.01

    set lesslife = life - step
    set greaterlife = life + step

    if lesslife < 0.01 then
        set lesslife = 0.01
    endif
    if greaterlife > maxlife - 0.01 then
        set greaterlife = maxlife -0.01
    endif

    //=====================================================
    //****************过程*****************
    //=====================================================
    call DisplayTextToForce( GetPlayersAll(), GetUnitName(triggerunit) + \"\'s life:\" + R2S(life) )
    //=====================================================

    set changelife = CreateTrigger()
    call TriggerRegisterUnitStateEvent(changelife, triggerunit, UNIT_STATE_LIFE, LESS_THAN, life - step)
    call TriggerRegisterUnitStateEvent(changelife, triggerunit, UNIT_STATE_LIFE, GREATER_THAN, life + step)
    call TriggerAddAction( changelife, function changelife_Actions )
    call DestroyTrigger( GetTriggeringTrigger() )
endfunction


function Trig_changelife_Conditions takes nothing returns boolean
    return (GetLearnedSkill() == \'A000\')
endfunction

function Trig_changelife_Actions takes nothing returns nothing
    local trigger changelife = null
    local unit triggerunit = null
    local real life = 0

    set triggerunit = GetTriggerUnit()
    set life = GetUnitStateSwap(UNIT_STATE_LIFE, triggerunit)
    call DisplayTextToForce( GetPlayersAll(), GetUnitName(triggerunit) + \"\'s life:\" + R2S(life) )

    set changelife = CreateTrigger( )

    call TriggerRegisterUnitStateEvent(changelife, triggerunit, UNIT_STATE_LIFE, LESS_THAN, life - 1)
    call TriggerRegisterUnitStateEvent(changelife, triggerunit, UNIT_STATE_LIFE, GREATER_THAN, life + 1 )
    call TriggerAddAction( changelife, function changelife_Actions )
endfunction

//===========================================================================
function InitTrig_changelife takes nothing returns nothing
    set gg_trg_changelife = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_changelife, EVENT_PLAYER_HERO_SKILL )
    call TriggerAddCondition( gg_trg_changelife, Condition( function Trig_changelife_Conditions ) )
    call TriggerAddAction( gg_trg_changelife, function Trig_changelife_Actions )
endfunction
[/jass]
又一次更新.按百分比捕捉.嗯嗯.
设不设为空.我认为没必要.因为本来就是局部变量了.
不过如果这样会导至内存泄漏的话.就需要了.嗯.
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 15:21 , Processed in 0.148857 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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