krkr基础教程7

 

存档和右键菜单

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

首先明确一下,右键设置指令rclick所能设置的只是点击了右键之后跳转到的标签的位置,没有什么更多的东西,在游戏里看到点击右键弹出菜单之类的,那是跳转到的标签下边写了具体的菜单的内容,而不是用rclick这个指令本身写了什么东西,rclick能起到的作用就是点击后jump或者点击后call

所以写一个右键菜单,最重要的是思路清晰,而具体写起来和写其他的界面没有什么区别……

那么,我们用上一篇教程里的那些代码作为基础,给他加上右键菜单,用到的素材请去上一篇里边下载图像或者自己随便找两张图片代替……

*open|
[position layer=message0 page=back frame=""]
[current layer=message0 page=back][er]

@macro name=出现人物立绘
[backlay]
[image layer=1 page=back storage="bt" visible=true left=100 top=0]
[pimage storage=&("btf"+mp.face) layer=1 visible=true dx=260 dy=107 page=back cond="mp.face!=void"]
[trans method=crossfade time=300][wt]
@endmacro

@macro name=出现对话框
[position layer=message0 left=50 top=430 width=704 height=140 marginl=71 margint=17 marginr=73 marginb=17 opacity=0 visible=true frame="frame" page=back]
[trans method=crossfade time=800][wt]
@endmacro

@macro name=更改背景图片
[image layer=base page=back storage=%storage visible=true left=0 top=0 opacity=255]
[trans method=crossfade time=500][wt]
@endmacro

@macro name=对话框消失
[position layer=message0 frame="" page=back]
[trans method=crossfade time=800][wt]
@endmacro

@macro name=人物立绘消失
[freeimage layer=1 page=back]
[trans method=crossfade time=300][wt]
@endmacro

@macro name=背景消失
[freeimage layer=base page=back]
[trans method=crossfade time=500][wt]
@endmacro

[rclick call=true target=*rclick enabled=true]
;这一句就是从现在开始(也就是游戏刚开始,macro里边的内容kr只是载入但是只有在脚本里边调用了这个macro的时候才会执行的)右键点击的话就会call到*rclick这个标签那里

[更改背景图片 storage="bg1"]
[出现人物立绘 face=2]
[出现对话框]

[current layer=message0 pgae=fore]
[deffont face="黑体" size=20 color=0x000000]
[defstyle linespacing=10 pitch=0 linesize=4]
[er]
我讨厌你。[p][er]

[rclick enabled=false]
;enabled=false的话右键点击就失效了,无论你怎么点都不会触发任何事件

[出现人物立绘 face=1]
[current layer=message0 pgae=fore]
所以我要关掉右键菜单。[p][er]

[rclick enabled=true]
;enabled=true的话右键再次开启,注意即使不用写其他的参数,也会按照最近的设置来进行跳转(当然如果遇到右键跳转变动的很频繁的情况建议每次都重新定义下以防万一=_=)

[出现人物立绘 face=2]
[current layer=message0 pgae=fore]
果然还是拒绝不了你的笑容。好吧……还是开放给你用吧。[p][er]

[对话框消失]
[人物立绘消失]
[背景消失]

[jump target=*open]
;跳回开始画面

;=================我是右键菜单具体内容的分割线===============

*rclick
[backlay]
[position layer=message1 page=back left=250 top=200 width=300 height=200 marginl=0 margint=0 marginr=0 marginb=0 opacity=200 visible=true color=0x000000]
[current page=back layer=message1][er][nowait][font face="黑体" size=18 color=0xffffff]
[locate x=0 y=10]我就是传说中的右键菜单
[locate x=30 y=80][link target=*save]我是存档[endlink]
[locate x=30 y=120][link target=*load]我是读档[endlink]
[endnowait]
[trans method=crossfade time=800][wt]
[rclick jump=true target=*drclick enabled=true]
;注意这一句,在第一次设定rclick的时候,那个右键是希望在对话进行中随时可以用右键跳转到某处,同时希望操作完了时候可以根据自己的需要再跳回来进行对话,因此我用的是call=true
;现在右键跳转到了这边,我们就需要把右键关掉以防玩家抽风在这个界面点击右键重复呼唤这个界面
;我之前说过很多次了,kag的[call]指令是可以嵌套的,但是rclick的call使用的是callExtraConductor,这个函数是不能嵌套的,如果使用rclick call到一个标签,在读到第一个return前再次rclick call的话,前边的rclick call的位置会被kr遗忘掉……=_=|||||然后一般的情况就是会报错说“call和return的数目不能一一对应”之类的……
;所以为了避免出现这种错误,在设定rclick的时候注意点了一次右键进行了跳转后就把原来的右键设定关掉,或者像上边那句那样,更改rclick的设定,我这里是设定为在这个界面点击右键就Jump到*drclick这个标签
[s]

