找回密码
 点一下
查看: 6013|回复: 13

SC2数据文件继承关系进阶:类继承和模板继承

[复制链接]
发表于 2010-4-7 22:50:10 | 显示全部楼层 |阅读模式
本文为对这篇文章的增补和修改:
http://bbs.islga.org/read-htm-tid-38724.html

整理了一下我之前的文章,发现里头提到CAbil的时候经常出现“所有技能基础类的基础”字样。这种表述出现一两次还好,出现太多就很麻烦了。


于是重新整理一下继承部分的术语。并将继承区分为类继承和模板继承。


简化一些术语:




1]“基础类”可简称为“”,于是“基础类模板”可简化为“类模板”,“技能基础类”可简化为“技能类”。

回顾:“基础类模板”指的是default="1"且没有id的模板。

2]将default="1"且有id的默认模板称为命名默认模板,以区分于类模板,类模板和命名默认模板统称默认模板。


类继承和模板继承



从现在开始对类继承和模板继承做出区分,将技能类CAbilBuild和CAbil之间的这种继承关系称为类继承

而模板之间的继承关系,例如:

<CAbilMorph id="DisguiseAsZealot" parent="DisguiseChangeling"/>

这样的继承关系称为模板继承


这种区分是为了让大家更容易理解整个XML继承体系,省得被之前“隐式继承”和“基础类的基础”之类的说法搞的头昏脑涨。

事实上,用CAbilBuild为技能类所制作出的技能模板之所以隐式地继承于CAbilBuild的类模板,是因为在游戏内部,CAbilBuild这个类本身就继承于CAbil这个类,而不是因为什么专门的约定。


另外注意下面两种表述的区别:

所有的技能类(当然除开CAbil自己)的祖先都是CAbil&#160;&#160;&#160;&#160; 正确
所有的技能类(当然除开CAbil自己)都直接继承于CAbil&#160;&#160;&#160;&#160; 错误

因为其实很多技能类并不直接继承于CAbil,中间还隔开了一代。比如最好的例子就是CAbilEffectTarget继承于CAbilEffect,CAbilEffect又继承于CAbil.

CAbil>CAbilEffect>CAbilEffectTarget

另有一些不那么明显的例子比如

CAbil>CAbilQueueable>CAbilArmMagazine

不是那么容易从名字当中判别。因此我在文末附上了所有技能类、效果类、行为类之间的类继承关系。


抽象类


为了叙述和理解方便,在此引入一个新的名词“抽象类”。编程中的抽象类指的是无法被实例化的类。这些类中没有包含足够的信息来表示一个实际的物体,因此它们被称为抽象类。

而这里要说的抽象类和编程中的抽象类有些相似。于是在此定义SC2XML研究术语中的“抽象类”概念:

如果一个类无法实现一个可被实例化的模板,只能用来制作默认模板,那么这个类被称为一个抽象类。

举例,CAbil就是一个抽象类,你无法用它来弄模板,做出一个实际的技能来。因为它当中包含的信息(属性)不够,无法用来表示一个技能。另外,SC2也会阻止你这样做。

有人可能会问,XML都是文本吧,谁能阻止我写出这样一个模板?

<CAbil id="ABC"/>

但事实是,这样的模板写出来也没用,SC2根本不会去读它,它不会认为当前的数据库中存在这样一个技能模板。因此这是一个废模板。

抽象类可以用来制作默认模板,如

<CAbil id="ABC" default="1"/>

这样的模板是可被承认的,只是它依然无法被实例化而已(即无法在游戏中实际地创建这样一个技能),只能用来被其它模板继承。

此外,CAbilProgress、CAbilEffect、CAbilQueueable、CAbilRedirect也都属于抽象类。

具体可以参考我昨天写的三个帖子,蓝色标注的类全都是抽象类
技能类
http://bbs.islga.org/read-htm-tid-39566.html
效果类
http://bbs.islga.org/read-htm-tid-39569.html
行为类
http://bbs.islga.org/read-htm-tid-39571.html



模板的“跨类继承”——类继承与模板继承的混合


当一个模板尝试继承另一个与它自身基础类不同的另一个模板时,我们称这种继承关系为跨类继承

