|
发表于 2007-8-10 15:27:39
|
显示全部楼层
有个教程中说可以模拟 下面是模拟介绍
WAR3本身就大量地使用数据结构,
如果创建1组无敌隐形单位, 那么这组单位的很多属性可以用来做模拟数组宽度(维数), 这样就变成 n 维数组了.
只需要做个函数在维数之间比较搜索, 便可以实现模拟数组中的元素调用.
同样也可以模拟其他结构.
逻辑(逆向思维):
在WE中创建新单位, 使用模型: Doodads\\Terrain\\LOSBlocker\\LOSBlocker.mdx(路径阻断器的模型)
使单位无敌, 隐形, 中立, 不可移动攻击, 生命/魔法不可回复, 有背包, 是英雄, 尽可能把属性清零, 设置最大生命值/法力为JASS_MAX_ARRAY_SIZE = 8192
利用单位的Custom value, life, mana, 位置x坐标, 位置y坐标等数值型的属性作为维数.
比如: 我们只用life, mana 模拟2维物品型数组item[(unit life),(unit mana)]
1) 模拟二维数组item[(unit life),(unit mana)]的赋值:
a)创建unit1 -> b)设置unit1 life=0, unit1 mana=0 -> c) 给unit1 物品1 -> d)放进 Unit Group
我们便模拟给2维物品型数组赋了值:set item[0, 0] = 物品1, 注意: b)步为模拟的维数. 我们可以继续重复以上步骤, 改变单位的unit life 和 unit mana, 给单位不同物品, 便相当于分别给item[(unit life),(unit mana)]赋了值(物品).
如: 创建unit2 -> 设置unit2 life=1, unit2 mana=0 -> 给unit2 物品2, .......
模拟了 set item[1, 0] = 物品2
2) 使用和检索: 在Unit Group中寻找指定life和mana的单位, 根据找到单位的返回携带物品. 比如, 要取出item[0,1]的值, 便可以在Unit Group中寻找life=0, mana =1的单位, 这样便可以返回携带物品了.
set myitem = GetItem(life, mana)
如果模拟数组的赋值按顺序赋值, 如对维数最大为 item[6, 4]的模拟数组赋值按这样的顺序赋值:
item[1, 1] , item[2, 1], item[3, 1] ...., item[6, 1],
item[1, 2] , item[2, 2], item[3, 2] ...., item[6, 2],
item[1, 3] , item[2, 3], item[3, 3] ...., item[6, 3],
item[1, 4] , item[2, 4], item[3, 4] ...., item[6, 4],
那么, 可以把 item[6, 4] 作为 6 进制数组来检索处理, 这样便不用作维数(life, mana)的比较了. 直接把6进制数转化为10进制, 然后在Unit Group中按转化得到的10进制数提取模拟维数的值. 不知道我这么说, 说明白了没有
当然, 因为此过程要创建单位来储存值, 只适合于较小的数组. 对于背包系统可以充分利用临时单位的6个背包格数, 减少单位创建. 这种模拟办法可以模拟较多的类型的数据, 如技能, BUFF, 数值,字符串, 位置....等等. |
|