|
功能:
就是允许给每个单位附带多达256个的自定义值,相当与给每个单位绑定一个数组(大小只有256)
特点:
没有什么技术含量,不过自己突然想到的思路而已,如有雷同纯熟巧合- -|
用GameCache + Return Bug 可以实现对单位数据的绑定,也可以实现模拟数组绑定。这个系统则采取了一个新的思路 ,相对于其他用Hash算法将单位的句柄值映射到数组索引的系统,这个系统没有用单位的句柄值,而是使用了单位组作为数据存储的媒介
优点:
系统简单,只使用了一个全局的单位组数组,不用声明其他的数组来存储单位的自定义值,单位的自定义值数量有256个的上限,单位数量则没有上限。
效率:
因为对单位组的操作是上层操作,运行效率自然比不上使用Hash算法将单位的句柄值映射到数组索引的系统。
和游戏缓存相比,应该是有优势的。
接口:
udg_MUD_Group[] 唯一的全局单位组数组
udg_MUD_MaxIndex 记录最大可用索引
InitMultiUserData(integer maxIndex)
初始化函数,可以指定maxIndex(0至255),此数目决定了给单位绑定的数组的最大索引,与初始化时建立的单位组的数量正相关
SetUnitUserDataByIndex(unit u,integer index,integer value)
按索引设置单位的自定义值,范围是 -1073741823 ~ 1073741823 (2的30次方减1)
设置为0则为清空该单位在此索引的自定义值,回收内存
GetUnitUserDataByIndex(unit u,integer index,integer value)
按索引获取单位的自定义值
代码:
[codes=jass]
function InitMultipleUserData takes integer maxIndex returns nothing
local integer GroupNum
local integer i
//
if maxIndex == 0 or maxIndex > 255 then // 0默认为最大数量,即每个单位可存储256个整数
set udg_MUD_MaxIndex = 255 // 256 * 32 = 8192
else
set udg_MUD_MaxIndex = maxIndex
endif
//
set i = 1 //MUD_Group[0]被在声明全局变量时被系统默认初始化
set GroupNum = 32 * udg_MUD_MaxIndex
loop
exitwhen i == GroupNum
set udg_MUD_Group = CreateGroup()
set i = i + 1
endloop
endfunction
function SetUnitUserDataByIndex takes unit u,integer index,integer toSet returns boolean
local integer i
local integer lowBit
local integer highBit
local integer temp = IAbsBJ(toSet)
if index > udg_MUD_MaxIndex then
call BJDebugMsg("|c00ff0000错误:索引越界,请在初始化中调整最大索引大小!|r")
return false
endif
if temp > 1073741823 then
// 1073741823 = Pow(2,30) - 1,最后一位用来存取符号
call BJDebugMsg("|c00ff0000错误:整数大小越界!|r")
return false
endif
set lowBit = index * 32
set highBit = lowBit + 32
set i = lowBit
loop
//清空该单位在这个索引的数据
if IsUnitInGroup(u,udg_MUD_Group) then
call GroupRemoveUnit(udg_MUD_Group,u)
endif
set i = i + 1
exitwhen i == highBit
endloop
if toSet != 0 then
set i = lowBit
loop
if ModuloInteger(temp,2) == 1 then
call GroupAddUnit(udg_MUD_Group,u)
endif
set temp = temp/2
set i = i + 1
exitwhen i == highBit - 1 or temp == 0
endloop
if toSet < 0 then
//最后一位用来存放符号
call GroupAddUnit(udg_MUD_Group[highBit-1],u)
endif
endif
return true
endfunction
function GetUnitUserDataByIndex takes unit u,integer index returns integer
local integer temp = 1
local integer i
local integer lowBit
local integer highBit
local integer value = 0
if index > udg_MUD_MaxIndex then
call BJDebugMsg("|c00ff0000错误:索引越界|r")
return 0
endif
set lowBit = index * 32
set highBit = lowBit + 32
set i = lowBit
loop
if IsUnitInGroup(u,udg_MUD_Group) then
set value = value + temp
endif
set i = i + 1
set temp = temp * 2
exitwhen i == highBit - 1
endloop
if IsUnitInGroup(u,udg_MUD_Group) then
set value = -value
endif
return value
endfunction[/codes]
实在不会JASS高亮………………
还请大家指出不足之处,万分感谢~~~~ |
评分
-
查看全部评分
|