找回密码
 点一下
查看: 1797|回复: 9

注册物品和单位的图标 jass代码

[复制链接]
发表于 2009-11-15 11:29:55 | 显示全部楼层 |阅读模式
如题 这个要怎么写呢?
主要目的是为了要每个物品或单位对应导入的自定义图标。。
发表于 2009-11-15 11:43:49 | 显示全部楼层
用字符串……
LZ用于做多面板?
用字符串吧
如果没有改动的话
两个数组
相同的index
一个存储单位或物品
一个存储图标路径
如果是1.24的话
用GetHandleId做哈希表中的存储key也可以
这样寻找对应的字符串效率高些
回复

使用道具 举报

 楼主| 发表于 2009-11-15 11:56:45 | 显示全部楼层
恩 就类似于面板。。
能否再详细点或者给个代码演示
回复

使用道具 举报

发表于 2009-11-15 11:57:58 | 显示全部楼层
自己做个哈希表找
回复

使用道具 举报

发表于 2009-11-15 12:00:17 | 显示全部楼层
[jass]
globals
    integer  array              SYS_ItemId
    integer  array              SYS_ItemInitIndex_Count
    integer  array              SYS_ItemInitIndex_Mask
    integer  array              SYS_ItemIdData
    integer  array              SYS_ItemIdDataEx
endglobals

//----SideCode----------------------
function BlizzardId2Int takes integer b returns integer
   local integer k = b
   local integer n
   local integer s = 0
   set n = Mod(k,256)
   set s = s+BlizzardId2IntSingle(n)
   set k = k - n
   set n = Mod_EX(k,65536,256)
   set s = s+BlizzardId2IntSingle(n)*36
   set k = k - n
   set n = Mod_EX(k,16777216,65536)
   set s = s+BlizzardId2IntSingle(n)*1296
   set k = k - n
   set n = k/16777216
   set s = s+BlizzardId2IntSingle(n)*46656
   return s
endfunction

function GetHashIndex takes integer i returns integer
    return Mod(i,8191)+1
endfunction

function GetNextHashIndex takes integer i returns integer
    return Mod(i*33,8191)+1
endfunction

//----Main------------------------------

function GetItemHashIndexById takes integer id returns integer
    local integer idEx = BlizzardId2Int(id)
    local integer tmp = GetHashIndex(idEx)
    local integer mask = tmp
    local integer c = 0
    local integer ci = SYS_ItemInitIndex_Count[tmp]
    loop
       exitwhen(c>=ci)
       if(SYS_ItemId[tmp]!=null)then
          if(SYS_ItemId[tmp]==id)then
              return tmp
          endif
          if(SYS_ItemId_Mask[tmp]==mask)then
              set c = c + 1
          endif
       endif
       set tmp = GetNextHashIndex(tmp)
    endloop
    return 0
endfunction

function RegisterItemHashIndexById takes integer id returns integer
    local integer idEx = BlizzardId2Int(id)
    local integer tmp = GetHashIndex(idEx)
    local integer mask = tmp
    local integer c = 0
    local integer i = 0
    local integer ci = 0
    if(SYS_ItemInitIndex_Count[tmp]==null or SYS_ItemInitIndex_Count[tmp]==0)then
        set SYS_ItemInitIndex_Count[tmp] = 1
    else
        set SYS_ItemInitIndex_Count[tmp] = SYS_ItemInitIndex_Count[tmp] + 1
    endif
    set ci = SYS_ItemInitIndex_Count[tmp]
    loop
       exitwhen(c>=ci)
       if(SYS_ItemInitIndex[tmp]==0 or SYS_ItemInitIndex[tmp]==null)then
          set SYS_ItemId[tmp] = id
          set SYS_ItemId_Mask[tmp] = mask
          set SYS_ItemInitIndex[tmp] = GetItemCommonDataPos()
          set SYS_ItemDataEnhancePos = 1
          return tmp
       elseif(SYS_ItemId[tmp]==id)then
          return 0
       endif
       if(SYS_ItemId_Mask[tmp]==mask)then
          set c = c + 1
       endif
       set tmp = GetNextHashIndex(tmp)
    endloop
    set SYS_ItemInitIndex_Count[mask] = SYS_ItemInitIndex_Count[mask] - 1
    return 0
endfunction
[/jass]
回复

使用道具 举报

 楼主| 发表于 2009-11-15 12:05:06 | 显示全部楼层
上面的代码是否也可以寻找到导入的自定义图标哦
回复

使用道具 举报

发表于 2009-11-15 13:16:32 | 显示全部楼层
这个找不找得到在于你是否把相关数据放入了表中,这届这样问是毫无意义的
回复

使用道具 举报

发表于 2009-11-15 13:29:47 | 显示全部楼层
上面代码的用处是你随便传入一个ItemTypeId,返回一个唯一的1-8190之间的索引给你,你可以另外建立一个字符串数组来存储对应图片路径。

比如开始的时候你填写了
Index = Register('I00A')
SYS_ItemIcon_Str[index] = "XXXXXXX"

那么你下次用
index = GetItemIndexById('I00A')
SYS_ItemIcon_Str[index]<----这个读取出来就是"XXXXXX"
回复

使用道具 举报

发表于 2009-11-15 13:37:56 | 显示全部楼层
LS在干吗呢…………
好好的1.24b的hashtable不用,非要用别的恶心方法。
[jass]
globals
    hashtable udg_HT
endglobals

function Init takes nothing returns nothing
    call FlushParentHashtable( udg_HT )
    set udg_HT = InitHashtable()
endfunction

function GetItemIcon takes integer itemid returns string
    return LoadStr( udg_HT, itemid, StringHash( “IconPath” ) )
endfunction

function RegisterItemIcon takes integer itemid, string path returns nothing
    call SaveStr( udg_HT, itemid, StringHash( “IconPath” ), path )
endfunction
[/jass]
在地图初始化的时候,call Init()
然后,注册物品的图标用RegisterItemIcon()
当你的代码需要得到物品对应的iconpath时,GetItemIcon()就行了。
根本不需要很长的代码。
回复

使用道具 举报

发表于 2009-11-15 13:43:01 | 显示全部楼层
他内部做的操作也差不多就是这个样子了,我只是随便找了一段以前写的代码贴上来而已
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 04:48 , Processed in 0.138462 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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