krkr基础教程5

 

变量的用法

该教程为水螅制作,未经允许,请勿转载

关于变量,前边已经讲过,所有关于变量的操作都是tjs式,kag是不存在变量这种东西的,所以当开始用变量的时候,一定要注意格式要用tjs式的调用格式。我这样说的话,可能有些人会一头雾水,不知道我强调这个做什么。tjs式的使用方法和一般的数字参数不一样,经常有人会问我“为什么这里这个东西是这种格式,另一个地方却不是这种格式呢”之类的问题,事实上如果会判断出用的是不是tjs式,就会知道为什么使用那样的格式来赋值参数了。

我们平时会在kag中用到的变量都是全局变量,全局变量可以通俗理解为任何地方都可以使用并且在任何地方都只有一个值的变量(我怎么觉得我讲出来的更加混乱了……||||||||),像是全局变量D,她取这个名字就是表示她即使从function和macro里出来了也不会被销毁……
这些变量分为“f“,“sf“,“tf“3种,f是会纪录在存档里的,sf是会纪录在全局存档里的,tf是关了窗口就消失的。这三种变量不需要声明就可以使用,并且会根据值自动转换变量类型,当然可以通过运算符强制更改变量类型,比如(int)f.aa,就是把f.aa强制变为整形变量,(string)f.aa就是把f.aa强制变为字符串变量
当然kr也有局部变量,在tjs的function里用var声明的变量就是局部变量,这些相关的我在基础基础教程里没有必要讲,有兴趣的人可以自己去看看kr说明文档里的tjsdoc,里边有从0开始的讲解。中文版在http://kcddp.keyfc.net/bbs/viewthread.php?tid=442&extra=page%3D1
另外在macro里专用的mp变量也是离开了macro就被销毁的局部变量,这个我会在讲macro的时候再说,这里就先不说了。


关于这三个东西具体的运作方式……在建立kag这个对象的时候,里边var了sf、tf、f这三个全局变量,把它们建立为了字典。所以我们写的“f.经验值=15”实际意思就是字典f里边key是'经验值'的那个项的值赋值为15。然后在存档时,kr把sf存在了系统档里,把f存在了普通存档里,把tf无视了,这就造成了现在三种变量的效果。也就是因为这个原因,kag里边这三类变量不用声明,因为字典已经声明过了,字典里的项的建立本来就不用声明的……
mp也是这样,不过它是执行一个macro的时候才被声明出来的局部变量,离开了macro它就被自动销毁了。我们在macro里边写的各种参数都被作为mp的项放在里边,所以有时候你会看到有人在macro里边执行某个function时直接在里边传入mp,而不是mp.top,mp,left这样……其实就是把整个字典一起传过去了。

回到正题,关于变量的运算,首先要讲的就是赋值符“=
这个符号在kr里(事实上是在几乎任何语言里)不是“等于”的意思,而是把右边的东西赋值给左边的意思,比如:
f.aa=123;
在执行这一句之前,f.aa的值是空的,在kr里写作"void",执行了以这一句之后,f.aa的值就是123,以后除非再次给他赋值,不然不管在任何地方用到他,f.aa就相当于123这个数字。

kr一般的计算运算符有+ - * / (除取整)%(除取余),使用方法的话……大家都是学过四则运算的,就不需要我讲了吧……当然还有一些其他格式的,像是++和--之类……请大家自己去tjsdoc查……
不过值得注意的是,+这个运算,不仅可以对数字进行计算,也可以对字符串进行计算,比如
f.aa=1;
f.bb=2;
f.cc=f.aa+f.bb;
这时候,f.cc就是3
f.aa="水";
f.bb="螅";
f.cc=f.aa+f.bb;
这时候,f.cc就是"水螅"这个字符串。必须要说的是,把一个字符串赋值给变量,文字两边一定要加引号,不然kr不会判断它是字符串的。

