找回密码
 点一下
查看: 3084|回复: 12

[已解决]关于结合return bug的game cache的数据调用问题,求解。

[复制链接]
发表于 2008-5-18 16:24:26 | 显示全部楼层 |阅读模式
[codes=jass]
function lie takes nothing returns nothing
      local timer tm=GetExpiredTimer()
      local string name=GetStoredString(udg_GC, I2S(H2I(tm)), "Name")
      call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,1,name+"is handsome!")
      set tm=null
endfunction
                           
function text takes string name returns nothing
      local timer tm=CreateTimer()
      call StoreString(udg_GC,I2S(H2I(tm)), "Name", name)
      call TimerStart(tm,1,true,function lie)
      set tm=null
endfunction
[/codes]
储存前的定义是local timer tm=CreateTimer()
提取前的定义是local timer tm=GetExpiredTimer()
为何后面转化成的字符串是相同的?还有就是怎么不用H2S直接转,而是要通过i转呢?

评分

参与人数 1威望 +20 收起 理由
狡猾的兔子 + 20 鼓励讨论.

查看全部评分

发表于 2008-5-18 16:30:36 | 显示全部楼层
因为第一个函数里的到期计时器(GetExpiredTimer)就是第二个函数里创建的那个计时器
TimerStart函数的作用是开启计时器,并在计时器到期时执行函数

H2S的话,因为handle可以与整数类型互转,但无法直接转化成字符串,需要通过整数作中间步骤,可以写一个H2S函数的
回复

使用道具 举报

 楼主| 发表于 2008-5-18 17:54:21 | 显示全部楼层
那如果多个计时器同时到期呢?是否该写成:
call StoreString(udg_GC,"T1","Name", I2S(H2I(T1)),)
call StoreString(udg_GC,"T2","Name", I2S(H2I(T2)),)
....
local string name1=GetStoredString(udg_GC, GetStoredString(udg_GC, "T1", "Name") ,"Name")
local string name2=GetStoredString(udg_GC,GetStoredString(udg_GC, "T2", "Name") ,"Name")
回复

使用道具 举报

发表于 2008-5-18 17:57:50 | 显示全部楼层
其实是不可能同时的
即使多个同时到期也无所谓的,绑定的是计时器的handle值,每个计时器是唯一的,不会造成冲突的

只要把缓存的missionkey和key区分开不要覆盖就好了
回复

使用道具 举报

 楼主| 发表于 2008-5-18 18:07:22 | 显示全部楼层
我是说如果几个计时器同时到期的话。
local timer tm=GetExpiredTimer()
不是就行不通了么?
还有比如3秒循环的计时器和1秒循环的计时器分别进行,本来应该对应3秒计时的值,就成了对应1秒计时的值。
这样的话只有先储存I2S(H2I(tm)的值,再调用才行吧?
回复

使用道具 举报

发表于 2008-5-18 18:26:27 | 显示全部楼层
不会冲突。
回复

使用道具 举报

发表于 2008-5-18 18:27:31 | 显示全部楼层
如果两个timer都调用一个函数,那么GetExpiredTimer() 还是可以分别得到不同的timer。
回复

使用道具 举报

 楼主| 发表于 2008-5-18 18:44:55 | 显示全部楼层
是可以得到不同的,但是不同的计时器时间短的先到期。
本来要3秒计时的值不就变成1秒计时的值了么。
回复

使用道具 举报

发表于 2008-5-18 18:55:53 | 显示全部楼层
不知道你说什么
回复

使用道具 举报

发表于 2008-5-18 19:32:53 | 显示全部楼层
貌似lz根本没搞懂额………………
开始先后、到期先后根本没有关系,到期的计时器的handle对应的是缓存内写入的相关数据,哪个到期了就能获得哪个的,与先后到期有什么关系呢???
回复

使用道具 举报

 楼主| 发表于 2008-5-18 19:47:25 | 显示全部楼层
引用第9楼zhuzeitou于2008-05-18 19:32发表的  :
貌似lz根本没搞懂额………………
开始先后、到期先后根本没有关系,到期的计时器的handle对应的是缓存内写入的相关数据,哪个到期了就能获得哪个的,与先后到期有什么关系呢???
哦,明白了。的确是到期再运行的函数。
谢谢。
回复

使用道具 举报

发表于 2008-5-18 23:34:38 | 显示全部楼层
每个新建计时器的handle值都不同,这就是为什么要转换handle为字符串,所以GetExpiredTimer()不会冲突。
GetExpiredTimer() 相当于全局变量,改变它只能通过到期事件,因此,只要没通过到期事件,GetExpiredTimer() 依然可以在任何函数中指定一个计时器……
回复

使用道具 举报

发表于 2008-5-24 09:03:28 | 显示全部楼层
TimerStart 我猜测是通过调用按个计时器来计时 达到那时间后运行函数
ture 就是反复调用计时器 false就调用一次.
然后因为每个函数一被调用运行立刻local timer t=GetExpiredTimer() 就能正好获得那个计时器

..
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 18:13 , Processed in 0.139600 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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