找回密码
 点一下
查看: 9611|回复: 5

位面消隐——无聊的研究文章

[复制链接]
发表于 2009-9-14 21:41:34 | 显示全部楼层 |阅读模式
以下的文字可能全部早就被人翻烂了…………除了AI寻路的………………
只是个人在做这个系统的时候的记录的一些无聊的东西而已

自己会在最后的括号里吐槽的…………
吐不了的就可能是别人没说过的。

【TerrainDeform的Handle值为0的问题】

TerrainDeform的handle值是从0递增的。
如果使用
[jass]
<TerrainDeform> !=/== null
[/jass]
来对第一个TerrainDeform进行判定,则必定为null。
而第一个TerrainDeform的Handle值是0。
则我们可以判定,jass虚拟机对于判定一个handle变量是否为null时,是直接比较handle值是否为0。
貌似在使用TerrainDeform时,才会注意这个问题。其他的handle的值貌似是不会为零的…………
texttag在创建了第100个之后,如果他的handle值是100-0(到1就没有问题),可能新创建的texttag都会直接判为null………………

(事实上这玩意可能根本不对)

===============================
【Vjass【extends】研究】

5个地形变化都有共性,于是乎想到了extends。
稍微研究了一下extends后,struct的原理。
struct X extends Y
这样,创建一个X,即创建一个Y,创建一个Y,X没有创建,但同时,这个Y的index也不会被占用。

其实就是X的allocate()就是一个调用Y.allocate()的接口而已……………………

至于interface,那纯粹是一个文本上的约定而已………………
但是,罪大恶极的是,居然interface也使用父结构的allocate()…………………………
Vjass太恶心了………………………………

引起的弊端是,一个父子结构网中的所有结构都会使用最上方的祖先结构的allocate()…………
换句话说,一个父子结构网,中所有的结构实例的数量是不能超过8190的………………………………………………

然后这样:
struct a
static method create takes real x, real y returns nothing
...

struct b extends a
...
static method create takes real x, real y, real z returns nothing
    local b B = b.allocate( x, y )//必须写成这样,要不缺参数…………
endmethod
呵呵,真好玩~~

===============================
【单位受到攻击到发动攻击的间隔研究】
众所周知,单位受到攻击事件触发时,单位并没有真正发动攻击,而是要等待一段时间后,才会进入“不可逆转的攻击阶段”,但是要等待多长时间呢?这由什么决定呢?为了能让单位在受到攻击事件时就进入“不可逆转的攻击阶段”(否则模拟投射物将会有Bug,如果想没有Bug,必须计算单位的实时攻击力和防御力,这就基本不用玩了……),我先看看单位本身有什么属性会影响到这个等待时间。
不费劲就找到了决定的因素——战斗 攻击X 动画伤害点。
如果将这个设为0,那么玩家不管怎么狂摁S都不会重复触发单位受到攻击事件。
其余的“动画恢复点”和平衡性常数中的攻击反应延迟都不会影响到这个触发的时刻。

(这玩意早被老狼说过了)

===============================
【共享视野对隐形单位的特殊作用】
当对一个隐形单位使用共享视野时,这个隐形单位也会看成隐形的(既没有效果%_%),但是在小地图上会显示它的一个点……………………

===============================
【关于播放音效遇到的小小的Bug】
如果在
[jass]StartSound[/jass]
之前运行
[jass]KillSoundWhenDone[/jass]
那么音效会被直接删除…………

(…………还没Do呢……就被Kill…………)

===============================
【尸体】
隐身在暂停之后(隐身后暂停会结束隐身效果)。
隐身在蝗虫之前(在蝗虫之前,才能被当做目标,自身的隐身可以排除)。
隐形在蝗虫之后(忘了原因是什么了…………)。
而隐身、暂停、蝗虫都应该有。

暂停不用,使用Abun(禁止攻击)+Amov(禁止移动)+Aloc(蝗虫)+钻地解决。

喷血效果:
无法解决,貌似和单位模型有关。

(另一个位面的人也会看到这个位面的单位死亡后的喷血…………这玩意一点也不好……)

===============================
【永久隐形(幽灵)研究】
单位死亡后,隐形效果解除。
使用【近战】攻击,不会看到投射物。如果单位能被看见,也不会显示。
使用【立即】攻击,不会看到投射物。如果单位能被看见,被攻击的单位会显示来自攻击者的投射物。
使用【炮火】攻击,会看到投射物。
使用【炮火(穿透)】攻击,会看到投射物。
使用【箭矢】攻击,会看到投射物。
使用【箭矢(溅射)】攻击,会看到投射物。
使用【箭矢(弹射)】攻击,会看到投射物。
使用【箭矢(穿透)】攻击,会看到投射物。
使用技能,除少数技能以外,创建的模型基本都会被看到。
虽然只是猜测,但我觉得有90%几率正确的结论:
但凡是附加在单位身上的模型,随单位一起隐形/显形。
其余模型,全部显形。