要销毁一个变量使用的是delete,如:delete f.aa
这个我个人挺少用到……因为删除变量不会跟着删除变量指向的目的,也就是说如果用变量作为一个指针指向了一个新创建图层……把变量删掉的话那个图层就会一直一直在那里……而且无法对他进行操作…………(请大家不要进行这种尝试……||||||)

kr常用的判断比较运算符有==,>,>=,<,<=,!=几种,这些运算符会比较两边的变量,然后根据运算符的内容返回一个值,真(true)或者假(false),也写做1或者0,在if或者cond之类的地方,返回的值是真才会继续执行下边的东西。
==这个符号才是我们一般意义上常说的“等于”,它计算两边的式子的值,然后比较两个值,如果右边等于左边,则返回1,不等于则返回0。
其他的运算符,>就是大于,>=就是大于等于,<小于,<=小于等于,!=不等于。
如果觉得不适应,可以尝试把式子翻成中文念出来,大概会比较容易理解:
1 == 2
上边那个式子念出来是“1等于2”,这显然是错的,于是返回的值就是0(false)
11 >= 9
11大于等于9,这是对的,返回值1(true)

kr的逻辑运算符是&&(与),||(或),!(非)。关于与或非,学过计算机基础课程的话应该在理解上没问题吧,如果对看式子不习惯,也可以通过把&&翻译成“并且”,把||翻译成“或者”,把!翻译成“不是”来对式子进行描述,比如:
(f.aa == 11 && f.bb >=20 && f.bb < 40) || (f.aa > 12 && f.bb <=0)
这个式子用中文描述就是“当变量f.aa等于11且f.bb大于等于20且f.bb小于40,或者,f.aa大于12且f.bb小于等于0,的时候,返回1
如果用中文说出来还觉得不能理解的话,请放弃做游戏吧……(认真)
另外,kr还有一些自带的常用函数,
随机数random,可以取得0-1.0间的任意实数,使用方法:
f.aa=random;
这样f.aa就被赋了一个随机生成的数字。
另一个随机数intrandom(min, max),里边要填两个参数,最大值和最小值,然后就会在最大值和最小值之间生成随机的整数。如:
f.aa=intrandom(1, 15);
另外,还有一些计算函数,sin,cos,tan之类……想了解更多的也请自行查找tjsdoc,使用方法:
f.aa=Math.sin(Math.PI*30/180);
这样算出的f.aa就是0.5,Math.PI就是π

所有的变量都有一个length的函数,用来取得变量的字符长度,这个其实对画面有讲究的话会经常用到的……所以我在这里提一下,使用方法就是:
f.aa="噢呵呵呵呵";
f.bb=f.aa.length;

这样,f.bb就等于5。注意,他返回的是字符数,不管全角半角都算1个字符。

另一个常用的字符串变量操作的函数是substring,作用是从一个字符串里切出一段出来,格式是substring(开始切的位置, 向后切的字数)。如:
f.aa="噢呵啊呼吁";
f.bb=f.aa.substring(2, 3);
这样f.bb就等于"啊呼吁",注意那个开始切的位置里,变量的第一个字是0,第二个字才是1;向后切的字数如果不填,就是向后切到末尾。

上边讲了这么多,但是这些都是tjs式,不能够直接就这样写在kag的脚本里边的,在kag里使用tjs式有下边几种方法

1.在kag的指令里边作为参数使用。这种的话,要在tjs式前边加&表示后边调用的是tjs式,如果式子比较复杂,比如是个算式,最好还要加上(),如[image layer=1 storage="test" left=&tf.left top=&(tf.top+54)],&会把后边的tjs式返回的值赋给参数。
注意,这里的tjs式的返回值一定得是和这里要填的参数格式一致的,比如需要数字的时候返回值就应该是数字格式,你硬要给它填上一个object指针kr会请你看小蓝框的……
kag的指令里边,几乎所有的参数都是可以通过&使用tjs式的,只要你返回的值符合这个参数的格式就行。