在SC2中,跨类继承是可行的,但是有很严格的限制。

即,一个模板只能继承基础类与自身基础类相同的模板,或者基础类是自身基础类的父(及祖先)模板。


情况1:
[codes=xml]
<CAbilEffect id="TestCAbilEffect" default="1">
&#160;&#160;&#160;&#160;<Name value="AttTest"/>
</CAbilEffect>

<CAbilEffectTarget id="ABC" parent="TestCAbilEffect"/>
[/codes]

这样的继承是可行的。当然
情况2:
[codes=xml]
<CAbil id="TestAbil" default="1">
&#160;&#160;&#160;&#160;<Name value="AttTest"/>
</CAbil>

<CAbilEffectTarget id="ABC" parent="TestAbil"/>
[/codes]

也可以。


[codes=xml]
<CAbilEffectInstant id="TestCAbilEffectInstant" default="1">
&#160;&#160;&#160;&#160;<Name value="AttTest"/>
</CAbilEffectInstant>

<CAbilEffectTarget id="ABC" parent="TestCAbilEffectTarget"/>
[/codes]
这样就不行了,因为CAbilEffectInstant和CAbilEffectTarget这两个类是兄弟关系,无法进行跨类继承。


要注意的是,当进行跨类继承的时候,模板中继承得到的数据将会和普通情况下有所不同因为默认的继承关系被改变了。

以下我们来详细地进行辨别:

为了讲解方便,我们放一个普通的不跨类的继承情况用作比较。

情况3:
[codes=xml]
<CAbilEffectTarget id="TestCAbilEffectTarget" default="1">
&#160;&#160;&#160;&#160;<Name value="AttTest"/>
</CAbilEffectTarget >

<CAbilEffectTarget id="ABC" parent="TestCAbilEffectTarget"/>
[/codes]

情况4(不进行显式继承):
[codes=xml]
<CAbilEffectTarget id="ABC"/>
[/codes]

我们先看情况4的继承关系,当我们不进行任何显式继承的时候:

模板ABC继承关系=CAbil的类模板>CAbilEffect的类模板>CAbilEffectTarget的类模板

而情况3,当模板ABC显式地继承一个基础类为CAbilEffectTarget的模板的时候:

模板ABC继承关系=CAbil的类模板>CAbilEffect的类模板>CAbilEffectTarget的类模板>模板TestCAbilEffectTarget

而情况1,如果我们继承一个CAbilEffect为基础类的模板:

模板ABC继承关系=CAbil的类模板>CAbilEffect的类模板>模板TestCAbilEffect

可以明显地看出:CAbilEffectTarget的类模板被跳过了。

再看情况2:直接继承一个CAbil类:

模板ABC继承关系=CAbil的类模板>模板TestCAbil

于是,CAbilEffectTarget的类模板和CAbilEffect的类模板都被跳过了。

以上都是我实际测试得到的结果。由此可以得到结论,当我们进行跨类继承的时候,被继承模板的基础类和当前模板的基础类之间的几代类的类模板全部会被跳过。

但要注意:这并不是指当前模板所包含的属性也会减少。实际上如情况2,ABC垮了两代继承了CAbil的类模板。那么在ABC并不会因此失去作为CAbilEffectTarget所拥有的而CAbil并不拥有的那些属性。但由于没有继承中间的两代类模板,所有这些属性并没有被赋初值而已。

比如在Core中,CAbilEffectTarget有一个类模板:
[codes=xml]
&#160;&#160;&#160;&#160;<CAbilEffectTarget default="1">
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<Flags index="BestUnit" value="1"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<FollowRange value="5"/>
&#160;&#160;&#160;&#160;</CAbilEffectTarget>
[/codes]

因此通常情况下所有用CAbilEffectTarget为基础类所制作的模板FollowRange属性都默认为5,但是在情况2中模板ABC的FollowRange属性的值会变成0,这是因为在ABC并没有继承这个类模板的关系。

2楼更新所有技能类、效果类、行为类之间的类继承关系:

评分

参与人数 1威望 +1 收起 理由
hare613 + 1 此乃神作!膜拜之!

