找回密码
 点一下
查看: 5345|回复: 1

XML入门的实例技能演示-加速技能

[复制链接]
发表于 2011-7-22 23:20:30 | 显示全部楼层 |阅读模式
这是一篇介绍用XML来做技能的教程,我在这里首先假设了看的人已经懂得基本的A-B-E知识,可以用编辑器做出自己想要的技能效果。


首先我来介绍一下XML,当你在编辑器里面修改了一堆东西,保存成为一张地图以后,又没有想过里面使用什么格式来记录你做过的修改?
在war3地图,MPQ里面装的是w3u、w3a等等的文件,里面的格式都是暴雪自己设定的,也不是明文,所以不用编辑器直接修改魔兽地图可不是一般的麻烦。
但是在sc2的地图,里面大部分资料都是明文,用XML的格式来保存,一个MPQ程式,配上记事本就可以做地图了。



用上XML格式有什么好处呢?好处就多了,例如在上班啊、上机课的时候,就算没有编辑器在手,依然可以做地图什么的....
开玩笑的,好处当然不止这些了。XML和编辑器的关系,就像Jass与GUI Trigger,编辑器会把修改的东西保存做XML格式。
例如编辑器傲娇了,地图出现诡异的BUG(例如那个壕沟bug),都直接修改XML救回来。
还有一些继承相关的东西,编辑器的支持不太好,直接写XML会更方便。




接下来说一下编辑XML的方法吧,首先你要一个MPQ编辑器,用来打开地图,我用的是MPQEditor。
随便打开一个你以前做的地图,可以看到AbilData.xml、BehaviorData.xml之类的档案,你在数据编辑器里面的修改都会被保存到这些文档里。
今天主要关注点是在数据编辑器做技能,所以只会介绍Map\Base.SC2Data\GameData里面的档案,他们的内容对应数据编辑器里面的catalog类别。
01.jpg