*drclick
;这里把右键菜单消除,然后return回去,程序读到了[return]这一句的时候就会自动跳回主程序里玩家按右键前执行到的那里继续执行了
[position layer=message1 page=back visible=false]
[current page=back layer=message1][er][trans method=crossfade time=800][wt]
[rclick call=true target=*rclick enabled=true]
;回到对话的时候还是要右键唤出右键菜单的,所以这里需要重新定义一遍
[return]

这样,一个简陋无比的右键菜单就设定完成了……当然大家自己做的时候请发挥充分的想象力和创造力做出华丽的菜单来……所谓思想有多远特效就有多远(殴)

需要特别注意的地方是,rclick的call跳转到的段落,在return回来之前,绝对不能遇到可存档标签(就是“*标签名|存档名”这种格式的),一遇到就会报错,大家有兴趣可以尝试看看……

当然,现在点击按钮的话,他会跳出一个华丽的报错框告诉你“*save和*load标签未找到”,那么我们在下边把save和load界面做一下,把下边的这张图命名为"nodata"放到你的工程目录的image文件夹,然后将下边的代码添加到文件末尾

;因为我这里写的是用到缩略图的情况,所以不要忘记把config.tjs里边的saveThumbnail设定为true

p1

;=======================我是简陋的存读档界面的分割线======================

*save
[position layer=message1 page=back left=200 top=150 width=400 height=300 marginl=0 margint=0 marginr=0 marginb=0 opacity=200 visible=true color=0x000000]
*save0
[current page=back layer=message1][er][nowait][font face="黑体" size=18 color=0xffffff]
[locate x=10 y=5]我是存档界面

;第一个存档位
[locate x=10 y=30]

[button normal=&(kag.getBookMarkFileNameAtNum(0)) cond="kag.bookMarkDates[0] != void"]
;kag.getBookMarkFileNameAtNum(0)是kag的一个用来获取存档路径的函数,使用这个函数就会返回指定的存档的路径,后边那个()里边的0就是要获得的存档路径的编号,数字从0开始
;kag.bookMarkDates[0]是存档日期,我这里用他来判断0号存档有没有内容,如果这个存档曾经被使用过那么存档日期肯定不是空的……
;这一句就是如果这个存档存在的话就用button载入存档的缩略图

[button normal="nodata" cond="kag.bookMarkDates[0] == void"]
;这一句是如果存档不存在就载入“NODATA”图

[locate x=180 y=50]
[link target=*savedata1][emb exp="kag.bookMarkDates[0]" cond="kag.bookMarkDates[0] != void"][emb exp="'--------------'" cond="kag.bookMarkDates[0] == void"][endlink]
;这里是把存档日期作为link显示出来,如果界面要精美一点一般都是用button作为存档按钮,然后在上边另建一个图层放上存档日期,存档画面,当前对话之类的信息,不过我这里懒得做界面了,就直接用文字link了……

;第二个存档位
[locate x=10 y=180]
[button normal=&(kag.getBookMarkFileNameAtNum(1)) cond="kag.bookMarkDates[1] != void"]
[button normal="nodata" cond="kag.bookMarkDates[1] == void"]
[locate x=180 y=200]
[link target=*savedata2][emb exp="kag.bookMarkDates[1]" cond="kag.bookMarkDates[1] != void"][emb exp="'--------------'" cond="kag.bookMarkDates[1] == void"][endlink]

[endnowait]
[trans method=crossfade time=800][wt]
[rclick jump=true target=*drclick enabled=true]
[s]
;只有两个存档位我就一个一个写了,如果有很多个的话建议封成macro来写……会短很多……

*savedata1
;存档在第一个位置
[save place=0 ask=false]
;存档就是这个save指令,具体内容参见下边的指令集
[jump target=*save0]
;这里跳转到save界面开头重新定义一遍界面来进行修改资料的刷新

*savedata2
;存档在第二个位置
[save place=1 ask=false]
[jump target=*save0]

*load
[position layer=message1 page=back left=200 top=150 width=400 height=300 marginl=0 margint=0 marginr=0 marginb=0 opacity=200 visible=true color=0x000000]
[current page=back layer=message1][er][nowait][font face="黑体" size=18 color=0xffffff]
[locate x=10 y=5]我是读档界面

