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
;=======================我是简陋的存读档界面的分割线======================
*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]这一句时候的窗口画面,也就是说图片里边会把存读档界面那个黑框也一起显示出来,但是一般我们希望的缩略图是在唤出右键菜单前的对话时窗口里的内容,这时候就需要用到locksnapshot和unlocksnapshot指令
把之前的代码右键菜单的部分修改为:
;=================我是右键菜单具体内容的分割线===============
*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
Created by Hydrozoa.2011
不支持IE7以下浏览器
凯恩插件程序:Hydrozoa 美术:Hydrozoa,红渊