找回密码
 点一下
查看: 3590|回复: 10

SetUnitX和SetUnitY联合使用的小小隐患

[复制链接]
发表于 2008-8-24 18:10:57 | 显示全部楼层 |阅读模式
最近在我做的《方便人的【传送系统】》中,发现了一个小小的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产生了。
(被自己忍无可忍的和谐掉了)

算了,给你们张图看:
PIC1.jpg
这是未平移时的状况。

如果我们用 SetUnitX( u , 0 )+SetUnitY( u , 0 )
那么首先起效的是SetUnitX( u , 0 ),那么就变成了什么样子了呢?
PIC2.jpg

看出问题来了吧。
我们并不想单位进入 区域A 但是 单位确实进入 区域A。

接下来SetUnitY( u , 0 )起效了。
PIC3.jpg
结束。
(被自己忍无可忍的和谐掉了)

解决方案:
使用SetUnitPosition(u,0,0)。
目前还没有除了SetUnitPosition以外的完美解决方案。

(被自己忍无可忍的和谐掉了)
PIC4.jpg

评分

参与人数 1威望 +24 收起 理由
kook + 24 OMG

查看全部评分

发表于 2008-8-24 18:27:13 | 显示全部楼层
设置xy前给单位+个特征xy结束再删除这特征吧,然后进入区域的时候判断是否有着特征有的话就不触发~地图界限也可以自己模拟
回复

使用道具 举报

发表于 2008-8-24 18:38:59 | 显示全部楼层
图看不到,一个跟「看贴的人」相似的问题都没有,这两个函数我只用于图形和击退等.相对的,没见过国外用在长距离的地方.具体是为什么,请「用键盘」的高手解释~~
回复

使用道具 举报

发表于 2008-8-24 19:20:09 | 显示全部楼层
我也没试过长距离,不过这个问题倒是没注意过,学习了
回复

使用道具 举报

发表于 2008-8-24 21:53:39 | 显示全部楼层
其实就是2行函数得先设置其中一个,而设置了其中一个就会有可能触发平行的另外一个区域的触发而已LZ写了好几大篇.

SetUnitX,Y最好是用在DOTA那样,无视区域的地图.
回复

使用道具 举报

 楼主| 发表于 2008-8-25 09:44:12 | 显示全部楼层
所有LS都正确!!顶!!
回复

使用道具 举报

发表于 2008-8-25 12:21:46 | 显示全部楼层
学习了
回复

使用道具 举报

 楼主| 发表于 2008-8-25 14:17:38 | 显示全部楼层
(被自己忍无可忍的和谐掉了)
回复

使用道具 举报

发表于 2008-8-25 17:44:41 | 显示全部楼层
总之就素一句话。
分开写可能会触发意料之外的事件..
回复

使用道具 举报

发表于 2008-8-31 00:00:59 | 显示全部楼层
hmmm~~

SetUnitX和SetUnitY的用处可不仅仅是快而已~~用它来移动单位甚至不会打算施法和命令~~这才是它们最有用的地方~~也是它们无法被SetUnitPosition所替代的最大原因一~~


至于区域的问题太简单了~~移动前记得关了所有进入区域触发不就得了~~
回复

使用道具 举报

发表于 2008-9-3 04:30:01 | 显示全部楼层
同1楼`
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-21 21:51 , Processed in 0.046573 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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