找回密码
 点一下
查看: 9450|回复: 27

关于SC2的Text和字符串的一些输出格式part1(可以用字符串来做算数题哦!~)

[复制链接]
发表于 2010-3-16 22:43:07 | 显示全部楼层 |阅读模式
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]

输出结果为

1.jpg

很显然,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]

结果就是

2.jpg


另外,换行的标记写法是<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]

结果就是

3.jpg

两次换行就是写两次<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]

4.jpg

然后下面部分稍微有点进阶:读取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呢?

5.jpg

很好。

接下去的部分要更进阶一些…………

我们来试着做一些计算……

<d>标签的真实用途其实并非是拿来引用XML中的值,而是用来计算东西的(这个还是我无意中试出来的)

注意d其实表示的是10进制整数。和c很类似。
[codes=galaxy]
    str="3x4=<d ref=\"3 * 4\"/>";
    UIDisplayMessage(PlayerGroupAll(), 4, StringToText(str));
[/codes]

你们觉得会输出啥?


就和你们猜想的一样。

6.jpg

另外算式的因数并不仅仅局限于直接输入的数字,也可以使用从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]


得到的结果
7.jpg

其中500就是250mmStrikeCannonsCreatePersistent的PeriodCount属性和250mmStrikeCannonsDamage的Amount属性相乘的结果,其实就是周期次数X每周期的伤害=总伤害啦。
表达式为<d ref="Effect,250mmStrikeCannonsCreatePersistent,PeriodCount * Effect,250mmStrikeCannonsDamage,Amount"/>




本文的续集:
http://bbs.islga.org/read-htm-tid-39032.html
发表于 2010-3-16 22:56:06 | 显示全部楼层
只能膜拜了
回复

使用道具 举报

 楼主| 发表于 2010-3-16 22:58:48 | 显示全部楼层
顺带一提,还支持括号运算

    str="(3x(4+2))/0.5=<d ref=\\"( 3 * ( 4 + 2 ) ) / 0.5\\"/>";
    UIDisplayMessage(PlayerGroupAll(), 4, StringToText(str));

结果
8.jpg
回复

使用道具 举报

发表于 2010-3-16 22:59:13 | 显示全部楼层
请问一个关于脚本的问题。
如果为一个单位自定义追加新的某个技能,这个技能的实现可能需要复杂的运算,是否可以为这个技能追加处理函数呢?
另外,如果可以的话,如何把处理结果返回给按钮的实现结果呢?


类似于写c++,c#中。为按钮追加响应函数。
回复

使用道具 举报

 楼主| 发表于 2010-3-16 23:02:14 | 显示全部楼层
<d>的意思是10进制整数。于是我想应该还有对应小数的标记。不过貌似不是<f>。我还得再试试。
回复

使用道具 举报

 楼主| 发表于 2010-3-16 23:04:57 | 显示全部楼层
引用第3楼chilled于2010-03-16 22:59发表的  :
请问一个关于脚本的问题。
如果为一个单位自定义追加新的某个技能,这个技能的实现可能需要复杂的运算,是否可以为这个技能追加处理函数呢?
另外,如果可以的话,如何把处理结果返回给按钮的实现结果呢?


类似于写c++,c#中。为按钮追加响应函数。


我目前还不知道更复杂的函数能否处理,不过按钮的提示信息可以按照我帖子里写的来做。

XML调用脚本应该是可行的,但是我尚不清楚它的可行范围。
回复

使用道具 举报

发表于 2010-3-16 23:15:16 | 显示全部楼层
了解了- -#关于提示信息相关的动态计算已经会了。
回复

使用道具 举报

 楼主| 发表于 2010-3-16 23:18:26 | 显示全部楼层
我来试试看font支持不……
回复

使用道具 举报

发表于 2010-3-17 00:09:20 | 显示全部楼层
do string...
回复

使用道具 举报

发表于 2010-3-17 00:20:28 | 显示全部楼层
太强老。。。。看来这galaxy的语法是XML和C 2种语法的结合体啊。。
回复

使用道具 举报

发表于 2010-3-17 00:44:10 | 显示全部楼层
这个比war3进步了啊
war3 技能, 单位, 物品的大部分属性都取不出出来
回复

使用道具 举报

 楼主| 发表于 2010-3-17 01:12:39 | 显示全部楼层
当然其实这个只是显示字符串的时候写起来方便了。

用CatalogFieldValueGet()的话也完全可以解决。而且相比起来,这个只能用于输出,而CatalogFieldValueGet()可以真正用于函数中的运算。
回复

使用道具 举报

发表于 2010-3-17 08:35:18 | 显示全部楼层
请问CatalogFieldValueGet()的对应函数->CatalogFieldValueSet()是否存在呢?
是否有办法把脚本运算的结果返回到游戏中?

顺便问一个擦边的问题。
如何修改游戏中的UI(如,单位名称/护甲/生命的显示区域),应修改哪个文件呢?
修改过程中是否可以利用以上的字符串的一些输出格式,以及PartⅡ部分的图片连接呢?
回复

使用道具 举报

发表于 2010-3-17 09:08:08 | 显示全部楼层
引用第5楼麦德三世于2010-03-16 23:04发表的  :
XML调用脚本应该是可行的,但是我尚不清楚它的可行范围。

请问XML中如何调用脚本呢?有些什么事例吗?
只看到过在UintData.xml中有相关战术AI的一些定义,感觉可能是外链脚本部分来帮助运算的。
回复

使用道具 举报

发表于 2010-3-17 15:47:06 | 显示全部楼层
有关战术AI的定义??
回复

使用道具 举报

 楼主| 发表于 2010-3-17 16:06:53 | 显示全部楼层
单兵AI。

可以调用xml里定义的也可以调用脚本里的。

XMl里的比脚本的执行效率高得多。
回复

使用道具 举报

发表于 2010-3-18 11:19:06 | 显示全部楼层
以下的计算式是否可以直接用在XML中吗?
<d ref=\\"3 * 4\\"/>"
<d ref="Effect,250mmStrikeCannonsCreatePersistent,PeriodCount * Effect,250mmStrikeCannonsDamage,Amount"/>


例如:根据目标总血量,按照比例调整自身的攻击力。
回复

使用道具 举报

发表于 2010-5-27 16:26:56 | 显示全部楼层
挖坑,因为看到还有很多未解谜问题
回复

使用道具 举报

发表于 2010-5-27 17:36:45 | 显示全部楼层
你难道不能把发现的未解问题一并发出来再挖吗?
回复

使用道具 举报

发表于 2010-5-27 18:57:16 | 显示全部楼层
請問显示小数用那个标志。。。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-23 03:56 , Processed in 0.217278 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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