变量的使用
KAG 中所谓的变量其实就是、
记录某些数据的东西
而已。
但是呢、KAG 因为是基于 TJS2 这一脚本语言的系统、KAG 的变量实际上继承了 TJS2 变量的功能,可以发挥很强大的作用。(译注:口胡,给我一个能保存的数据类再说……)
这个初级教程只讲了些基本的用法、像 KAG 内部的方法、属性之类的操作、使用吉里吉里本体功能之类的没有详细说、完全是一片泥沼的状态、容易掉坑的请注意(笑)。
变量的种类
KAG 变量的种类一共有 3 种。随着游戏档案存取的普通的「游戏变量」と、和游戏档案的存取无关的、可以一直被记录的「系统变量」、临时记录用的「临时变量」。「系统变量」在吉里吉里/KAG 程序关闭之后、再执行这个游戏的话,内容依然保留。「临时变量」在关闭游戏后即自动清除、也不会被游戏存档记录。
游戏变量以 f 、系统变量以 sf 、临时变量以 tf 作为名字的开头。
此外、KAG ( 其实也就是 TJS2 ) 的变量、可以记录文字列或者数值 ( 文字列数值一类的、变量中记录的内容种类即是所谓的「类型」 )。变量的命名相当自由,变量的个数没有限制。存储的文字列没有长度限制,数值的话也支持实数等等。
KAG 3.x 之后「数组」和「字典」也可以使用了 ( 在这个文档里没有说明 )。
Note
TJS2 的整数型为 64bit、实数型为 double ( 双精度 ) 。
文字列支持以0为终结符的 UNICODE 文字列、没有长度限制。
变量命名的规定
吉里吉里 / KAG 中、变量的命名是相当自由的。但是、再怎么自由,吉里吉里 / KAG 可以使用的变量名字还是有一定规则的。
- 变量名可以使用半角英数和全角文字、_ (下划线)
-
abc&def
或者、a-z
像这样的变量名不能用。
final_count
像这样含有下划线、主人公的名字
这样使用全角文字都是可以的(全角記号也全部可以用于给变量明明)。 - 不过要注意 变量名不能以半角数字开头
-
2friends
或者3com
像这样的变量名不能用 ( 全角数字开头的话就 OK )。
这些变量名的前面、游戏变量的话就加上 f.
を、系统变量的话就加上 sf.
、临时变量则加上 tf.
。
例如、以下这些变量名。
f.flag1 sf.username sf.playcount tf.i f.enokazu f.变量その1 ...
此外、第一次使用变量(等于是变量刚创建的时候),变量的内容默认为 0 、对文字列来说就是 ''( 空文字列 ) 、这是有点特殊的状态。一般情况下、第一次使用这个变量的时候,请给变量赋一个值比较好。
Note
f 或者 sf 或者 tf 之外还有 kag 开头的变量、kag 开头的变量,可以对 KAG 的系统内部一些数值进行操作(比如说kag.fullsreen,代表窗口是否处在全屏状态)。
变量的代入
要对变量赋値、通常使用 eval 指令。例如、想把 1000 代入变量 f.flag1
的话・・・
[evalexp="f.flag1=1000"]
就像以上这样。也就是、变量名之后写上 = (等号)、之后写上想要代入的数值。
想要代入文字的话、
[evalexp="f.变量之1='文字列'"]
则是像以上这样。也就是、 = 之后要使用 ''把想代入的文字列括起来 ( 请注意单引号和双引号的差别哦 )。
没有文字列用的变量、数值用变量这样的差别、变量类型会随着值的类型变化而自动改变。
给一个变量赋其他变量的值、
[evalexp="f.flag1=f.flag2"]
则是像以上这样写。
变量的演算
想要对某些变量进行计算的情况、
[evalexp="f.flag1=f.flag1+1"]
也是一样的。在这个例子中、会将 f.flag1 加 1 后的值代入 f.flag1 ( 也就是相当于 f.flag1 的值加上了 1 )。
exp 属性就是用来书写 TJS2 相关的「式」的。
TJS 式中、*(乘) /(除) +(加) -(减) 之类的 演算子照常规使用 ( 和数学式一样,有计算的优先顺序,例如乘除优先于加减 )。在式子中也可以使用 ( ) 括号。
例如、
[evalexp="f.flag1=f.flag1+f.flag2*f.flag3"]
这样的话、f.flag2 和 f.flag3 的乘积加上 f.flag1 的和将被代入 f.flag1 。
除法计算的话则是使用 / (斜线) 符号。
[evalexp="f.flag1=f.flag2/f.flag3"]
以上的例子 f.flag2 除以 f.flag3 的商将被代入 f.flag1 。
但是、除不尽的情况下, f.flag1 的值将会是实数、假如想要获得整数值的话、请使用整数除算演算子 \ 、
[evalexp="f.flag1=f.flag2\f.flag3"]
写成以上这样。
此外、文字列之间的计算,也可以使用 + 演算子。
[evalexp="f.flag2='hoge'"]
[evalexp="f.flag3='une'"]
[evalexp="f.flag1=f.flag2+f.flag3"]
像上面的例子、 f.flag1 的值将会是 'hogeune'。
Note
TJS2 的语法是参考 JavaScript (ECMAScript) 设计的、这些方面非常相似 ( 但并不是完全相同 )。
通常的算术演算动作等等是基本相同的。文字列之间的计算或者文字列和数值的混合计算也基本相同。
文字列和数值
KAG 的变量、并不会有文字列类、数值类的强制区别,变量一旦建立,名字也不会改变。
当把文字列赋给变量时,就成为保存文字列用的变量、把数值赋给变量时,就成为保存数值用的变量。
最麻烦的是进行混用的时候。比如说,+ 这个符号就有了很多很多的意义(^^;
文字列与文字列和并会使用到 + 演算子、数值的加法也会使用到 + 演算子、文字列和数值混合计算的场合、如果参与计算的其中一个是文字列、那么其他的数值也会被自动转换成文字列。
例如、f.flag2 内记录的是 'hoge'这个文字列、f.flag3 则记录着 10 这个数值、
[evalexp="f.flag1=f.flag2+f.flag2"]
那么、f.flag1 里记录的会是 'hoge10'这个文字列。
此外、如果无论如何都希望把文字列转为数值的话,也是有办法的。例如使用 [input] 指令让玩家输入数字、这种情况下也是使用 + 演算子。把+ 演算子放在想转换成数值的内容之前。例如、f.flag1 中记录着 '20'这个文字列、
[evalexp="f.flag1=+f.flag1"]
这么写的话、f.flag1 的内容就会转换为数值、再次记入 f.flag1 中。f.flag1 现在记录的就是数值型的 20 。
Note
+ 演算子连写的情况也必须注意。想把 f.flag3 变为数值型,并和 f.flag2 相加的话、写成 f.flag2++f.flag3
这种形式是会出错的 (因为 ++ 是另外一个演算子 )。请在加号间空一格,写成 f.flag2+ +f.flag3
的形式。
Note
单个的 + 演算子 ( 如之前举例的 f.flag1 = +f.flag1
例子中的 + ) 、文字列内如果有着小数点 ( 0.3 之类 ) 的话、结果会转换成实数。想要结果变为整数 ( 小数点以下舍去 )、写成 int + 的话就 OK 了。还是以之前的例子示范、就是写成 f.flag1 = int +f.flag1
这样。
变量的删除・其他
想要删除变量的话就使用 delete 来进行。delete 变量名 这么写的话就可以把变量删除。
例如、想要删除 f.flag1
的话、
[evalexp="deletef.flag1"]
就写成这样。
此外、使用 clearvar 指令的话、可以把所有游戏变量(f.开头的变量)全部删除。
此外、TJS2 中还可以使用一些其他演算子, math 对象,三角函数等等相关的计算 ( 也不知道是不是有用呢 ) 。详细的说明请看吉里吉里 SDK 的 TJS2 说明文档。
使用 , (逗号)的话,可以在一个 eval 指令内写入多个计算式。
比如说、
[evalexp="f.first=true"]
[evalexp="f.flag0=0"]
[evalexp="f.flag1=0"]
这三个式子、可以简写成以下的样子。
[evalexp="f.first=true,f.flag0=0,f.flag1=0"]
此外、使用 iscript 指令、可以代替连续的 eval 指令,让格式变得简单。
例如、还是之前的三个式子、
[iscript]
f.first=true;
f.flag0=0;
f.flag1=0;
[endscript]
可以写成以上这样。各式的后面,请千万不要忘记写上 ; ( 分号 ) 哦。
像这样使用 , (逗号) 或者 iscript 来书写代码,效率会提高很多。
显示变量的内容
想要在剧本中表示变量的内容、请使用 emb 指令。
例如说、像以下这样。
[waittime=200]
*start
[cm]
[evalexp="f.数值=200"][evalexp="f.mojiretu='文字列'"]
f.数值的内容:[embexp="f.数值"][l][r]
f.mojiretu的内容:[embexp="f.mojiretu"][l][r]
执行起来的话,游戏画面上会显示出:
f.数值 的内容 : 200
f.mojiretu 的内容 : 文字列
这样的对话。
实体(entity)
所谓的实体(entity)是指、以变量的内容、替换其他指令的属性值的功能。
书写格式是、属性名 = & 变量名。
[waittime=200]
*start
[cm]
[evalexp="f.fontsize=60"]
[fontsize="&f.fontsize"]这是60号的文字[resetfont]
这种情况下、f.fontsize 里记录的 60 这个值、就成为了 font 指令的 size 属性值。
实体的本质是:对 & 之后的部分进行计算,并将计算结果作为属性值。也就是说、& 的后面,除了变量名以外,也可以写入 TJS 式。
条件判断
要判断变量和某个值是否相同,可以使用以下的演算子。
a==ba和b相等的情况下为真(true)
a!=ba和b不相等的情况下为真(true)
a<ba小于b的情况下为真(true)
a>ba大于b的情况下为真(true)
此外也可以使用 >= や <= (大于等于、小于等于) 。
像这样的条件判断,主要是用在 if 指令中的。
if 指令是、如果 exp 属性的值为 真(true) ,就执行从if 到 endif 中间的剧本段内容。
[ifexp="f.flag1==2"]f.flag1的值是2[endif]
[ifexp="f.flag1!=2"]f.flag1的值不是2[endif]
变量的用途非常广泛,拥有很强大的功能。