找回密码
 点一下
查看: 2894|回复: 25

[菜]ReturnBUG的缓存使用问题-__________-

[复制链接]
发表于 2008-3-20 17:24:25 | 显示全部楼层 |阅读模式
[codes=jass]call StoreInteger(udg_GC,"XXOO", "lightscreenMY", H2I(GetTriggerUnit()) )[/codes]

之后在GetStoredInteger(udg_GC,"XXOO", "lightscreenMY") 时,由于经过了一个timer的时间,所以在这个期间的另外一次触发就会使XXOO中的lightscreenMY被重新绑定吧?
发表于 2008-3-20 17:32:13 | 显示全部楼层
是的,所以"XXOO"的地方通常也是用return bug把相关单位、计时器、触发等的handle转换为integer再转换为string作为索引的
回复

使用道具 举报

 楼主| 发表于 2008-3-20 17:35:22 | 显示全部楼层
那I2S()里面该怎样写呢?
回复

使用道具 举报

发表于 2008-3-20 17:39:05 | 显示全部楼层
I2S(H2I(XXXX))
XXXX为相关的handle类变量
回复

使用道具 举报

 楼主| 发表于 2008-3-20 17:44:30 | 显示全部楼层
比如说我把CreatedTrigger定义成局部变量T了,那么就把"XXOO"写成I2S(H2I(T))是吗?

可是之后在另外的function里GetStoredInteger(udg_GC,I2S(H2I(T)),"lightscreenMY"),局部变量T不是没法传递到这个触发里吗
回复

使用道具 举报

 楼主| 发表于 2008-3-20 17:47:19 | 显示全部楼层
唔```感觉离我入门ReturnBUG就差这一步了-_,-
回复

使用道具 举报

发表于 2008-3-20 17:54:06 | 显示全部楼层
计时器的话,TimerStart()这个函数有四个参数,第一个是计时器,第二个是设定的时间,第三个是是否循环,第四个是到期后运行的函数
在这个函数里的GetExpiredTimer()可以获得到期的计时器,可以通过这个计时器的handle获得缓存中的相关内容的
回复

使用道具 举报

发表于 2008-3-20 17:55:27 | 显示全部楼层
貌似只有在timer的事件函数中才能用getexpiredtimer()得到该timer的句柄,其他是无法传递的,除了再将该timer与其他的句柄绑定。
回复

使用道具 举报

发表于 2008-3-20 18:03:25 | 显示全部楼层
得到句柄的方法很多。有预先使用变量保存传递。
在Timer应用系统中,常见就是用 I2S(H2I( Timer ) ) 来做为索引,将具体的数据或Handle数值梆定储存。
除Timer,应用最多的是Trigger, Unit, Player 等,这个几Handle值都比较好找到。也容易梆定数据。
回复

使用道具 举报

发表于 2008-3-20 20:20:49 | 显示全部楼层
引用第4楼7n.mosoul于2008-03-20 17:44发表的  :

可是之后在另外的function里GetStoredInteger(udg_GC,I2S(H2I(T)),"lightscreenMY"),局部变量T不是没法传递到这个触发里吗

可以通过GetTriggeringTrigger()   得到触发器
local trigger  T=GetTriggeringTrigger()   
GetStoredInteger(udg_GC,I2S(H2I(T)),"lightscreenMY")

这样就ok了
回复

使用道具 举报

 楼主| 发表于 2008-3-21 11:54:21 | 显示全部楼层
引用第9楼zj54891于2008-03-20 20:20发表的  :


可以通过GetTriggeringTrigger()   得到触发器
local trigger  T=GetTriggeringTrigger()   
GetStoredInteger(udg_GC,I2S(H2I(T)),"lightscreenMY")
.......


这里的GetTriggeringTrigger()真的能得到之前StoreInteger时候的那个Trigger吗```总觉得不太可行```毕竟中间多了一个timerstart的联系啊``
回复

使用道具 举报

发表于 2008-3-21 12:01:38 | 显示全部楼层
应该调用的是GetExpiredTimer啊………………6、7楼都说过了
回复

使用道具 举报

 楼主| 发表于 2008-3-21 12:05:38 | 显示全部楼层
引用第11楼zhuzeitou于2008-03-21 12:01发表的  :
应该调用的是GetExpiredTimer啊………………6、7楼都说过了

可是要存单位的时候,Timer还没有用到呢,怎么能把这个timer的handle绑定给单位呢
回复

使用道具 举报

发表于 2008-3-21 12:18:25 | 显示全部楼层
只要实例化了,这个handle就是存在的,与开不开时毫无关系的
回复

使用道具 举报

 楼主| 发表于 2008-3-21 12:23:58 | 显示全部楼层
[codes=jass]call StoreInteger(udg_GC,I2S(H2I(XXOO)), "lightscreenMY", H2I(GetTriggerUnit()) )
......
.....
call TimerStart(......)
....
....
call GetStoredInteger(udg_GCI2S(H2I(GetExpiredTimer)), "lightscreenMY")
....
[/codes]


这样就可以了吗
回复

使用道具 举报

 楼主| 发表于 2008-3-21 12:31:11 | 显示全部楼层
。。。这是获取到期的计时器,而在StoreInteger的时候还没有开始这个计时器`````

那么在上帖中的XXOO处该用什么?
回复

使用道具 举报

发表于 2008-3-21 12:37:53 | 显示全部楼层
StoreInteger时开不开时无所谓的,只要这个计时器存在就可以了~~
XXOO的地方填上那个计时器变量就好了
回复

使用道具 举报

 楼主| 发表于 2008-3-21 12:45:24 | 显示全部楼层
关键就是您说的那个计时器变量连local都还没local呢````最困扰我的地方恰恰就在这里`

[codes=jass]function lightscreen takes nothing returns nothing
    local unit I2Uunit=I2U(GetStoredInteger(udg_GC,I2S(H2I(GetExpiredTimer)), "lightscreenMY"))
    call  UnitRemoveAbility( I2Uunit, 'A02X' )
endfunction




function Trig_lightscreen_Conditions takes nothing returns boolean
    if ( not ( GetSpellAbilityId() == 'A02V' ) ) then
        return false
    endif
    return true
endfunction

function SkillTimer takes nothing returns nothing
    local timer skilltimer=CreateTimer()
    call TimerStart(skilltimer, 30, false, function lightscreen)
    set skilltimer=null
endfunction

function Trig_lightscreen_Actions takes nothing returns nothing
    call StoreInteger(udg_GC,I2S(H2I(skilltimer)), "lightscreenMY", H2I(GetTriggerUnit()) )
    call UnitAddAbility( GetTriggerUnit(), 'A02X' )
    call SetPlayerAbilityAvailableBJ( false, 'A02X', GetTriggerPlayer() )
    call SkillTimer()
endfunction

//===========================================================================
function InitTrig_lightscreen takes nothing returns nothing
    local trigger Initlightscreen = CreateTrigger(   )
    call TriggerRegisterAnyUnitEventBJ( Initlightscreen, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( Initlightscreen, Condition( function Trig_lightscreen_Conditions ) )
    call TriggerAddAction( Initlightscreen, function Trig_lightscreen_Actions )
endfunction

[/codes]

还是把问题jass发上来吧````这样我也好理解一点- -``
回复

使用道具 举报

发表于 2008-3-21 12:51:07 | 显示全部楼层
为什么要把两个SkillTimer分开呢??并在一起步就好了嘛………………
回复

使用道具 举报

 楼主| 发表于 2008-3-21 12:51:59 | 显示全部楼层
具体如何呢```-。-
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-7-9 05:34 , Processed in 0.124749 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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