|
序:
我似乎好久都没有发过有价值的帖子了....
最多也是少量的发2个水贴...
其实 原因是因为 最近发生了很多不愉快的事情...
所以 心情很差...
今天这个系统...
其实 很早以前似乎也就看到过别人 写过...
如果你们看到过..
就可以无视了...
这个系统也是1个多月前 我写的...
一直没有机会发上来...
系统目的:
替代游戏缓存,实现数据传递,提高效率,避免BUG...
代码:
[jass]globals
timer array udg_timer
integer array udg_timer_H2I
integer udg_MAX = 0
//===========数据储存空间=========
//===整数===
integer array udg_Int1
integer array udg_Int2
integer array udg_Int3
integer array udg_Int4
integer array udg_Int5
integer array udg_Int6
integer array udg_Int7
integer array udg_Int8
integer array udg_Int9
integer array udg_Int10
endglobals
function H2I takes handle h returns integer
return h
return 0
endfunction
//=================数组储存系统======================
function DeTimerofID takes integer ID returns nothing
call DestroyTimer(udg_timer[ID])
set udg_timer[ID] = null
call DisplayTimedTextToPlayer( Player(0), 0, 0, 30, "a" )
if (ID == udg_MAX - 1) then
set udg_MAX = udg_MAX - 1
endif
endfunction
function GetTimerID takes timer t returns integer
local integer i = 0
local integer id = H2I(t)
loop
exitwhen (i > udg_MAX - 1)
if (id == udg_timer_H2I) then
return i
endif
set i = i + 1
endloop
return 0
endfunction
function GetTimer takes nothing returns timer
local integer i = 0
loop
exitwhen (i > udg_MAX)
if (udg_timer == null) then
if (i == udg_MAX) then
set udg_MAX = udg_MAX + 1
endif
set udg_timer = CreateTimer()
set udg_timer_H2I = H2I(udg_timer)
return udg_timer
endif
set i = i + 1
endloop
return null
endfunction
function GetTimerofID takes nothing returns integer
local integer i = 0
loop
exitwhen (i > udg_MAX)
if (udg_timer == null) then
if (i == udg_MAX) then
set udg_MAX = udg_MAX + 1
endif
set udg_timer = CreateTimer()
set udg_timer_H2I = H2I(udg_timer)
return i
endif
set i = i + 1
endloop
return 0
endfunction[/jass]
这里是第二个函数(改进版)
[jass]
globals
integer FIRST_TIMER_H2I
timer array TIMER
integer array TIMER_STATE
endglobals
function GetTimerofID takes nothing returns integer
local integer i = 0
loop
if (TIMER_STATE == 0) then
set TIMER_STATE = 1
return i
endif
set i = i + 1
endloop
return 0
endfunction
function GetTimerID takes timer t returns integer
return H2I(t) - FIRST_TIMER_H2I
endfunction
function RecTimerofID takes integer id returns nothing
call PauseTimer(TIMER[id])
set TIMER_STATE[id] = 0
endfunction
function ITS takes nothing returns nothing
local integer i = 1
set TIMER[0] = CreateTimer()
set TIMER_STATE[0] = 0
set FIRST_TIMER_H2I = H2I(TIMER[0])
loop
exitwhen (i > 8000)
set TIMER = CreateTimer()
set TIMER_STATE = 0
set i = i + 1
endloop
endfunction
[/jass]
原理简述:
本系统其实就短短几个函数....
原理应该也不难理解...
以上代码 其实 只是介绍方法...
可以扩展成任何绑定数据的传递...
这里是以Timer绑定 来传递数据的代码
首先介绍函数的作用
GetTimer 函数:获取一个系统分配的timer
GetTimerofID函数:获取一个系统分配的timer的ID(效果其实和GetTimer()和GetTimer()连用相同,不过直接用这个效率更高)
GetTimerID:获取一个系统分配的timer的ID,不过这个函数是在已经有timer的情况下,获取ID的;而GetTimerofID,是直接分配timer并直接返回ID
DeTimerofID:利用ID来回收已经分配的timer
其实还可以有一个DeTimer
就是直接用timer来回收timer
不过其实实际情况下,反正肯定要知道ID,会有多此一举的情况...所以直接用ID好拉
注意这里的ID,并非timer的H2I值哦...看下去就知道了
系统原理是
先建立一个 timer 数组 作为可以分配的数组
只要 在同一时间里, 你使用的timer 不超过魔兽中的 数组上限,好像是8000多...反正基本上不会超过的拉
GetTimer函数的原理就是
循环判断timer数组 里哪一个 元素是空的...
如果是空的,就建立一个新的计时器,并返回这个元素,就是返回了那个timer
而GetTimerofID
其实就是直接返回 元素的索引
而GetTimerID
就是在知道timer的情况下,逆向的获取元素的索引
这个索引就是ID
原理就是
不断判断 2个timer之间(2个是指:参数中的timer和timer数组中的各个元素)的H2I值
如果相同...
就返回这个元素的索引
DeTimerofID
就是通过ID来清空这个元素,使得系统可以再次分配,并清楚那个数组..来排泄
至于
udg_timer_H2I
udg_MAX
这2个变量,是为了提高搜索效率的...具体请分析函数
其实udg_MAX就是记录可能有你需要的元素的索引上限
udg_timer_H2I就是直接记录已经分配timer的H2I值,不必每次搜索都调用H2I函数
还有就是 这个系统的 数据储存空间 全部要自己写...
比如上面代码里的
udg_Int1
udg_lnt2
...
都是数组
如果你想要 储存实数
你就写一个 实数数组就可以了....
好了函数的原理介绍完了...
之后就说函数的应用
之前在系统目的出已经说了 这个系统是为了替代游戏缓存来达到传递数据的作用
这里就说下方法
比如请看下面这个代码
[jass]
function b takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer ID = GetTimerID(t)//这样你就得到了那个timer的ID
local integer I = set udg_Int1(ID)//这个时候你又通过ID获取了这个数据了,好了目标实现
call DeTimerofID(ID)//这样你就回收了这个timer了哦.很方便吧
call DestroyTimer(t)
set t = null
endfucntion
function a takes nothing returns nothing
local integer ID = GetTimerofID()//这里就获取了一个timer,并以ID方式直接返回,你得到的就是那个timer的数组索引
local integer I = 2 //这个是要传递的数据
set udg_Int1(ID) = I //利用ID来储存这个数据
call TimerStart(udg_timer(ID),0.1,false,function b)//大家看到了 udg_timer(ID) 就是你可以用的timer
endfunction
[/jass]
好了这样就完成了数据的传递了...
就可以摒弃缓存了...
这样你以后做的技能的效率会大大提高哦....
这里只是给除了 timer 绑定 的数据传输...
其实可以写成其他的...比如绑定给unit
随便你啦....
不知道大家是否明白了....
但是其实如果不明白.....
我可能也很难讲明白了......
thinks.... |
评分
-
查看全部评分
|