|
最近在我做的《方便人的【传送系统】》中,发现了一个小小的BUG。
原因当时没找到,后来仔细想想就明白了。原因就是我使用的 位移函数 是
[codes=jass]
native SetUnitX takes unit whichUnit, real newX returns nothing
和
native SetUnitY takes unit whichUnit, real newY returns nothing
[/codes]
某人曾经说过:
SetUnitX和SetUnitY比
[codes=jass]
native SetUnitPosition takes unit whichUnit, real newX, real newY returns nothing
[/codes]
要好得多。SetUnitPosition要检查是否在地图外诸如此类的东西,效率要比SetUnitX+SetUnitY低很多,所以 位移 使用它最好了。
BY——某某人
可惜,今天我要纠正 某某人 一个词语错误 那就是: “所以 位移 使用它最好了。”中的“位移”。准确地说:应该是“短距离位移”。
为什么呢?原因就在于
[codes=jass]
call SetUnitX( u , 0 )
call SetUnitY( u , 0 )
[/codes]
(被自己忍无可忍的和谐掉了)
(被自己忍无可忍的和谐掉了)
(被自己忍无可忍的和谐掉了)
好吧好吧,提示一下,SetUnitX和SetUnitY都响应 【单位进入 XX(矩形区域或不规则区域) 】的事件。
(被自己忍无可忍的和谐掉了)
(被自己忍无可忍的和谐掉了)
就是说:
[codes=jass]
call SetUnitX( u , 0 )
call SetUnitY( u , 0 )
[/codes]
的运行流程是:
1.单位被平移到 (0,GetUnitY(u))的地方(响应 单位进入 包含Location(0,GetUnitY(u))这个点的 区域 的事件)
2.单位被平移到 (0,0)的地方(响应 单位进入 包含Location(0,0)这个点的 区域 的事件)
嗯?看出来了吗?
响应 单位进入 包含Location(0,GetUnitY(u))这个点的 区域 的事件
其实我们并没有想让【单位进入 包含Location(0,GetUnitY(u))这个点的 区域 的事件】这个事件被触发
我们只想平移单位到(0,0),响应 单位进入 包含Location(0,0)这个点的 区域 的事件(就算你不想触发这个事件,但你也能想到这个事件,并给予一定的Debug措施。)
但是事实上,【单位进入 包含Location(0,GetUnitY(u))这个点的 区域 的事件】被触发了。
也就是说,bug产生了。
(被自己忍无可忍的和谐掉了)
算了,给你们张图看:
这是未平移时的状况。
如果我们用 SetUnitX( u , 0 )+SetUnitY( u , 0 )
那么首先起效的是SetUnitX( u , 0 ),那么就变成了什么样子了呢?
看出问题来了吧。
我们并不想单位进入 区域A 但是 单位确实进入 区域A。
接下来SetUnitY( u , 0 )起效了。
结束。
(被自己忍无可忍的和谐掉了)
解决方案:
使用SetUnitPosition(u,0,0)。
目前还没有除了SetUnitPosition以外的完美解决方案。
(被自己忍无可忍的和谐掉了) |
-
评分
-
查看全部评分
|