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

SC2XML语法之 常量的定义和调用及其作用域和命名规范。

[复制链接]
发表于 2010-4-16 02:15:56 | 显示全部楼层 |阅读模式
随着编辑器的接近,我也打算先把SC2XML数据文件语法系列这教程给结束掉了。我本打算把这篇和计划中的最后一篇写在一起,但这样内容就太多了。

于是决定先写常量部分,把Token放在最后。


在之前的帖子里,我曾写到了结构模板也可以继承,你可以把一个结构模板当成该结构类型的常量来用。
http://bbs.islga.org/read-htm-tid-39646.html


那么那些基础类型的数据呢?比如字符串、整数、实数,它们能否定义常量呢?

本教程就来说一下SC2 XML常数定义和调用。

常量的定义和调用


以下是一个定义和调用常量的例子

我们用const关键字来构造常量。

[codes=xml]
   <const id="Pi" value="3.14"/>

    <CAbilResearch id="testRes">
        <InfoArray index="Research1" Time="Pi"/>
    </CAbilResearch>
[/codes]



当被游戏读取时,testRes模板的InfoArray[Research1].Time的值就会变成3.14。

1.jpg

注意<const id="Pi" value="3.14"/>无论写在testRes模板的之前还是之后都没关系,在SC2 XML数据文件中,常量可以随处定义


本教程结束。






————————开玩笑的。

只有这点东西我就不会专门写个教程了。

[codes=xml]
   <const id="Pi" value="3.14"/>

    <CAbilResearch id="testRes">
        <InfoArray index="Research1" Time="1Pi15926"/>
    </CAbilResearch>
[/codes]

现在是提问时间:

现在问testRes模板的InfoArray[Research1].Time属性的值为多少?

理论答案是13.1415926,当然更精确的答案是13.1416。

2.jpg

因为Times属性的类型为定点实数,因此自动保留4位小数。

可见InfoArray[Research1].Time的结果是将"1Pi15926"中的Pi直接替换成了3.14,从而成为13.1415926,并进一步舍入为13.1416。


常量也不只可以替换一次。如下例。
[codes=xml]
   <const id="x" value="3"/>

    <CAbilResearch id="testRes">
        <InfoArray index="Research1" Time="x.1xx"/>
    </CAbilResearch>
[/codes]

其替换结果就是3.133。


活用常量的替换规则,将大大有助于简化数据模板的编成。


好了。综合以上案例,现在提问:

"Pi"是什么类型的数据?


如果你回答“实数”,那就得看看下面这个例子了。

[codes=xml]
   <const id="Pi" value="3.14"/>

    <CAbilResearch id="testRes">
        <InfoArray index="Research1" Time="1Pi15926" Upgrade="Pict"/>
    </CAbilResearch>
[/codes]

你觉得testRes模板中,InfoArray[Research1].Time属性和InfoArray[Research1].Upgrade的值分别是多少呢?

3.jpg

可见,常量其实并没有固定的数据类型(或者可以说它们都是字符串类型) ,它们只管替换模板值中与自身id相同的部分,而不管被替换的数据是什么类型。



常量的作用域



但是,这样不是很麻烦了么?我想定义个常量"Pi"来代表3.14,结果我本来打算套用的那个科技升级却因此被弄坏了。指向了一个不存在的科技"3.14ct",另外没准整个文件里还有许多我所不知道的包含Pi字样的值被我弄坏了。

有没有办法把常量的作用域限制下呢?

为说明方便,我们把上面这个例子扩展一下。
[codes=xml]
   <CAbilPawn id="testPawn">
        <Range value="Pi"/>
   </CAbilPawn>

   <const id="Pi" value="3.14"/>

    <CAbilResearch id="testRes">
        <InfoArray index="Research1" Time="1Pi15926" Upgrade="Pict"/>
    </CAbilResearch>
[/codes]

这样testPawn模板的Range属性的值以及InfoArray[Research1].Time属性和InfoArray[Research1].Upgrade属性的值就分别是

4.jpg

现在,我如果希望"Pi"这个变量只能在CAbilPawn类所制作的模板的Range属性中使用,可以使用path关键字来决定Pi的作用范围为"CAbilPawn.Range" 。

<const id="Pi" path="CAbilPawn.Range" value="3.14"/>


[codes=xml]
   <CAbilPawn id="testPawn">
        <Range value="Pi"/>
   </CAbilPawn>

   <const id="Pi" path="CAbilPawn.Range" value="3.14"/>


    <CAbilResearch id="testRes">
        <InfoArray index="Research1" Time="1Pi15926" Upgrade="Pict"/>
    </CAbilResearch>
[/codes]

最终结果就会变成

5.jpg

之所以1Pi15926会变成0,是因为Pi无法解读,所以SC2认为它是个错误值,故而采用了默认值0。



常量的其它应用



常量的用法和编程语言也差不多,这里随便举些例子。

比如你可以用常量来做助记。

比如目前的伤害类型只有"Spell"、"Melee"、"Ranged"、"Splash"4种(不把Unkown和Count算在内的话)。

如果你想把这四种伤害类型重新定义为"Fire"、"Frost"、"Nature"、"Light",然后以此为基础构件伤害系统的话,也可以用一下常量

[codes=xml]
   <const id="Fire" path="CEffectDamage.Kind" value="Spell"/>
   <const id="Frost" path="CEffectDamage.Kind" value="Melee"/>
   <const id="Nature" path="CEffectDamage.Kind" value="Ranged"/>
   <const id="Light" path="CEffectDamage.Kind" value="Splash"/>

    <CEffectDamage id="FlameStrikeDamage">
        <Amount value="30"/>
        <Kind value="Fire"/>
    </CEffectDamage>