查看全部评分

 楼主| 发表于 2010-4-7 23:15:19 | 显示全部楼层
所有技能类之间的继承关系,蓝色标注的为抽象类



大家由此可以发现:拥有子类的类并非都是抽象类……比如CAbilMorph本身有子类,但本身同时也可以制作出可实例化的技能模板。

所有技能类作用介绍:
http://bbs.islga.org/read-htm-tid-39566.html


CAbil
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CAbilAttack
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CAbilAugment
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CAbilBattery
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CAbilBehavior
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CAbilBuild
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CAbilEffect
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CAbilEffectInstant
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CAbilEffectTarget
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CAbilHarvest
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CAbilInteract
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CAbilInventory
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CAbilMerge
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CAbilMorph
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CAbilMorphPlacement
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CAbilMove
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CAbilPawn
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CAbilProgress
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CAbilBuildable
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CAbilMergeable
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CAbilWarpable
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CAbilQueue
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CAbilQueueable
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CAbilArmMagazine
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CAbilLearn
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CAbilResearch
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CAbilRevive
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CAbilSpecialize
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CAbilTrain
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CAbilRally
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CAbilRedirect
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CAbilRedirectInstant
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CAbilRedirectTarget
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CAbilStop
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CAbilTransport
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CAbilWarpTrain
回复

使用道具 举报

 楼主| 发表于 2010-4-7 23:15:54 | 显示全部楼层
所有效果类之间的继承关系,蓝色标注的为抽象类


可见几乎所有的效果类都继承于CEffectResponse类,可以指定效果目标所作出的响应,如获取目标或者逃跑。
这种分法也符合我们的逻辑思维。
CEffectModifyPlayer显然是针对玩家的操作,自然没有目标单位一说。CEffectSet和CEffectSwitch分别是打包和实现条件分支用的,本身自然也没有目标单位了,更无需去指定目标单位作出的响应了。因此无需继承于CEffectResponse。

所有效果类作用介绍:
http://bbs.islga.org/read-htm-tid-39569.html

CEffect
        CEffectModifyPlayer
        CEffectResponse
                CEffectApplyBehavior
                CEffectApplyForce
                CEffectCreateHealer
                CEffectCreatePersistent
                CEffectCreateUnit
                CEffectDamage
                CEffectDestroyHealer
                CEffectDestroyPersistent
                CEffectEnumArea
                CEffectEnumTransport
                CEffectIssueOrder
                CEffectLaunchMissile
                CEffectModifyUnit
                CEffectReleaseMagazine
                CEffectRemoveBehavior
                CEffectTeleport
                CEffectTransferBehavior
                CEffectUseCalldown
                CEffectUseMagazine
        CEffectSet
        CEffectSwitch
回复

使用道具 举报

 楼主| 发表于 2010-4-7 23:16:09 | 显示全部楼层
所有行为类之间的继承关系,蓝色标注的为抽象类


全部继承于CBehavior,无亮点。

所有行为类作用介绍:
http://bbs.islga.org/read-htm-tid-39571.html

CBehavior
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CBehaviorAttribute
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CBehaviorBuff
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CBehaviorClickResponse
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CBehaviorConjoined
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CBehaviorCreepSource
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CBehaviorJump
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CBehaviorPowerSource
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CBehaviorPowerUser
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CBehaviorResource
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CBehaviorReveal
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CBehaviorSpawn
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CBehaviorVeterancy
回复

使用道具 举报

 楼主| 发表于 2010-4-7 23:46:38 | 显示全部楼层
最后,用一句话概括类继承和模板继承之间的最大区别:

类继承继承的是属性,而模板继承继承的是属性的值。
回复

使用道具 举报

发表于 2010-4-7 23:51:35 | 显示全部楼层
头目轻轻挑起xml的头盖,便闪瞎了吾等的狗眼。 >_<
回复

使用道具 举报

发表于 2010-4-8 08:41:12 | 显示全部楼层
发现一个有意思的现象:我将水晶的建造时间设置为0,然后让神族农民去造,在占位的情况下(卡位)农民会被挤出来,一般也就是挤出来靠边站,但是有个特殊情况