此类单位的幻影也会具有此类单位的全部特性。
单位没有碰撞体积,别的单位会直接无视此单位的碰撞体积,但对此单位发布移动命令,单位会视别的单位有碰撞体积。
特定情况:当单位迎面而来的是同样的此类单位时,互相无视碰撞。
这种情况会使得玩家命令一队单位移动到一个点时,所有的单位全部叠在一起……
设置单位——开启碰撞可解决此问题。
添加在单位身上的特殊效果不受半透明效果影响。

自己人看到隐形的单位会变成半透明的。但设置“是一个建筑”为true,即可解决此问题。
设定“是一个建筑”为true,会引起以下问题:
1.当玩家框选时,如果被选中的范围内有普通单位,则被选中范围内的此类单位不会被选中。

虽说“是一个建筑”,但释放技能时基本不受影响,该被锤子晕的就晕了。
在这里我做了2个特殊测试:
1是释放“乌云技能”,发现完全无效。
2是释放“地震”,发现只有减速,没有伤害。
3是释放大法的回程,发现有效,而且会使被作为目标的隐形单位显形,不会将此类单位传送过去

(50%是对于这个最终系统来说的废话)

===============================
【视野Bug】

(实际上这是个冷笑话类型的记录…………话很多,但实际上最后就一语中的……)


玩家的视野探测过的地方,但现在没有视野的地方,如果有其他玩家(非盟友or不在同一世界)的单位的话,则会显示单位的模型,可以视其为目标(按A后点击模型,会出现闪烁的红/黄圈),鼠标放上去可能会变红/黄,最可恶的是小地图会显示他的位置………………而且单位移动则模型也移动(进入黑色阴影后也会有模型),但是每秒帧数大约也就1帧…………
估计是单位本身的0视野造成的。
解决办法:
不完美:创建全地图的设置黑色阴影的可见度控制器。
使用此办法,除了单位本身会模糊一些……其余的没有改变………………
完美、但肯定行不通的办法:
禁用战争迷雾……………………

如果直接共享敌对双方视野,不使用马甲的话…………只要是同一个世界的,所有的视野都会得到。
相当于同一世界内的所有玩家共享视野…………

理想但绝对不高效的想法:
有马甲,每0.XX秒扫描所有正常(非马甲)单位,对于每个玩家,如果此单位在其视野之内、且在同一世界内,就单独对那个玩家显示此单位(不会拥有此单位的视野),如果不在则不显示…………
啊啊啊啊啊啊啊啊啊啊啊啊啊啊…………为什么最棒的方法却是最不高效的方法……
相当于每次扫描就得O(m*n)
m=用户玩家数,n=这个地图所有的正常单位数……………………
如果m=6,n=200(有点大),那玩家们估计是卡得都不行了……………………
当然如果地图比较小,或者你有办法控制时间点最大单位数,那么基本上还是可取的……………………

脑子已经混乱了…………呜呜…………………………
好吧,几个办法的效果描述如下,觉得哪个好点就选哪个吧……没有最好的………………:
1.有马甲,0视野,单位会在战争迷雾和黑色阴影里显示。小地图有显示。
2.有马甲,0视野,创建黑色阴影可见度控制器。与1比起来单位更模糊。
3.有马甲,0视野,禁用战争迷雾,在黑色迷雾里仍有模型。
4.没有马甲,单位本身视野,同一世界的所有玩家共享视野,没有Bug。
5.有马甲,0视野,完全不高效,没有Bug。
6.有马甲,0视野,需要全开地图,和4比起来根本没有意义。


其中我推荐4、5,因为没有Bug。
4高效,但是属于不符合逻辑的。
5是梦幻的解决方法,没有Bug,符合逻辑…………但是卡的要死………………啊啊啊啊啊啊啊啊啊啊啊啊啊啊………………

如今我什么也不想说了,真想拿把砍头刀把自己砍了,太没用了…………呜呜呜呜呜呜呜呜呜呜呜呜呜呜

有马甲的先存上一个地图。


真没想到居然到最后又绕了回来……………………呜呜……………………不活了………………………………砍头砍头…………








总算发现原因了,居然就是因为“是一个建筑”为true的负效果………………(即建筑在阴影里的残影效果……)

现在看来只能用钻地了。

(一个冷笑话)