;第一个存档位
[locate x=10 y=30]
[button normal=&(kag.getBookMarkFileNameAtNum(0)) cond="kag.bookMarkDates[0] != void"]
[button normal="nodata" cond="kag.bookMarkDates[0] == void"]
[locate x=180 y=50]
[link target=*loaddata1 cond="kag.bookMarkDates[0] != void"][emb exp="kag.bookMarkDates[0]" cond="kag.bookMarkDates[0] != void"][emb exp="'--------------'" cond="kag.bookMarkDates[0] == void"][endlink cond="kag.bookMarkDates[0] != void"]

;第二个存档位
[locate x=10 y=180]
[button normal=&(kag.getBookMarkFileNameAtNum(1)) cond="kag.bookMarkDates[1] != void"]
[button normal="nodata" cond="kag.bookMarkDates[1] == void"]
[locate x=180 y=200]
[link target=*loaddata1 cond="kag.bookMarkDates[1] != void"][emb exp="kag.bookMarkDates[1]" cond="kag.bookMarkDates[1] != void"][emb exp="'--------------'" cond="kag.bookMarkDates[1] == void"][endlink cond="kag.bookMarkDates[1] != void"]

[endnowait]
[trans method=crossfade time=800][wt]
[rclick jump=true target=*drclick enabled=true]
[s]
;其实这里对于条件的判断用if会更简洁一些……不过我个人偏爱用cond……

*loaddata1
;读档第一个位置
[load place=0 ask=false]
;load就是读档的指令,具体内容参见下边的指令集

*loaddata2
;读档第二个位置
[load place=1 ask=false]

现在运行一下,可以看到简陋的存档读档界面了,不过这时可以发现一个问题,那就是存档缩略图截取的是执行[save place=xx ask=false]这一句时候的窗口画面,也就是说图片里边会把存读档界面那个黑框也一起显示出来,但是一般我们希望的缩略图是在唤出右键菜单前的对话时窗口里的内容,这时候就需要用到locksnapshotunlocksnapshot指令

把之前的代码右键菜单的部分修改为:

;=================我是右键菜单具体内容的分割线===============*rclick
[locksnapshot]
[backlay]
[position layer=message1 page=back left=250 top=200 width=300 height=200 marginl=0 margint=0 marginr=0 marginb=0 opacity=200 visible=true color=0x000000]
[current page=back layer=message1][er][nowait][font face="黑体" size=18 color=0xffffff]
[locate x=0 y=10]我就是传说中的右键菜单
[locate x=30 y=80][link target=*save]我是存档[endlink]
[locate x=30 y=120][link target=*load]我是读档[endlink]
[endnowait]
[trans method=crossfade time=800][wt]
[rclick jump=true target=*drclick enabled=true]
;注意这一句,在第一次设定rclick的时候,那个右键是希望在对话进行中随时可以用右键跳转到某处,同时希望操作完了时候可以根据自己的需要再跳回来进行对话,因此我用的是call=true
;现在右键跳转到了这边,我们就需要把右键关掉以防玩家抽风在这个界面点击右键重复呼唤这个界面
;我之前说过很多次了,kag的[call]指令是可以嵌套的,但是rclick的call使用的是callExtraConductor,这个函数是不能嵌套的,如果使用rclick call到一个标签,在读到第一个return前再次rclick call的话,前边的rclick call的位置会被kr遗忘掉……=_=|||||然后一般的情况就是会报错说“call和return的数目不能一一对应”之类的……
;所以为了避免出现这种错误,在设定rclick的时候注意点了一次右键进行了跳转后就把原来的右键设定关掉,或者像上边那句那样,更改rclick的设定,我这里是设定为在这个界面点击右键就Jump到*drclick这个标签
[s]

*drclick
;这里把右键菜单消除,然后return回去,程序读到了[return]这一句的时候就会自动跳回主程序里玩家按右键前执行到的那里继续执行了
[position layer=message1 page=back visible=false]
[current page=back layer=message1][er][trans method=crossfade time=800][wt]
[rclick call=true target=*rclick enabled=true]
;回到对话的时候还是要右键唤出右键菜单的,所以这里需要重新定义一遍
[unlocksnapshot]
[return]

现在再重新存档,可以看到存档缩略图变成了唤出右键菜单以前的画面locksnapshot这个指令的作用就是把执行到它时候的游戏画面存下来,等到save的时候作为缩略图输出,使用了locksnapshot后必须在存了档之后用unlocksnapshot释放他,不然下次使用的时候会报错

关于存读档画面,经常用到的几个需要知道的函数如下:

kag.getBookMarkFileNameAtNum(place),取得指定编号的存档的文件路径

kag.bookMarkDates[place],指定编号的存档时间

kag.bookMarkNames[place],指定编号的存档标签名(就是那个*start|test里的test)

