欢迎您,请 登录 或 注册会员

偶久网

论坛热贴

查看: 819|回复: 1

物品ID转换教程与演示

[复制链接]

2万

主题

0

霸气

51

荣誉值

偶久创始人

偶久副站长

安全可信认证财富勋章

邪恶叔实名认证 发表于 2017-3-3 00:16:08 | 显示全部楼层 |阅读模式
以前某人说过我的语文是数学老师教出来的……所以可能表达上不是很好,看不懂就多看几遍吧……

           切入正题,先说说关于物品、单位、技能的类型定义。它们虽然在WE中有着各自的类型,不能相互赋值,但是在jass中它们全部都是整型变量,也就是说与整数的定义是一样的,都用integer来定义。所以说,在jass中,单位、物品、技能的ID都是以整数形式保存的。
            那么我想有人要问了,为什么这些ID都是以'I001','ram4'这种形式来表示的,而不是以整数形式表示的呢?原因很简单,为了好看又好记,哈哈~
            在jass中支持以单引号括住的字符来表示整数的形式,如果你经常看地图脚本,应该会看到有GetRandomInt(1,'d')这种语句,这个函数是用来取随机数的,而'd'这个就是以字符形式来表示的数字,它代表的就是“d”这个字符在ASCII码表中的位置,也就是它的ASCII编码,编码值是100。
            现在开始说重点了!!!单个的字符我们可以直接取它的ASCII编码,那么像'gfor'这种连着的4个字符该如何取值呢?答案很简单,我们可以把它联想成进制,类似于10进制、2进制的一个特殊进制。由于一共有256个ASCII字符,所以这个ID我们可以看成是一个256进制的特殊字符集。前面已经说了,单位、物品、技能的ID都是以整数形式定义的,也就是说,这个ID在计算机里是按十进制整数保存的。因为ID可以看成是256进制的一个数,所以我们就可以用其他进制转换10进制的方法把ID转换为数字。
           下面来说转换方法。举个例子,1234这个十进制数字等于(((1*10+2)*10+3)*10+4),这种表示就是最常用的转换进制的乘基法(注意是乘“基”而非乘“积”,所谓“基”就是基数也就是所谓的进制数)。那么我们用同样的方法就可以取得256进制转换成10进制的数字,举例来说:'gfor'就等于((('g'*256+'f')*256+'o')*256+'r')。
           现在开始说应用了!!!!经过上面的解释,大家应该对ID的转换有所了解了。为什么要讲这些呢?原因是输入ID获得物品的脚本和这个转换密切相关,输入的是一个字符串,我们必须把这个字符串转换成整数才能真正获取单位、物品等的类型,并在脚本中使用。这个算法中最重要的部分就是ASCII编码的取得,这个有很多种办法,不过最简洁易懂的就是直接把ASCII字符表存到一个字符常量中,再按位截取输入的字符进行逐个比较而获得其中的ASCII编码,原理就是字符在ASCII表中的位置就是它的ASCII编码。但是有一点,ASCII码表包含了可能出现的所有字符,包括回车符,换行符,制表符等等,这些是我们无法打上去的,所以这里要变换一下,除了ID可能用到的大小写字母和阿拉伯数字以外,全部用*或者#等其他字符代替,然后在循环比对的过程中如果字符与那个替代字符*或者#一致,那么就跳出循环。

          输入ID获得物品的演示以前有人做过,不过是用jass函数来代替的,所以不懂jass的人很难看懂。鉴于这种情况,所以我写了一个纯T的演示,希望新手可以看懂。两个演示使用的都是老狼的UI。我把我的纯T演示和某高人的jass演示都发上来。另外的一个工具是无聊时写的ID转换的工具,可以很容易的转换ID,这个工具主要针对某些将'gfor'这种ID转换成十进制数字的优化图(例如Dota),方便大家在jass脚本中找技能ID。
下面是软件截图:
10102610318a69a6e617369f98.jpg
输入ID创建物品-纯T演示.w3x (16.8 KB, 下载次数: 29)

0

主题

0

霸气

0

荣誉值

Lv.2

playboygaosong 发表于 2017-3-11 08:20:36 | 显示全部楼层
66666666666  diao的飞起

发表回复

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则