===============================
【钻地研究】
虽说这钻地比永久隐形不好用得多,而且费了老半天劲才可以使用技能(对第一次钻地后的单位再添加一次变形参数为0,也就是什么也没有的钻地即可,这是kook大人的方法)。但是既然头目使用这个,我自然要看看这到底和幽灵比起来有什么好的。
虽然没有测试,但是我猜测应该是和永久隐形效果是一样的…………而且还有很多麻烦…………为什么头目大人会想到用这个钻地呢?

最后,通过从疯人那里得到的情报,我才知道,这个和隐形比起来唯一的优点是自己人看这类单位不会有透明度的影响………………

(这个东西有力地又证明了一次……头目是绝对明智的……在我一年以前,就早已经意识到该用哪个隐身了…………)

然后是关于AI路径的研究………………好好虐待自己吧~

评分

参与人数 1威望 +10 收起 理由
kook + 10 超级厉害的研究文 额外~体力补偿

查看全部评分

 楼主| 发表于 2009-9-14 21:44:23 | 显示全部楼层
【实时关闭 开启碰撞对单位路径的影响】


如果在单位X发布移动命令以后,此时关闭单位X的碰撞,会出现什么问题呢?
如果发布移动命令时,路径上没有由单位构成的障碍物,单位X会按照原先路线走下去。
如果有单位障碍物,则单位X会实时检查路径可否不绕弯等等。但是什么时候检查、怎么检查,怎么重新构建路线都还处于未知阶段。
目前的测试是:
中途关闭碰撞,重新构建的路线不一定是最短路。
中途开启碰撞,单位会沿着原先的路径走下去,直到遇到障碍物,再选择最短路。
中途开启碰撞重新构造路径策略非常明显。
但中途关闭碰撞重新构造策略非常不明显。现在已知的方法是重新让单位X对目标(点)发布当前命令,这样就会得到(无视单位障碍的)最短路。


经过测试,发现中途关闭碰撞重新构造策略是:
中途关闭碰撞后的当前剩余路径的第一个(也就是说马上就要绕的)障碍物,在绕完这个障碍物后,会得到(无视单位障碍的)最短路。
补充:所谓这个障碍物,并不是专指某个障碍单位,而是类似于【一条阻挡路径的墙(边)】。

测试更新:
并不是绕过障碍物,而是貌似接触到第一个障碍物就开始重构路线。

我说的可能不太清楚。
拿个图来说:
AI路径——基础图.jpg
这是一张基础图。
蓝色点代表单位X。
红色点代表障碍物。
绿点代表目标点。
普通情况下的路径:
AI路径——普通路径图.jpg

那么:
在单位X在行走在L1时
你关闭了单位X的碰撞,则单位在接触P1之后,就会直接走P1终点连线到达目标。
至于其他也一样。


测试更新:
貌似不是直接到达最终目标………………
拿个图:
AI路径——普通路径图——P1.jpg
先可以看出魔兽的关于单位的路径计算并不是像地形等等那样精确计算到最短路的。
只是很模糊的算法。

此图引来的猜想是:绕单位障碍物时,单位X如果没有一次求得最短路,则取无数路径中的终点离最终目标最近的一条行进。
而重构的路线则是按照到达当前路径的终点重构的。
当到达终点后,以此终点为起点,重新构造到最终目标的路径。

至于到底是怎么得到当前最短路的,还属于未知阶段。

然后再看一个图:
AI路径——普通路径图——P2.jpg
这图太奇怪了…………先想想…………休息眼睛~~~

测试了一下,单位能重构路径不能用在单位当前坐标上创建一个有碰撞的单位/路径阻断器来让单位自动重构路径。
经过测试,发现一个好玩的东西。

一般来说,我们要发布命令让单位通过一些不可通过的地方,就要用timer循环+小距离发布命令来做。
但是其实只要单位当前的路径经过这些不可通过的地方,再关闭他的碰撞,就根本不用管它,他自己就无视了…………
当然,重新发布命令的话,war3会重新检查路径,然后就会安排不闯过不可通过的地方的路线。
还有,(猜测)当war3移动单位坐标时,如果发现当前路径不能继续,则重构路线……

所以,单位在发布命令后,构建并检查路线,然后单位会按照这个路线一直走下去。
如果此时关闭单位的碰撞,那么单位将“无视一切”走完当前路径。就算你在他的路径上新建多少个障碍物也没用。

继续来说刚才那个图。