kag.bookMarkStorages[place],当存档时程序正在执行的ks文件名

kag.historyLayer.data[kag.historyLayer.dataPos-1],存档前最后一句对话的内容

 

save
存档
place
存档位置编号,从0开始,不写就是默认0
ask
是否跳出存档确认窗口,不写就是默认false

load
存档
place
读档位置编号,从0开始,不写就是默认0
ask
是否跳出读档确认窗口,不写就是默认false


姓名:

评论:

验证码

CAPTCHA Image


FrostMonarch

2016-07-30 05:17:49

大家注意,例程有误!*load,里面的第二个存档位,[link target=*loaddata1 应该为*loaddata2  

 

npd

2015-09-21 15:41:22

解决了,如果把右键菜单单独创一个文件rclick.ks的话返回的时候文字层应该是0,这样剧本才会显示

 

npd

2015-09-20 22:49:17

水螅大大求助,我按照你的代码写出了简单的右键菜单,第一次按右键可以叫出菜单,然后再按右键能关闭菜单,但是返回后就不能读取接下来的脚本文字了,求解qwq

 

TiAmo

2015-04-25 18:47:53

突然觉得还是得从零开始~

 

baser

2015-03-20 16:18:20

成功了!多谢水螅大大指点

 

hydrozoa

2015-03-20 00:28:23

回复 baser :kag.textspeed是文字出现的速度,自动阅读的速度应该是kag.autospeed,值是0到10,10最快

 

baser

2015-03-19 21:35:26

多谢水螅大大指点

但是....不知道为什么这么改了好像自动播放时候的速度没什么太大变化.....

 

baser

2015-03-19 12:37:32

@baser

制作滑动槽的自动阅读速度如下

[slider value="kag.textspeed" base=滑动槽 width=189 height=23 normal=滑动槽按钮 max=10 min=0]

 

baser

2015-03-18 13:03:42

水螅大大你好。

我想请问一下autoread的速度参数是什么。。。实在找不到了

 

xiaorang

2015-03-17 10:19:16

你好水螅

 

b

2015-03-10 21:23:38

水螅大虾,我又试了一次,这次我把你这页涂蓝的都写进了ks里面,并且做了适当的修改(比如什么背景啊,人物啊文字啊都删了=_=)结果有存档和读档的界面,但是问题是没有返回游戏标题的按钮+_+ 之后我又自己放上了一个返回游戏标题的按钮([locate x=30 y=160][link target=*gotostart]返回标题[endlink]就直接放在你的我是存档的代码下面

*gotostart

@gotostart ask=true

@jump storage="first.ks" target=*star)但是试着运行了下返回标题,结果我我点击开始游戏后出现了如下

 文件:autolable.ks

标记:autolable.ks

右键点击处理子程序内extraCondutor在子程序内无法加入可以保存的剧本标签

 

 

a

2015-03-09 21:48:42

水螅大虾,能否放出一个简短的存档和读档,同时可以看到存档缩略图变成了唤出右键菜单以前的画面的范例,其实基础教程7没看懂=_=||,其余大虾的范例都看了就是跳来跳去的没得懂(要求冒昧拒绝也是正常请见谅)

 

hydrozoa

2015-03-06 05:39:18

回复 a:不需要其他插件,不过请检查你savedata文件夹里是否有data1.bmp文件……比如你把这段代码copy到自己的项目中跑了一遍,然后点了存档,但是此时config里截图选项没有打开,但系统变量已经认为你有了data1.bmp这张图……你就算之后改了config,再跑也会报错,只能把旧的savedata删掉重来

 

a

2015-03-02 12:31:40

在config.tjs裡將存檔截圖打開、运行后出错显示是不能打开save/data1.bmp,是否还需要加个运行插件的指令?需要的话该怎么写?

 

hydrozoa

2014-11-16 07:07:44

回复 紫月:嗯是的,你需要在config.tjs裡將存檔截圖打開,那個有中文註釋很容易就能找到的~

 

紫月

2014-11-16 03:13:06

圖片有放進去啊 後來我做嘗試先存兩個檔之後會換成讀取圖片那一行失誤

 

我現在是在猜想 是不是我沒有吧存檔的設定數量開道兩個而已 我是掛預設值

 

hydrozoa

2014-11-16 02:20:14

回复 紫月:大概是因為你沒有nodata那張圖……我前邊有說到會用到一些上個教程裡的圖片……

 

紫月

2014-11-14 22:40:29

不好意思在這邊打擾

我用了存檔介面之後在

[button normal="nodata" cond="kag.bookMarkDates[0] == void"]

這邊會出現錯誤說找不到檔案 請問何解@@

 

TOP

访客数: 728557
aa