[/codes]

这样不容易会记错谁对应谁,hmmm



全局常量和局部常量


受编程思路的影响,我们也对常量进行一下全局和局部的区分好了。

今后将被path关键字限制了作用域的常量称为局部常量,而没有被限制作用域的常量成为全局常量



常量命名规范


这段并非是语法的强制要求,而是希望大家能在编写XML模板的时候养成良好编程习惯。最大限度规避常量名与已有值冲突的问题。

特此作以下规范:

除非已使用path关键字束缚住常量的作用域,并确知不会造成任何问题,否则原则上希望大家今后定义的所有常量(尤其是全局常量)的id都以字符"$"开头,以避免与其它属性值冲突。
发表于 2010-4-16 03:08:05 | 显示全部楼层
第一时间观看

----------- 帖子于 02:57 更新 --------- 之前内容发布于 02:18 ------------

终于看完了








开玩笑的,端着泡面看完了火影然后开始看帖子...

----------- 帖子于 03:08 更新 --------- 之前内容发布于 02:57 ------------

现在抱有的心态就是,银河出来了就不用跟XML打交道了...
回复

使用道具 举报

 楼主| 发表于 2010-4-16 03:19:42 | 显示全部楼层
XML有其必然的好处。

首先它执行效率比银河快很多,第二易于移植。

你想想war3时代那些触发技能要移植多麻烦。单处理变量都要花上你N个钟头。

这里直接复制文件或者模板就行。虽然XML并非万能,但以后如果搞GA技能评定标准的话,能不能脚本做出来的显然能得高分。
回复

使用道具 举报

发表于 2010-4-16 03:48:26 | 显示全部楼层
银河的物体编辑器不就是操作XML吗
回复

使用道具 举报

发表于 2010-4-16 04:54:16 | 显示全部楼层
噶啦西和XML是不同的
回复

使用道具 举报

发表于 2010-4-16 05:42:15 | 显示全部楼层
那些数据不是以XML的方式记录下来的么......
回复

使用道具 举报

发表于 2010-4-16 06:03:21 | 显示全部楼层
素数是自然数,自然数不是素数
回复

使用道具 举报

发表于 2010-4-16 06:13:05 | 显示全部楼层
指的还是移植性啊,不过,打开地图文件,物体编辑器的数据还是写在XML文件里面,一样的吧
回复

使用道具 举报

 楼主| 发表于 2010-4-16 08:32:00 | 显示全部楼层
嗯嗯~~目前看来是如此~~

看来ls说的银河是说整个编辑器~~

其实我非常怀疑数据编辑器能否用到我之前那几篇文章说到的功能~~毕竟整个系统太复杂了~~

所以将来可能xml和数据编辑器会和jass和触发器一样有高等应用和普通应用之分~~
回复

使用道具 举报

发表于 2010-4-16 08:47:07 | 显示全部楼层
嗯嗯,就是指的整个编辑器,准确的说指的就是物体编辑器(不用触发的部分)

脑补一下:物体编辑器的分区按照XML文件一一对应,就像“技能分区”能够连锁“效果分区&行为分区”之类的东西,很难想象别的模式...

----------- 帖子于 08:47 更新 --------- 之前内容发布于 08:40 ------------

就像we里技能连锁魔法效果那样的分区,这么脑补的话,和XML就没有区别了...
回复

使用道具 举报

发表于 2010-4-16 10:41:55 | 显示全部楼层
我觉得xml好复杂好麻烦,,我还是喜欢galaxy写技能 -,-简单些自由些。。效率我不管了

----------- 帖子于 10:41 更新 --------- 之前内容发布于 10:36 ------------

不过我还是要把XML补一补了,还好有头目的教程- -
当时根本没想到XML功能这么强- -
回复

使用道具 举报

发表于 2010-4-25 11:43:25 | 显示全部楼层
<const id="Fire" path="CEffectDamage.Kind" value="Spell"/>

   <const id="Frost" path="CEffectDamage.Kind" value="Melee"/>

   <const id="Nature" path="CEffectDamage.Kind" value="Ranged"/>

   <const id="Light" path="CEffectDamage.Kind" value="Splash"/>

如果我想在这四种之外再定义几种,是否可以?
比如:
  <const id="shadow" path="CEffectDamage.Kind" value="Spell"/>
  会不会把"Fire"覆盖掉?



----------- 帖子于 11:43 更新 --------- 之前内容发布于 11:39 ------------

在编辑器里面很容易做到自定义种族等等,但是自定义某些属性(比如伤害类型)就不大好弄
回复

使用道具 举报

发表于 2010-4-28 22:52:50 | 显示全部楼层
XML用在游戏编辑器里其实挺好的,平时网站上用也不错.xml太伟大了.
回复

使用道具 举报

 楼主| 发表于 2010-5-6 18:29:19 | 显示全部楼层
引用第11楼通天神巫于2010-04-25 11:43发表的  :
   <const id="Fire" path="CEffectDamage.Kind" value="Spell"/>

   <const id="Frost" path="CEffectDamage.Kind" value="Melee"/>

   <const id="Nature" path="CEffectDamage.Kind" value="Ranged"/>
.......


不会覆盖掉的。用Fire和用Shadow效果一样。不过你也无法增加新的伤害类型。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 10:06 , Processed in 0.069762 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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