COOL漫盛世

 

 

搜索
COOL漫盛世 论坛 The Game 【教程】krkr基础教程五:变量的使用
查看: 4186|回复: 0
go

【教程】krkr基础教程五:变量的使用

Rank: 9Rank: 9Rank: 9

魅力
0  
贡献
0  
金钱
83  
发表于 2013-3-30 18:37 |显示全部帖子
【该教程为水螅制作,未经允许,请勿转载】

关于变量,前边已经讲过,所有关于变量的操作都是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/viewt ... &extra=page%3D1
另外在macro里专用的mp变量也是离开了macro就被销毁的局部变量,这个我会在讲macro的时候再说,这里就先不说了。

然后顺便扯点无关的,初学者其实不用了解这个也没啥关系。关于f,sf,tf,mp他们到底是什么…………真相就是,他们都是字典(没错,就是每次有人在kag群里问到怎么管理数据船长都会倾情推荐的那个字典……)
在建立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).button和link的onenter,onleave和exp,这三个需要填的都是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,这个指令是在有语音的时候,用了这个可以在对话回放上点击对话回放的文字回放对应语音,因为我没做过要用到对话会放的东西,所以从来没有用过……|||||||||格式是:
[hact exp="tjs式"]
对话
[endhact]
应该是用exp来播放语音吧,或许还有别的用法,请大家自己尝试
另外新版本kag3ex2的语音播放变得更加容易了……似乎用不上这个了的样子(我依然也没用过,单纯推荐下……)
7).waittrig,这个是干嘛用的呢……远目……似乎是调用kag的trigger用的?懒得去试了(喂),好奇的人请自行查阅指令集解决

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

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

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

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



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

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

然后是更重要的,控制台


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

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

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

那么,变量部分到此结束,下一篇我会讲整体的一个avg游戏主要需要知道的指令,比如右键,macro之类的。
君の知らないブール
你需要登录后才可以回帖 登录 | 注册

COOL漫盛世 ( 陕ICP备11003936号 )

GMT+8, 2018-5-23 20:43 , Processed in 0.048234 second(s), 13 queries .

Powered by Discuz! X1.5

© 2001-2010 Comsenz Inc.

网址导航大全博彩公司 曾道人 网址导航 hg0088新2网址 hg0088 全讯网 网址大全 博彩评级 诸侯快讯 澳门百家乐 香港挂牌解一肖 cctv5在线直播 香港马会开奖结果 明升M88 118图库开奖结果 策略论坛 118图库 马会开奖结果 平特一肖 香港正挂挂牌彩图 六合宝典 博彩 六合宝典 重庆时时彩骗局 澳门赌场攻略 炸金花单机游戏 赌博技巧 时时彩骗局 老虎机破解 时时彩平台 东方心经四柱预测 吉祥坊手机官网 德州扑克下载 老虎机下载 外围赌球网站 百家乐规则 博彩公司排名 澳门葡京赌场 皇冠娱乐 炸金花游戏下载 时时彩计划 重庆时时彩平台 澳门赌博经历 澳门博彩有限公司 扎金花游戏 奔驰宝马老虎机下载 白小姐彩色图库 重庆时时彩计划群 15选5预测 五湖四海开奖记录 皇冠走地 欢乐谷娱乐城 时时彩平台骗局 博彩e族 老虎机规律 欧洲三大博彩公司 澳门博彩业 真钱棋牌 如何破解老虎机 百家乐破解 磨丁赌场 时时彩qq群 扎金花游戏大厅下载 多宝时时彩平台 赌球网站排名 澳门葡京赌场美女 龙虎斗游戏 浙江15选5走势图 真钱诈金花 博彩网站排名 时时彩群 网上扎金花 新澳门娱乐城 大发体育 博彩吧 兰桂坊娱乐城 澳门赌博攻略 nba投注 皇冠足球比分 澳门黄金城 双色球开奖直播时间 网络真钱游戏 时时彩赚钱 百家乐网页游戏 博彩网排名 博狗博彩网 皇冠代理 皇冠投注网址 百家乐网页游戏 博彩e族论坛 网上轮盘 皇冠即时走地 博狗博彩网 东森时时彩 澳门赌场筹码 唐人博彩论坛 宝马会全讯网 22选5预测 信誉国际娱乐城 捷豹娱乐城 真钱的棋牌游戏 网上真钱扎金花 nba投注网 篮球投注 二八杠绝技 皇冠备用网 网络扎金花 网上真钱游戏 博狗注册 皇冠足球投注网址 sp全讯网 时时彩平台推荐 百家乐必胜 时时博线上娱乐城 重庆时时彩现场开奖 海南 博彩 博定宝客户端 篮球投注网 新2娱乐城 如何打百家乐 新梦想娱乐城 娱乐城代理 白小姐印刷图库 淘宝博娱乐城 宝马会国际娱乐城 优博注册 广西时时彩 皇冠足球走地 博之道娱乐城 4887铁算盘 华人博彩策略 新疆时时彩 百家乐网络 南国七星彩论坛 娱乐城去澳门 大赢家即时比分 金殿娱乐城 重庆时时彩骗局 人民币扎金花 时时彩骗局 皇家赌场娱乐城 时时彩平台 顶尖博彩 老虎机下载 百家乐破解方法 时时彩官网 百家乐详解 时时彩 骗局 博狗地图