那就是当农民正在移动中,然后离正要建造建筑的位置很近时(近到什么程度就运气了,兵营更容易),此时点下要建造的建筑,农民就会彪的一下被挤好远……速度看样子是匀速,但是并非一直持续下去,末尾很明显是个减速运动,碰到障碍也会停止,很像那个力……
回复

使用道具 举报

发表于 2010-4-8 08:50:16 | 显示全部楼层
呃。太厉害了,这样的BUG都被发现了。

----------- 帖子于 08:50 更新 --------- 之前内容发布于 08:44 ------------

本来想找些问题来提问的,想不到读完全文发现已经完全解释清楚了,太强力了。
回复

使用道具 举报

发表于 2010-4-8 08:51:18 | 显示全部楼层
护甲为啥不能是负数只看到一个Sight 的视野参数,有无白天黑夜之分呢...
回复

使用道具 举报

发表于 2010-4-8 13:19:22 | 显示全部楼层
咦 很复杂喔  之前都是一个一个的试 现在解析解出来了 有一种说不出来的感觉
回复

使用道具 举报

 楼主| 发表于 2010-4-8 14:43:06 | 显示全部楼层
引用第9楼灵魂仲裁者于2010-04-08 13:19发表的  :
咦 很复杂喔&#160;&#160;之前都是一个一个的试 现在解析解出来了 有一种说不出来的感觉

很显然,我依旧还是一个个试的。我不会汇编的说。

----------- 帖子于 14:43 更新 --------- 之前内容发布于 14:40 ------------
引用第6楼zjwzero于2010-04-08 08:41发表的  :
发现一个有意思的现象:我将水晶的建造时间设置为0,然后让神族农民去造,在占位的情况下(卡位)农民会被挤出来,一般也就是挤出来靠边站,但是有个特殊情况

那就是当农民正在移动中,然后离正要建造建筑的位置很近时(近到什么程度就运气了,兵营更容易),此时点下要建造的建筑,农民就会彪的一下被挤好远……速度看样子是匀速,但是并非一直持续下去,末尾很明显是个减速运动,碰到障碍也会停止,很像那个力……


嗯,我估计这个推开的效果就是那个ApplyForce做到的。
回复

使用道具 举报

发表于 2010-4-8 14:52:29 | 显示全部楼层
引用第10楼Renee于2010-04-08 14:43发表的  :
嗯,我估计这个推开的效果就是那个ApplyForce做到的。

那个推开效果是碰撞产生的,如果此单位没有碰撞效果,则不会被摊开。

PS.如单位没有设定碰撞,则可以穿越地图中的某些位置。

猜测应该有一个【力X系统】存在,而这个系统不仅仅可以被碰撞系统调用,同时也为ApplyForce提供了接口。
回复

使用道具 举报

发表于 2010-4-8 15:37:04 | 显示全部楼层
还可以反弹……不过反弹得不是很明显……
回复

使用道具 举报

发表于 2010-4-8 17:06:49 | 显示全部楼层
原来是这样- -  这个力跟距离有没有关系不清楚,但是这个力确实是可以反弹的,并且每一次移动都会减速,每一次碰撞都会减少“可能是固定”的速度

而减速的依据应该跟质量有关——没测试质量,而且决定性的摩擦力肯定跟单位的加速度有关,估计就是加速度和质量了

加速度越大,摩擦力越大,基本推不动,一瞬间推出去并马上停止;加速度越小,摩擦力越小,(就建筑卡住了单位这个情况看来,摩擦力小了并不能马上推出去,不知道为什么,但是一旦推出去就会有明显的速度)如此更接近于匀速运动;碰撞之后会明显减少速度,从减少的幅度看,跟加速度无关,可以弹啊弹,就是弹得很慢很慢而已……估计将质量调小会弹得更明显甚至无限弹。


关于碰撞体积,确实可以在无碰撞的单位身上造建筑,而且造好以后并不会排斥,单位就站在建筑之中 —— 可是单位一旦走出去,就进不来了,也就是无法穿越建筑- -
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 11:53 , Processed in 0.104314 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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