我会用一个简单的技能实例来做演示。
(其实是某个技能比赛的作品,不过我顺手用来写教程好了 http://www.sc2map.net/read.php?tid=128


技能"移动加速",效果是:
为指定单位添加一个buff,提高目标单位的移动速度,分别有四个等级。
等级Base:持续时间无限,加速100%
等级1:持续时间5秒,加速50%
等级2:持续时间7秒,加速75%
等级3:持续时间9秒,加速100%
高等级的Buff存在时会消除低等级的Buff,有高等级的buff时低等级的Buff不能添加上去。


演示地图在这里 Acceleration .SC2Map (24 KB, 下载次数: 35)


下面是AbilData.xml文件的内容,记录了有关技能的资料。
你们这时候可以用编辑器打开演示地图技能那一页,然后对照着来看以下的内容。
[codes=xml]<?xml version="1.0" encoding="us-ascii"?>
<Catalog>
&#160;&#160;&#160;&#160;<const id="c_AbilAccelerationRange" path="CAbilEffectTarget.Range" value="10"/>
&#160;&#160;&#160;&#160;<CAbilEffectTarget id="AccelerationBase">
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<Range value="c_AbilAccelerationRange"/>
&#160;&#160;&#160;&#160;</CAbilEffectTarget>
&#160;&#160;&#160;&#160;<CAbilEffectTarget id="AccelerationLevel1">
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<Range value="c_AbilAccelerationRange"/>
&#160;&#160;&#160;&#160;</CAbilEffectTarget>
&#160;&#160;&#160;&#160;<CAbilEffectTarget id="AccelerationLevel2">
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<Range value="c_AbilAccelerationRange"/>
&#160;&#160;&#160;&#160;</CAbilEffectTarget>
&#160;&#160;&#160;&#160;<CAbilEffectTarget id="AccelerationLevel3">
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<Range value="c_AbilAccelerationRange"/>
&#160;&#160;&#160;&#160;</CAbilEffectTarget>
</Catalog>[/codes]
02.jpg
XML里面记录的是修改后的东西,没有修改的数值是不会显示的,所以内容非常简洁。
我第一个介绍的东西就是常量,XML里面可以自定义常量,这里就定义了一个名为c_AbilAccelerationRange的变量,数值是10。
然后在下面4个不同的技能中,把他们的施法范围都设定成c_AbilAccelerationRange,进入编辑器以后就会看到这四个技能的施法范围是10了。
以后只要修改c_AbilAccelerationRange的设定值,就同时更改了使用到这个常量的所有地方。




使用常量有什么好处呢?有编程经验的人自然会明白,不过我这里还是要说一下。
想象一下你正在做一个对抗类的地图,双方会派出小兵,有一天你突然想修改一下小兵的属性,这时候你就有可能会修改了一边,忘记了另外一家,尤其是你做的是多方对抗图。
把这些属性设定为常量,就可以发挥出平衡性常数这个功效了,平衡性常数是常量的其中一个用途,用来方便以后为地图做平衡性调整


这帖是介绍最基本的XML,不会深入到语法,常量的使用语法可以参考这里。
http://bbs.islga.org/read-htm-tid-39818.html





接下来介绍的就是很重要和很有用的东西-继承,你单看编辑器,很难很直观地了解到继承的用途,因为编辑器对继承方面的支持不足够。
先去打开EffectData.xml和BehaviorData.xml


[codes=xml]<?xml version="1.0" encoding="us-ascii"?>
<Catalog>
&#160;&#160;&#160;&#160;<CBehaviorBuff default="1" id="AccelerationBuffDefault">
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<EditorCategories value="AbilityorEffectType:Units"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<Modification MoveSpeedMultiplier="2"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<RemoveValidatorArray value="DoesNotHaveAccelerationLevel3Buff"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<RemoveValidatorArray value="DoesNotHaveAccelerationLevel2Buff"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<RemoveValidatorArray value="DoesNotHaveAccelerationLevel1Buff"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<Duration value="-1"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<DisplayDuration index="Self" value="1"/>
&#160;&#160;&#160;&#160;</CBehaviorBuff>
&#160;&#160;&#160;&#160;<CBehaviorBuff id="AccelerationBaseBuff" parent="AccelerationBuffDefault">
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<InfoIcon value="Assets\Textures\btn-upgrade-zerg-airattacks-level0.dds"/>
&#160;&#160;&#160;&#160;</CBehaviorBuff>
&#160;&#160;&#160;&#160;<CBehaviorBuff id="AccelerationLevel1Buff" parent="AccelerationBuffDefault">
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<Modification MoveSpeedMultiplier="1.5"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<RemoveValidatorArray index="2" removed="1"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<Duration value="5"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<InfoIcon value="Assets\Textures\btn-upgrade-zerg-airattacks-level1.dds"/>
&#160;&#160;&#160;&#160;</CBehaviorBuff>
&#160;&#160;&#160;&#160;<CBehaviorBuff id="AccelerationLevel2Buff" parent="AccelerationBuffDefault">
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<Modification MoveSpeedMultiplier="1.75"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<RemoveValidatorArray index="1" removed="1"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<RemoveValidatorArray index="2" removed="1"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<Duration value="7"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<InfoIcon value="Assets\Textures\btn-upgrade-zerg-airattacks-level2.dds"/>
&#160;&#160;&#160;&#160;</CBehaviorBuff>
&#160;&#160;&#160;&#160;<CBehaviorBuff id="AccelerationLevel3Buff" parent="AccelerationBuffDefault">
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<RemoveValidatorArray index="0" removed="1"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<RemoveValidatorArray index="1" removed="1"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<RemoveValidatorArray index="2" removed="1"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<Duration value="9"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<InfoIcon value="Assets\Textures\btn-upgrade-zerg-airattacks-level3.dds"/>
&#160;&#160;&#160;&#160;</CBehaviorBuff>
</Catalog>[/codes]


[codes=xml]<?xml version="1.0" encoding="us-ascii"?>
<Catalog>
&#160;&#160;&#160;&#160;<CEffectApplyBehavior default="1" id="AccelerationDefault">
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<EditorCategories value=""/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<ValidatorArray index="0" value="DoesNotHaveAccelerationLevel3Buff"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<ValidatorArray value="DoesNotHaveAccelerationLevel2Buff"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<ValidatorArray value="DoesNotHaveAccelerationLevel1Buff"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<Behavior value="##id##Buff"/>
&#160;&#160;&#160;&#160;</CEffectApplyBehavior>
&#160;&#160;&#160;&#160;<CEffectApplyBehavior id="AccelerationBase" parent="AccelerationDefault"/>
&#160;&#160;&#160;&#160;<CEffectApplyBehavior id="AccelerationLevel1" parent="AccelerationDefault">
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<ValidatorArray index="2" removed="1"/>
&#160;&#160;&#160;&#160;</CEffectApplyBehavior>
&#160;&#160;&#160;&#160;<CEffectApplyBehavior id="AccelerationLevel2" parent="AccelerationDefault">
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<ValidatorArray index="1" removed="1"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<ValidatorArray index="2" removed="1"/>
&#160;&#160;&#160;&#160;</CEffectApplyBehavior>
&#160;&#160;&#160;&#160;<CEffectApplyBehavior id="AccelerationLevel3" parent="AccelerationDefault">
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<ValidatorArray index="0" removed="1"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<ValidatorArray index="1" removed="1"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<ValidatorArray index="2" removed="1"/>
&#160;&#160;&#160;&#160;</CEffectApplyBehavior>
</Catalog>[/codes]
03.jpg 04.jpg

编辑器里面浅绿色的项就是继承得来的。
这里有5个效果,Default是父类,Base, Lv1, Lv2, Lv3都是子类,行为也是这样设定。
在效果的父类中,我加了这一句。
[codes=xml]<Behavior value="##id##Buff"/>[/codes]
##id##这东西会被继承的子类替换成子类自己的名字,也就是说这几个效果自己的名字和行为有对应的关系。
例如AccelerationLevel1的效果,它的行为继承自父类,所以是##id##Buff。
当游戏自动把##id##替换成AccelerationLevel1的时候,这个效果的行为就是AccelerationLevel1Buff。


下面另外一点就是继承的属性覆盖。
等级Base:持续时间无限,加速100%
等级3:持续时间9秒,加速100%
这两个等级的加速都是一样的,只是持续时间不同,所以只需要在等级3行为那里设定持续时间就可以了。
[codes=xml]<Duration value="9"/>[/codes]
这一句就是把父类的持续时间-1,覆盖成为9秒,没有设定MoveSpeedMultiplier,就代表他继续用父类的设定。


继承的好处包括减少重复的数据量,方便统一修改数值等等。
你在编辑器新建一个东西,里面的预设值哪里来的?就是从编辑器本身写好的父类继承而来的,也节省了你重新填写这些东西的时间。
继承的规则很多,功能也很强大,这篇只是入门介绍而已,语法就不想深入了。




更多深入的教程
XML中的一些术语。
http://bbs.islga.org/read-htm-tid-38476.html
继承的详细语法。
http://bbs.islga.org/read-htm-tid-38724.html
http://bbs.islga.org/read-htm-tid-39589.html
http://bbs.islga.org/read-htm-tid-39646.html
常量的使用。
http://bbs.islga.org/read-htm-tid-39818.html
其他xml的教学、演示
http://wiki.islga.org/index.php? ... %A1%B6%E5%B8%96#XML

点评

这帖子被谁挖出来了?  发表于 2015-12-3 21:45
您需要登录后才可以回帖 登录 | 点一下

本版积分规则

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

GMT+8, 2024-11-21 17:31 , Processed in 0.088120 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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