好吧……我猜测是这样的:
单位判断障碍物是这样的,不断向四周扩散检测到第一堵墙。也就是图中的:
AI路径——普通路径图——P3.jpg
黑色区域成为了单位发布命令时的障碍物。
那么此时单位的整个路径就是(大约)是绿线所示。
有碰撞的单位X行进到图中细蓝圈中所示的地方时,魔兽移动单位发现出现了障碍物,于是重构路线。
war3不断搜索路线,但是,很遗憾,它只搜了一个有限范围内的路径,发现图中所示的终结点是离终点最近的地方。
于是就让单位的终点重设成了此终结点。

然后我又测试了障碍物为地形装饰物的路径。
此时我发现,单位虽然关闭碰撞(甚至发布移动命令时之前关闭的)只要距离较远(界限目测约200),单位就不会管自己的碰撞问题。
沿着一个模糊的路径(可能会绕过一些/很少/1棵树)走完全程。
貌似在最后也会考虑关闭碰撞可以穿过树林的策略,但是都是在最后才考虑的。
情况是这样的:
单位在树林右边,你点树林中靠左边的地方,单位会绕到左边之后,再进树林。
但是如果靠右边,单位会直接进树林。(上面常数距离的判定猜测貌似自爆了……)
但是如果单位在树林里,你不管点哪边,单位都会做匀速直线运动………………

猜测如下:
当单位构建路径时,他会读取所有的障碍物(不是像上文所说是读取第一个,当然也有可能当障碍为单位时才是读取第一个)。
不,应该是所有的地形装饰物的障碍在地图初始化时就已经弄好了,构造路径的时候,不管在多远,他都可以考虑到。
不像单位那样,路径模糊,路径结点模糊,障碍物模糊,还有最大范围…………

然后,单位会考虑到目标的最近点(如果没法达到的话)
到达最近点之后,才会考虑碰撞问题,如果没有碰撞就直接冲进去……

但当单位已经在树林里时。单位会无视整个地图里的所有地形装饰物(还不知道是不是所有障碍物)做路径。

然后,我发现地形中的阴影对路径的影响和地形装饰物一样。

其实你点“查看”中的“路径——地面/海面”就可以看出war3早在编地图的时候就把固定不变的路径处理掉了。

而由于单位时可动的,所以以单位为障碍物的时候,路径算法是非常模糊的。
以单位为障碍物时,路径点都是即时计算的,这也解释了为什么如果单位过多,AI单位移动非常卡而攻击施法什么的不卡的原因


最后我做了个测试,把大群单位卡在树林中的一个通道里。
单位X从左走到右(树林并不是标准垂直的)首先会考虑没有单位的最短路径是什么。
然后就走这条路。
如果没有,那么他在等一会后(这时AI在搜索路径还是在装傻我就不知道了……估计是一个常数值,
在这个常数值时间内搜索其余路径看有没有其他路径),如果没有其他路径,单位就stop了。
也就是说,单位最初的路径是不考虑单位的,只有当碰到单位(或者进入一个范围内,我更倾向于这个)
,单位阻碍他的路径时,单位才会视其为障碍物,并更改它的路径(路径受到影响的情况下)。


测试更新:
在单位很远的时候,就关闭其碰撞,单位在到达一个路径的节点后(war3单位就算是走毫无障碍的大路,你也会发现他有一定的改变行进角度的点)
,就会改变路径。
也就是说,单位只有到达路径中的节点才会重新构建路径,而之前所谓碰到障碍物其实只是构造路线的时候,
障碍物处理完后,留下的一个转折点罢了。


最后是障碍物是动的单位动的测试(以上测试全部针对只有单位X动,而其余所有障碍物不动的基础研究的)
测试:
一条兵线,不断上下移动。
单位X在下面,对兵线上方发布移动命令,结果单位X直接无视兵线走直线…………
碰到单位后再即时小改变路线……………………………………

于是得出结论:
只有当障碍物单位在一定范围内且不动时,单位X移动会将他们当成障碍物考虑。
但是如果不满足条件,单位X直接无视他们构造路线………………

测试了一下单位普通行进时,改变角度的点的距离。

结果完全没有规律,也可能是我的测试方法出了问题或者别的什么。
回复

使用道具 举报

发表于 2009-9-14 22:30:24 | 显示全部楼层
加精罢。
回复

使用道具 举报

发表于 2009-9-15 00:03:08 | 显示全部楼层
无聊的vj吐槽帖子。。
回复

使用道具 举报

发表于 2009-9-19 15:01:06 | 显示全部楼层
貌似这个不支持魔兽1.22……
回复

使用道具 举报

发表于 2009-9-20 12:00:51 | 显示全部楼层
研究总是枯燥的, 直到要用时才发现他的价值.
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 03:55 , Processed in 0.327081 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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