2.在kag的指令里一些需要填tjs式的地方用,
1).eval,格式是[eval exp="tjs式"],比如[eval exp="f.aa=1"]这里边调用的tjs式就相当于在tjs文档里直接写入f.aa=a;这样一行,但是如果在这里写入了不能直接写入在tjs文档里的语句,也就是不合tjs语法的语句,那结果当然就是报错……
2).cond,这是一个非常非常重要的参数,kr的几乎所有指令里都可以用这个参数,包括自己定义的macro里也可以用,这个参数需要在后边填写一个返回真假的tjs式,如果是真就执行这一句指令,如果是假就当这句指令不存在,继续执行下一行,如:
[image layer=1 storage="test" left=0 top=0 cond="f.aa == 1 && f.bb > 11"]
这样,只有当f.aa等于1且f.bb大于11的时候,这句image才会被执行
3).if,格式:
[if exp="tjs式1"]
一些指令
[elsif exp="tjs式2"]
一些指令
[else]
一些指令
[endif]
其中,elsif和else有需要的时候才写,没需要的时候不写也没关系,if和cond的作用一样,tjs式返回的值为真则执行if到endif之间的那些指令,如果为假则不执行。老实说我一般都是用cond,if挺少用的,反正作用都一样……
4).buttonlinkonenteronleaveexp,这三个需要填的都是tjs式,分别是鼠标移动到按钮上时执行的tjs式,鼠标离开按钮时执行的tjs式,点击按钮时执行的tjs式,如:
[button normal="iteml_0" over="iteml" onenter="f.aa=1" onleave="f.aa=b" storage="note.ks" target=*itemdo recthit=true exp="f.bb=1"]
在鼠标移动上这个按钮时,f.aa值为1,移开时值为2,点击按钮后f.bb值为1
5).emb,前边已经讲过了,格式是[emb exp="tjs式"],要求返回的一定是字符串(如果返回的是数字也会自动转换成字符串格式)
6)hact,这个指主要用在有语音的时候在对话回放上点击对话回放的文字回放对应语音,虽然这样说不过其实tjs式里想写什么都可以,总之就是由hact和endhact包住的那段文字在对话回放页面的时候点击则可以执行这个tjs式。格式是:
[hact exp="tjs式"]
对话
[endhact]

另外新版本kag3ex2的语音播放变得更加容易了……这个就不太用得到了。
7).waittrig,记得是调用kag的trigger用的。一般功能不太用到这个。

最后我想补充说一个之前一直忘了说但是非常重要的东西,那就是……控制台……

krkr是提供调试用的控制台的,按shift+F1可以唤出一个工具箱p3,前边三个按钮分别是脚本编辑器,表达式监视,控制台,这三个也可以直接用shift+F2/F3/F4唤出来

脚本编辑器是针对tjs 的,这里不提

写kag脚本,调试时候最常用的就是表达式监视和控制台

p1

表达式监视窗口就长这个样子,下边第一个按钮是刷新,第二个是即时读取值(就是每隔很短的时间自动刷新一次),第三个是添加表达式,第四个是关闭

常常有人问我‘某个变量不知道为什么值错了’我就回答对方‘跟踪下看看是在哪里变化的’,然后对方经常就是回答我‘怎么跟踪……’所以其实似乎是有很多人不知道这个东西的存在的……

然后是更重要的,控制台

p2
kag执行的脚本内容,都会在控制台输出来,还有报错也是,到底哪一行出了错,控制台里都会写出来的……

另外最下边那个输入框可以输入tjs式,会直接在游戏里执行,比如写入“kag.process('喵.ks','*兔子逃跑')”然后回车,游戏就会直接跳转到那个标签去,另外也可以在直接里边输入算式查看当前的返回值……

总之掌握了控制台的话,查找bug就非常容易了……

那么,变量部分到此结束,下一篇我会讲整体的一个avg游戏主要需要知道的指令,比如右键,macro之类的。



TOP

访客数: 3169815
aa