|
SC2Text类型的输出格式和War3有些类似,用特殊标记来表示颜色和换行,不过SC2的标记更强大一些,甚至可以做算数题,下文会逐步提到。
可以用在技能提示中的那些标记都能用在屏幕输出上。大家可以参考GameString.txt里的写法
颜色的标记是<c></c>
如下例
[codes=galaxy]
str="<c val=\"ff0000\">Red</c><c val=\"00ff00\">Green</c><c val=\"0000ff\">Blue</c>";
UIDisplayMessage(PlayerGroupAll(), 4, StringToText(str));
[/codes]
输出结果为
很显然,val的值决定了颜色,和war3一样是RRGGBB,但是比war3少了最前头两位(反正war3里头两位本来也没用)。注:
学过c语言的同学大概不会有疑问,但是对编程了解较少的同学可能会问,为啥GameString.txt里是写<c val="ff0000">这样的,而这里要多两个斜杠<c val=\"ff0000\">呢?
其实这两个斜杠并不包括在str这个字符串里,这个字符串的实际内容依然是<c val="ff0000">Red</c><c val="00ff00">Green</c><c val="0000ff">Blue</c>,这两个斜杠是编程中所谓的“转意字符”
我们都知道,无论是galaxy还是jass,字符串都是包括在一个双引号对里的,于是,如果不写这个斜杠,那么str就会变成只剩下"<c val="了。在这里,这个斜杠用于转意,代表后面跟的字符不作为脚本关键字而作为普通字符。这样,=号后面的"号就不会被galaxy解释器认为是字符串的结束标志,而是这个字符串里的一个字符了。
另外要注意的是,因为\本身是转意字符,所以它不会包含在str这个字符串里,那么我们如果想要输出一个带"\"的字符要怎么办呢?
——写两个\就可以了
[codes=galaxy]
str="<c val=\"ff0000\">Red\\</c><c val=\"00ff00\">Green</c><c val=\"0000ff\">Blue</c>";
UIDisplayMessage(PlayerGroupAll(), 4, StringToText(str));
[/codes]
结果就是
另外,换行的标记写法是<n/>(虽然<n></n>这种也能表示换行,但是为了格式标准起见建议还是用<n/>的写法,以与XML格式相统一)
[codes=galaxy]
str="<c val=\"ff0000\">Red</c><n/><c val=\"00ff00\">Green</c><n/><c val=\"0000ff\">Blue</c>";
UIDisplayMessage(PlayerGroupAll(), 4, StringToText(str));
[/codes]
结果就是
两次换行就是写两次<n/>
另外,<c>标记除了可以直接填写RGB以外,也有一些固定常数,具体由UI文件指定的。比如#ColorAttackInfo就是黄颜色。
[codes=galaxy]
str="Tactical strike aircraft.<n/><n/><c val=\"#ColorAttackInfo\">Can attack ground units.</c>";
UIDisplayMessage(PlayerGroupAll(), 4, StringToText(str));
[/codes]
然后下面部分稍微有点进阶:读取XML数据
其实格式和我这帖的差不多,只是参数写一块了:
http://bbs.islga.org/read-htm-tid-38662-fpage-2.html
比如十进制整数标记<d>
<d ref="参数1,参数2,参数3"/>
参数1为想要读取的XMl文件,如果是AbilData.xml就写Abil;EffectData.xml就写Effect,以此类推。
参数2是要读取的模板的ID,参考我那贴
参数3是要读取的属性,具体格式参考我那帖。
[codes=galaxy]
str="Target Hatchery, Lair, or Hive spawns 4 Larva in <d ref=\"Behavior,SpawnMutantLarvaTimer,Duration\"/> seconds. If Hatchery, Lair or Hive has more than 3 Larva at one time, regular larva production will stop until there is less than 3 larva.";
UIDisplayMessage(PlayerGroupAll(), 4, StringToText(str));
[/codes]
其中<d ref="Behavior,SpawnMutantLarvaTimer,Duration"/>读取了BehaviorData.xml中SpawnMutantLarvaTimer行为模板的Duration属性。
方便起见这里列出SpawnMutantLarvaTimer模板的内容
[codes=xml]
<CBehaviorBuff id="SpawnMutantLarvaTimer">
<Alignment value="Positive"/>
<InfoIcon value="Assets\Textures\BTN-Unit-Zerg-Larva.dds"/>
<EditorCategories value="Race:Zerg,AbilityorEffectType:Structures"/>
<DisplayCountdown index="Self" value="1"/>
<DisplayCountdown index="Ally" value="1"/>
<Duration value="40"/>
<ExpireEffect value="SpawnMutantLarvaApplySpawnBehavior"/>
</CBehaviorBuff>
[/codes]
可见Duration属性为40,那么我们来看看实际结果是否显示为40呢?
很好。
接下去的部分要更进阶一些…………
我们来试着做一些计算……
<d>标签的真实用途其实并非是拿来引用XML中的值,而是用来计算东西的(这个还是我无意中试出来的)
注意d其实表示的是10进制整数。和c很类似。
[codes=galaxy]
str="3x4=<d ref=\"3 * 4\"/>";
UIDisplayMessage(PlayerGroupAll(), 4, StringToText(str));
[/codes]
你们觉得会输出啥?
就和你们猜想的一样。
另外算式的因数并不仅仅局限于直接输入的数字,也可以使用从XML中取出的属性。其实GameString.txt里已经有个例子,其实这个是我这篇文章写了一半才发现的,我一开始没注意还。
[codes=galaxy]
str="Fires at a single unit or structure, stunning the target and dealing <d ref=\"Effect,250mmStrikeCannonsCreatePersistent,PeriodCount * Effect,250mmStrikeCannonsDamage,Amount\"/> damage over <d ref=\"Effect,250mmStrikeCannonsCreatePersistent,PeriodCount * Effect,250mmStrikeCannonsCreatePersistent,PeriodicPeriodArray[0]\"/> seconds.<n/><n/><c val=\"#ColorAttackInfo\">Can target ground units.</c>";
UIDisplayMessage(PlayerGroupAll(), 4, StringToText(str));
[/codes]
得到的结果
其中500就是250mmStrikeCannonsCreatePersistent的PeriodCount属性和250mmStrikeCannonsDamage的Amount属性相乘的结果,其实就是周期次数X每周期的伤害=总伤害啦。
表达式为<d ref="Effect,250mmStrikeCannonsCreatePersistent,PeriodCount * Effect,250mmStrikeCannonsDamage,Amount"/>
本文的续集:
http://bbs.islga.org/read-htm-tid-39032.html |
|