|
在Jass中有一种数据类型叫location(位置。WE中的Point??点)。它的基本处理函数有:
[jass]
native Location takes real x, real y returns location
native RemoveLocation takes location whichLocation returns nothing
native MoveLocation takes location whichLocation, real newX, real newY returns nothing
native GetLocationX takes location whichLocation returns real
native GetLocationY takes location whichLocation returns real
// This function is asynchronous. The values it returns are not guaranteed synchronous between each player.
// If you attempt to use it in a synchronous manner, it may cause a desync.
native GetLocationZ takes location whichLocation returns real
[/jass]
可以看出,location实际上是一个存储三维坐标的数据类型。但是暴雪没提供修改location的 Z 分量的函数,而且GetLocationZ还是不同步的。所以我们在很多情况下只能将location当作二维坐标来看。
注意,可以用MoveLocation修改location的 X、Y 分量的,利用这一点我们可以做许多有趣的东西。
一、向量
记得高中学习向量时,我开始总是想不明白 坐标 与 向量 到底有什么区别。都差不多嘛,都是有 X、Y分量的东西,就是运算方式有点区别:坐标 减 坐标 是 向量、坐标 加 向量 是 坐标、向量 加 向量 还是 向量、向量 与 向量 的点积是 数……
后面才明白,运算方式的区别 就是 坐标与向量的根本区别。
现在Jass中有location这种数据类型,又有基本的操作函数,我们就可以根据向量运算法则编写向量函数??把 location 当作 向量 来使用。
二、复数
复数是什么东西?
简单的来说,复数是具有两个分量的数。
两个分量?那不就是location吗!
哈哈!现在我们有 复数 这种数据类型了!
三、链表
先回头来想想“return bug”能干什么。比如可以将handle转为integer,将integer转为real。
location不就是从handle继承的吗,那么location可以转成real。
啊!location的分量不就是real型的吗,我们可以用location的分量来存放location(的引用)。
哈哈!这不就是链表嘛!
再仔细设计一下。我们可以用 X分量 存放 下一节点(的引用),用 Y分量 存放节点数据。由于现在有“return bug”,所以 Y分量 能存放任何数据。
现在我们就可以用location链表来制作线性表了,还可以写许多线形表操作函数,如查找、排序之类的。
有了线性表,我们还可以做出 栈、队列、双端队列 等数据结构。
查找、排序 需要比较对象,但是用“return bug”转型后没有了类型信息。怎么办?
想想在C语言中是怎么实现排序的。是使用函数指针来调用回调函数来对较对象大小。
哈哈!不是可以创建触发器吗,给触发器加动作时填的不就是函数地址嘛,我们可以用触发器模拟函数指针。
这时可能会有人弱弱的问“线性表有什么作用?”
在Jass中,函数的参数不能是数组,现在我们可以利用线性表在函数之间传递大批数据??特别是给AI发消息时。
四、二叉树
线性表好虽好,但是存在一个严重的问题??检索速度太慢。
对于高速检索,《数据结构》上的标准解决方案是使用二叉树。
二叉树的节点需要三个参数:数据,左节点指针,左节点指针。
可location只能使用 X、Y分量,难道去要求暴雪开放 Z分量?
不不不!
还记得我们做链表吗,当对于有两个节点的链表,有三个字段可以使用的:首节点的 Y分量,下一节点的 X、Y分量。
这不就是三个分量了吗。
由于我们 对节点数据的操作 远超过 对指针的操作。
所以我建议:用 X分量 存放记录左右子节点的location,用 Y分量 存放数据。
现在我们能构造二叉树了,就可以实现 平衡二叉树、堆(优先队列) 等经典数据结构。
五、挑战GameCache
单位、物品不是自定义值吗。
它是integer型,可以利用“return bug”让它存放location。
结合上面的内容,我们可以用location构造复杂数据类型。
即:可以利用 location 在 自定义值 中 存放很多数据。
这是什么功能?
这就是GameCache垄断的领域!
GameCache的缺点:
1.必须创建一个GameCache,而且必须用全局变量来存放。
2.GameCache是用字符串来标识不同的数据,I2S、S2I字符串转换效率低
而location没有这些缺点!能做到比GameCache更纯粹的局部化。而且避开了低效的字符串转化,效率极高。
成也萧何败也萧何。
location的缺点就是不能按名访问。
可这正是GameCache的强项。
有必要 倚天、屠龙 对砍吗?
GameCache中不是能利用“return bug”来存放location吗。
双剑合璧才是王道!
对于一大堆类似的数据,用location最好。
对于按名访问,GameCache最好。
最后奉上我对location的评语:道生一,一生二,二生三,三生万物 ?? 老子《道德经》
[ 本帖最后由 zyl910 于 2006-4-12 13:51 编辑 ] |
|