krkr教程.docx
《krkr教程.docx》由会员分享,可在线阅读,更多相关《krkr教程.docx(107页珍藏版)》请在冰豆网上搜索。
![krkr教程.docx](https://file1.bdocx.com/fileroot1/2023-2/7/14d221b0-60b1-499c-9f6e-419252f929e2/14d221b0-60b1-499c-9f6e-419252f929e21.gif)
krkr教程
[krkr初初级教程]初初级恋爱养成游戏制作入门注意……
2007-06-2717:
45
开始用一个引擎,就要先明了这个引擎可以做什么。
不是说知道kr可以做avg这样的程度,事实上只要有耐心,就算用kr做slg也是可以实现的。
很多打算入门做avg的mm之前都没有编程基础之类,我遇到的大部分是对画立绘或者写剧本有爱然后转过来的……所以常常会看到这样的问题:
“开始界面怎么做?
”
这种问题,回答的话就会觉得很无力,因为开始界面和其他的界面没有什么不同,并不是要另外特别输入的什么东西,而只是一张背景图和几个按钮的组合而已。
有些华丽的会加上一些画面效果,但主体就是按钮,只要会做按钮就可以做标题画面,但是似乎常常有人完全不这样想的样子……
在游戏策划阶段,思路上是整体的在想游戏界面和系统,但到写程序的时候,则要把这些界面全部拆分成元素来考虑。
比如一个半即时rpg战斗界面,我的思路就是设定一个timer,设定interval属性,这个属性的作用就是确定在timer为enabled=true时每隔多少时间跳转到ontimer()一次。
在ontimer()里边就可以单位数值的增加时间变量,以及每跳转到这里一次扣除根据各个角色速度计算出来的时间槽减少值,并根据这个变化对应的改变每个角色时间槽内色块的长度。
而当长度为0时[也就是记录速度槽长度的变量为0时]就跳转到该角色的行动模块,行动模块由按钮组成,比如法术,单击了法术按钮后跳转到法术模块,根据人物不同出现法术的选择菜单{依然只是按钮},选择了某个按钮后就清空各个按钮,再播放角色的攻击动画,和敌人的被攻击动画{有时候也不是什么动画,有张图就可以了……|||||}动画播放完毕根据双方攻击力防御力魔功魔防之类计算下敌人的损失[对于游戏平衡来说这里的计算式设定很重要],如果主角有兵器养成之类的设定还可以在主角兵器使用次数变量上加1之类之类,这些都很自由了。
因为主角的兵器养成的效果不是在这里就体现的,而是根据使用次数变量再经过计算体现的,所以这里只要改变次数变量就可以取得相应效果了[而这些效果的模块一般写在其他地方,不要手动去调整所有变量,相互有影响的变量让他自己影响]。
当某角色的hp变量为0时就判断他进入死亡状态,同时的麻痹,盲目之类的状态也都可以用变量赋值,在ontimer里用if进行各种动作的判断。
就是说,一个战斗界面并不是有三个角色在和三个敌人战斗,而是上方有一些变量控制的色块{当然也可以华丽的用图片},下方有几个人物站立动画,到一定时间会出现按钮。
要做一个这样的界面,需要会的就是1对画面{色块}的长度控制,2动画播放的控制,3按钮的设置,4清晰的变量处理。
如果还想要什么华丽的画面效果的话就再进修一下各种画面动作。
自己分析出这些元素,然后就可以看对应的引擎可不可以做得到,或者自己能不能实现这些功能,到这一步时,对别人的提问才比较有诚意。
什么都不想,直接去问“战斗界面怎么做”“对话界面怎么做”,会让回答的人很为难的,因为要把思路解释清楚很麻烦,看我如此努力的解释一个战斗界面的构成也没讲清楚就知道了……而且每个人的思路也不一样,要实现某个目的想采取的途径也是不一样的。
那么就从kr可以做什么说起。
这里就只讲kag层面,tjs层面应该不会涉及……但是我必须要说的是,kr和ns比较起来,最大的优点就是tjs……就是说,用ns的时候,你发现某个效果做不到,那么基本上就是做不到了,但是kr的话,在kag{功能和ns类似}层面做不到的事情可以用tjs完成,因为tjs对应更基层,也可依据需要自由修改kag的指令内容。
但是这里是初初级入门……就不多谈了……
做一个一般的电子小说,需要的功能有1.画面的插入,精灵的动作控制{如位置设定,移动,渐变之类},2.按钮和标签跳转,3.文字对话的显示,4.save/load功能[就是因为这种东西自己写很麻烦所以才需要直接用引擎……]如果是分歧式电子小说或者要加入养成要素,那就需要5.对变量的控制。
kag[现在开始讲的都是KCDDP的KAGeXpress,其他的版本会有一些指令的不同,推荐使用KAGeXpress,第一是中文,第二是增添了很多方便的指令,可以到去下载]的画面控制分为layer层和Massage层,具体的指令使用方法见docjpn\kag3doc。
layer层主要承担前景图片的插入如人物立绘,使用方法是image,如:
@imagelayer=25page=backstorage="m1"visible=truex=103y=25opacity=255cond="f.月==1"
kr的语句格式一般都是这样,“@指令属性1=xxx属性2=xxx属性3=xxx”或者“[指令属性1=xxx属性2=xxx属性3=xxx]”这两种效果是一样的,但[]后边可以再跟[],@的话那一行就结束了
属性的设定顺序无所谓,可以省略的属性不写也可以,属性能不能省略可以查阅指令集
上边那句话的直译就是就是:
载入图片,在layer第25层[层值越大越上方显示,25层的图片可以覆盖住24-0层和base层,不过这个是由图层的index属性控制,可用layopt更改,KAGeXpress默认0层是100000,每层加100,如layer1就是100100,把layer25的index改成100101的话,它的显示就会在layer1和layer2之间,message层默认是在layer之上的,也可以通过这种方法将message层放在layer层的图片之下。
],在里层[kag的所有层都分为表层和里层,表层是我们能看到的,将图片放在里层再通过trans指令将里层复制到表层可达到各种渐变,淡入等画面效果,如果直接image在表层,则就是瞬间显示。
],图片名叫“m1”[在默认目录下可以不用写路径和后缀,kr支持的图片格式请自己查阅说明,最值得一提的是可以直接用png……也可以用同样有a通道的tlg,kr自带的工具里有将图片转为tlg的工具。
],可见能见[设定为false就是不可见],左上角坐标是103,25,透明度255[范围0-255,0就是完全透明],当变量“f.月”值为1的时候执行[绝大部分kag指令都有cond这个指令,就是在cond=的式子为真时执行整个语句,为假时就当它不存在的跳过,比写if方便多了。
必须注意的是式子格式,“==”“>"这些演算子两边一定要各有一个半角空格……]。
注意,base层插入的图片一定要和窗体大小一样,不然会花屏。
如果m1是动画则不需要多写什么插入后它会自己动作的。
有关于动画,kr的图片动画是单独用asd文件写的[如图片是m1,需要进行截取的动画图片就要叫“m1_a”,然后新建一个文本文件,重命名为m1.asd,具体写法请参阅system\LineBreak.asd],只有image在layer层才能播放动画,pimage和layer是message层都不行。
[KCDDP论坛里有大人写了其他的动画播放插件,讨厌asd或者有需要的人可以去看看]
载入图片后,也有很多方便的指令可以做出各种画面效果,如我前边提到的trans,如果只打算trans一个图层,trans里也有layer属性设定,如果不设定就是将所有图层的里层复制到表层,这种情况下,一般使用[backlay],该指令的意思是瞬间把所有表层复制到里层,使用[backlay]之后再image或freeimage在里层,然后trans的话,就可以达成只有刚操作的那一层出现画面效果的变化。
[trans的layer属性基本上只对base层适用……其他层的话……请死心的使用backlay吧……]
move也是常用的画面操作指令,使用格式是[movelayer=1page=foretime=1000path="(0,0,255)(50,50,100)"]这样,其它也还有一些属性,不设定的话就用默认的,具体参看指令集docjpn\kag3doc。
注意path的移动是从当前layer的位置开始的,比如image时left=300,top=125,move的时候就会从300,125用1000ms移动到0,0,再用1000ms移动到50,50。
第三个位置是透明度,有时候不方便用trans也可以用move不动左上角坐标只动透明度来达成淡入淡出效果。
action也是常用到的指令,具有画面旋转,变形,摇动等多种功能,具体参阅\kagex\action.txt.
这些指令在执行时如果后便不跟着wait,那么就会一边执行一边直接执行下一语句[比ns方便的地方],但是trans和其他的混用的时候要考虑到fore和back层的变化,比如,fore在被移动的时候trans,back层却没移动……那么trans出来的图片就是back层没移动的样子……另外,同时使用两个trans是不可能的。
move,trans都是对message也适用的指令。
默认message层是message0,比如在文档里直接写入一行“今天天气真好”,那么这行字就会显示在message0上。
设定当前操作的message层是用[currentlayer=message1page=back]这样,注意message层的back有时候是默认不显示的,在第一次用某个message时最好加一句[layoptlayer=message8page=backvisible=true]这样,不然你所载入的东西可能不会显示。
message层承担的主要是文字显示和按钮的功能。
文字的显示就是current之后,在文档里直接写入文字,就会在current的message层左上角的部分开始显示文字,kr有自动换行和自动翻页的功能。
message层的具体设定是使用position这一指令进行的,如:
[positionlayer=message1left=97top=480width=661height=100marginl=0margint=0marginr=0marginb=0opacity=0visible=true]
left和top就是设定改message层的左上角,height和width是高和宽,marginl,t,r,b则分别是字向内缩进多少像素,opacity是透明度,在message层设定颜色的时候用,不过一般来说,用色块做对话框哪里有图片来的华丽……所以它还有对话框图片载入属性“frame”,在该属性里加入对话框图片的名字就好。
载入后如果想消去就写“frame=""”就可以了……
文字的控制主要有[l]行末等待点击,[p]翻页等待点击,[r]改行,[er]清空该message层{该层全部清空包括该层的按钮}
文字的字体用font设定,size是大小,face是字体,color是颜色,italic是斜体,bold是黑体,shadow是阴影,edge是镶边,edgecolor和shadowcolor就不用说了……
defstyle设定行间距字距之类的值,这些看指令集可以很容易明白,就不多说了。
kag里的按钮全部是放在message层上的,分为两种:
button和link,link就是文字链接,使用方法如下
[linkstorage=open.kstarget=*start]我是按钮[endlink][r]
link的部分是表示下边开始的文字是link,在遇到[endlink]之前,所有该message层上的文字都会变成一个点击后跳转到open.ks里*start标签的按钮。
一般来说,我看到的中文kr教程基本上是用link的,因为方便……不过真的制作游戏的话,当然是用button华丽啊!
印象中我从来没在游戏里用过link……
button的使用格式如下:
[locatex=100y=555]
[buttongraphic="n"target=*nclickse="l1"enterse="b2"recthit=false]
graphic是使用的图片,格式是三张排在一起,第一张是平时,第二张是按下,第三张是鼠标接触。
或者也可以不设graphic,将三张图片分开用normal通常时的图片;over鼠标移动到按钮上时的图片,省略则使用与normal同一张图片;on点下鼠标时的图片,省略则使用与over同一张图片。
具体说明可以去看KAGEX追加指令文档。
也可以利用button载入图片如[buttonnormal="a1"]就可以只是载入了一张图片,而没有其他的作用。
在button的位置上再用button后来定义的button图片会把先定义的覆盖。
同时必须注意的是,message层和layer层不一样,message层在position里注明了大小,如果在大小之外放button或者文字是不会显示的,如果在边缘放置就会只显示范围内的部分,其他部分会被切掉。
这一点其实可以利用来作很多动态效果……
按钮的清空和文字一样,用[er]
target是跳转到的标签,有关于标签的部分在这里说一下好了。
标签用*开头,使用方法见下:
*哈哈
[evalexp="tf.temp1=tf.temp1+1"]`该句的意思是给临时变量tf.temp1的值加1,请注意赋值的是“=”,判断相等的是“==”,还有一般的运算式两边要记得加半角空格,有些时候好像不会有影响有些时候却会……所以还是在意一点比较好。
另外“`”之后表示的就是注释部分,在运行代码时程序会将之忽略掉,一行都是注释的话可以用“;”
[jumptarget=*哈哈cond="tf.temp1<10"]
这样在tf.temp1的值等于10之前,每执行到jump,就会跳回到*哈哈的位置。
标签可以放在macro外的任何地方。
jump就是跳转指令,主要属性是target和storage。
storage是跳转到的文档名,target是跳转到的标签名。
与之使用相似的是call指令,call指令跳转到的标签在顺序执行到[return]时就会跳回到call那句指令的下一行继续执行。
在使用的时候要注意call和return的对应。
clickse是点击音效,enterse是接触音效
recthit是是否根据a通道决定按钮范围,比如你的按钮是一个心型,那么在recthit=false的时候,鼠标点击心型之外的地方是不会有效果的,如果是true,则会按照心型的那张图片的矩形来设定按钮范围。
默认是false
上边介绍的是button的常用属性,其他还有一些属性,请自己查阅指令集。
注意,如果在一个地方设定了button,再在该处进行文字显示的话,文字会被button挡住。
button的位置用locate设定,必须注意的是,locate设定的x,y值并不是屏幕上的x,y值,而是加上该message左上角的x,y值,即以message左上角为0坐标而不是屏幕的左上角。
locate的具体意思就是在这个坐标开始下边的工作,也就是说不管是按钮的定义还是文字的显示,都是可以用这个来调整的。
save和load,kr里的save并不是即时save,而是save最近的一个save标签。
标签格式是“*xxx|save1”这样,就是在一般的标签后加了一个“|”,但是KAGeXpress是可以进行翻页存档的,即每个[p]的地方可以被纪录。
save和load的格式差不多,place属性确定存入或读取的是哪一个档,ask属性确定是否在存档前跳出确定窗口。
另外,如果要做有当前截图和当时对话的存读档界面还要结合Config.tjs里的saveThumbnail和用tjs式取得对话框message层text值,这里就不细说了。
不过这个存档界面是有别人写好的插件的,而且也有中文翻译了,有兴趣的话可以找来看看。
最后再说kr的变量控制的基础常识。
kr的变量分为tf(临时变量,程序结束就消失)f(游戏变量,会被保存在存档里)sf(系统变量,单独存在datasu.ksd或者datasc.ksd里,我记不清楚是哪个了……||||一般用来作为系统设定,判断游戏进行了几周目这一类的功能),还有只读变量mp,在macro里使用,具体使用例子我会在初级入门里说明,初初级就不多说了……||||||
给变量赋值使用的是[evalexp="tjs式"]这个不仅可以用来给变量赋值,也可以用来调用function。
变量的用途很多,但在avg中一般就是一个作用,那就是判断。
如下:
*t1
你喜欢吃蜜瓜吗?
[p]
[linktarget=*t2]喜欢[endlink][r]
[linktarget=*t3]讨厌[endlink][r]
*t2
[evalexp="f.好感度=f.好感度+20"]
[jumptarget=*t3]
*t3
[er]
[jumptarget=*特殊事件1cond="f.好感度>16"]
*特殊事件1
那我们一起去吃蜜瓜吧。
[p]
当某个数值比如好感度到达一定的数值的时候,就跳至某个事件,这是恋爱养成类游戏最常用到的设定……这个变量也可以是体力值,智力值之类的任何东西,如何利用变量是非常自由的,每个人的使用习惯也不一样,多发挥想象力就好。
变量的计算符除了“+”“-”“*”“/”外还有“\”除取整,和及或的符号是“&&”“||”使用是[evalexp="f.temp0=5"cond="f.temp1==1||f.temp2==5"]这样。
变量销毁是[evalexp="deletef.temp1"]。
变量的显示是emb,用法:
[evalexp="f.主角姓名='水螅'"][embexp="f.主角姓名"]这样,水螅就会显示在message上。
差不多……基础部分需要注意的就是这些了,开始学kr最重要的文件就是指令集,虽然那个是日文的……不过,只要有爱的话,还是可以半猜半试的看懂的……无论什么教程都不会那么详细地把所有指令的用法说明一遍,所以,想要知道一个效果能不能实现,自己查一下指令集是基本的。
kag其实封装了很多方便的指令,多看看指令集也可以避免重复劳动……
那么,初初级kr入门注意就到此结束……如果我依然这么闲的话,大概会在不久的将来做出初级教程来……||||大概……
【krkr教程1】建立新的工程
2008-07-2617:
03
这种从基础基础开始的kag教程天娜其实写过了……因为我和她用kag的习惯不很一样……而且我今天闲的发毛……于是就再做一个这样的教程……
该教程为水螅制作,未经允许,请勿转载
这个教程是以kcddp汉化的KAGeXpress为基础的,有部分指令可能和日文版有出入
首先下载了KAGeXpress之后,使用里边的Wizard.exe建立一个新工程,建立完成之后就会弹出kacg.config的窗口,这个都是中文,按照需要的内容进行设置就好,这里设置的想要修改就在新建立的那个工程文件夹中的Config.tjs里进行相应的修改
现在可以看一下生成的工程文件夹的结构
根目录下是一个krkr.exe和一个data文件夹
这里的krkr.exe就是真正意义上的krkr,如果单独执行它的话,会跳出目录选择对话框让你选择游戏资料的目录,然后从那个目录中寻找startup.tjs,执行里边的内容
但是这里我们建立的工程是已经关联好的,双击krkr.exe的话,会直接执行旁边的data文件夹里边的startup.tjs
KAGeXpress的执行顺序是startup.tjs->Initialize.tjs->func.ks->first.ks
对于初学者来说,这些都不用管,kag具体写游戏的部分从first.ks开始写
data文件夹里有startup.tjs,krenvprf.kep,Config.tjs,一些dll文件,11个文件夹
startup.tjs的作用刚才讲过了,就是让kr去执行Initialize.tjs的内容,这个文件不需要修改它
krenvprf.kep记录的是一些游戏运行的信息,删掉它还会再生成,也不需要管他
Config.tjs是游戏整体的一些设定,里边有大量的中文注释,建议一行一行看下去然后修改自己需要的地方。
(tjs文件的打开方式和txt文件是一样的,用notepad等就可以开)
一般来说,进行修改的主要内容是:
1.标题栏文字System.title(这里写的文字将会出现在游戏窗口的标题栏上)
2.使用预渲染文字global.useconfigMappfont(这个牵扯到打包字体,在以后说,不使用就是false)
3.窗口大小scWidth和scHeight(kr可以创建任意大小的窗口,但是请注意窗口大小很奇怪的话可能会导致全屏化出错,另外使用的素材也请一定要对比着窗口大小来制作)
4.存档方式freeSaveDataMode(如果打算做成lm那种打开选择文件的对话框来选择存档就写true,如果要像一般游戏那样有自己做的存读档界面就写false)
5.是否保存缩略图saveThumbnail(存读档界面上如果设定了需要有存档画面的就要写true)
6.存档地址saveDataLocation
7.是否在存档中保存宏saveMacros(除非你确定你的游戏绝对不会再做任何macro方面的修改了,否则建议设定为false)
8.自动记录已读文章autoRecordPageShowing(设定为true的时候,还没读过的文字没办法skip,这些信息记录在datasc.ksd和datasu.ksd文件里)
9.可用的音效缓冲数量numSEBuffers(设定为3的时候就是可以同时播放3个音效,通道为0、1、2,具体音效播放方法以后再说)
10.可用的layer数量numCharacterLayers(设定为3的时候就是layer0layer1layer2可以用,如果写了layer3就会报错,请务必注意,但是该数量可以在脚本中随时更改,未必一定要在这里改)
11.可用的message数量numMessageLayers(设定为3的时候就是message0message1message2可以用,如果写了message3就会报错,请务必注意,但是该数量可以在脚本中随时更改,未必一定要在这里改)
12.进入游戏后message0是否默认可见initialMessageLayerVisible(message0的可见在游戏里可以任意修改,这里设成什么都无所谓,但是一定要知道自己设了什么,做游戏的时候,随时明白自己的每个图层的情况是很重要的)
13.最多可存的进度数量numBookMarks
14.菜单设定Menu_visible_config
15.自动换行换页设定defaultAutoReturn(一般设定为true,这样文字在超过对话框的时候会自动换行或等待翻页)
16.背景音乐文件格式type(就是用playbgm播放的音乐,播放不属于当前设定格式的音乐文件就会没有声音,注意所有用插件播放的比如mp3ogg都是设定为wave)
以上是通常会设定的部分,没有写到的部分要么是在游戏里可以随便改,要么是一般不太用到(好吧其实是我一般不太用到,我很少做有配音有动画之类的游戏……)
dll文件都是些插件,这些在func.ks里一般都载入了,以后会讲到插件载入的方法
11个文件夹,这些文件夹名字都是在Initialize.tjs里设定好的,在游戏里调用素材的时候不用写路径,直接写文件名,kr就会在这11个文件夹里寻找这个名字的文件然后调用,所以说,即使是不同文件夹里的文件,也一定不要重名!
相对的,如果不是放在这些文件夹里的文件,要调用的时候就要写明路径
这些文件夹里
system放置的建立起kag的tjs文件,对话等待点击时候出现的那两个动画