【KRKR进阶实用教程】1、捕获鼠标位置——存档界面制作

原创 2013年07月24日 22:11:12

■注意事项■
※如果你刚接触krkr,那么阅读前强烈推荐先阅读水螅姐的教程把KAG等基本知识学明白:猛击这里
※本文建立在读者已经读过一遍krkr自带tjs文档的前提下而撰写,所以不对其中出现的一些在tjs文档里已经详尽说明的函数、方法、语法等基础知识再做过多的说明,如果阅读过程中有看不懂的地方,请去参考tjs文档。
※本文使用的KRKR版本为KCDDP上分享的KCDDP KAGeXpress 3.0汉化版。
※为了照顾非IT人士,一些IT方面的基础知识会附带一些说明链接,仅供参考,百度google才是您更好的选择。

学习Kag的过程是一帆风顺的,但是学习tjs的过程确实有些小坎坷。最大的原因就是网上能找到的资料基本全是日文的,中文的关于写、改tjs的教程实在是很少有人做。对于没有一些基础的人来说,这真是略难啃的一个东西。所以一直想做这样的一个教程,把一些学习到的东西分享给大家。

废话不多说,下面开始正文。


第一篇将介绍基础中的基础……从最简单的捕获鼠标位置应用说起,相信许多人都用过这个功能了吧,因为KAG文档后部分对这些常用TJS都进行了一些说明来着……这个也很适合拿来做TJS的入门。
下面范例的脚本,在这里下载:请点击。你需要自己新建一个工程,然后用这些东西去覆盖,就可以跑起来了。

假如说我们现在要做一个存档界面,准备一张背景,然后几个存档按钮,似乎就OK了。假如设计四个存档点,我们用最最古老的办法这样写:

[current layer=message0]
[er]
;存档位1号
[locate x=50 y=120]
[button normal=save_1 over=save_2 on=save_1 storage="first.ks" target=*save exp="tf.savePos=1"]

;存档位2号
[locate x=220 y=120]
[button normal=save_1 over=save_2 on=save_1 storage="first.ks" target=*save exp="tf.savePos=2"]

;存档位3号
[locate x=390 y=120]
[button normal=save_1 over=save_2 on=save_1 storage="first.ks" target=*save exp="tf.savePos=3"]

;存档位4号
[locate x=560 y=120]
[button normal=save_1 over=save_2 on=save_1 storage="first.ks" target=*save exp="tf.savePos=4"]



这就是所谓的hardcode,写一个存档点的代码,然后各种复制粘贴就可以了。如果想要十个存档点,就再复制粘贴六次。如果想要100个存档点,就再复制粘贴90次……是不是略多啊!明明是重复率很高的代码,可不可以写得更简洁一点呢?
于是可能好多人都尝试过用标签和jump构成的循环。下面用循环来画12个存档块

[current layer=message0]
[er]
[eval exp="tf.i=0"]
*startFor
[locate x=&(50+tf.i%4*170) y=&(120+tf.i\4*130)]
[button normal=save_1 over=save_2 on=save_1 storage="first.ks" target=*save exp="tf.savePos=tf.i+1"]
[eval exp="tf.i++"]
[jump target=*startFor cond="tf.i<12"]
[s]
效果图:


代码量超少有木有,一下子就高端洋气了许多。但是真正尝试这样写过的朋友可能都遇到过最致命的一个问题……那就是这12个存档点无论点击哪一个,都会显示”存档到13号位置”……也就是说这12个点击最后触发的exp="tf.savePos=?"的这个?值都一律是13
这是由于tf.i在你把整个页面都画好的时候,它的值已经是12了,这时候再点击触发exp,只会得到12+1=13,12个档位都是如此。于是这个存档瞬间就变得没有任何意义了,因为它的功能是有缺陷的。为了解决这个问题,我们需要使用坐标获取。
[button normal=save_1 over=save_2 on=save_1 storage="first.ks" target=*save exp="getSavePos()"]
点击的时候不是直接给变量赋值而是调用了一个函数,函数当然需要我们自己写。

@iscript
// 点击时获取点击的档位号
function getSavePos(){
	var x=kag.lastMouseDownX; // 获取上次点击时的鼠标X坐标
	var y=kag.lastMouseDownY; // 获取上次点击时的鼠标Y坐标
	
	tf.savePos = calSavePos(x, y)+1;
}

// 根据坐标x,y,计算所在的档位号
function calSavePos(x, y){
	//计算方式参照我们画档位按钮时的坐标[locate x=&(50+tf.i%4*170) y=&(120+tf.i\4*130)] 
	var xIndex = (x-50)\170;
	var yIndex = (y-120)\130;
	return xIndex + yIndex*4;
}
@endscript
现在,再点击存档位按钮,一切就正常了,和用hardcode写的效果是一样的,但是代码量大大减少。就算要写100个档位也只是改几个数字而已。


恭喜从石器时代进化到了蒸汽时代,下面试着让系统再丰满一些,增加存档预览功能。
我们只需要把鼠标移到存档位上,便会自动显示此存档的相关讯息(比如存档日期、存档标题、存档时角色正在说的话等内容)。不是点击,只是鼠标移到上面就可以显示,这要怎么实现呢。
[button normal=save_1 over=save_2 on=save_1 storage="first.ks" target=*save exp="getSavePos()" onenter="savePreview()" onleave="hideSavePreview()"]
savePreview()和hideSavePreview()函数也需要我们自已来写。

// 点击时获取点击的档位号
function savePreview(){
    var x=kag.fore.base.cursorX; // 获取目前鼠标所在X坐标
    var y=kag.fore.base.cursorY; // 获取目前鼠标所在Y坐标
    
    var pos = calSavePos(x, y)+1;
    var msgLayer = kag.fore.messages[1];
    msgLayer.font.height=24;
    msgLayer.drawText(0,0,"存档位"+pos+"的预览信息XXXXXX在此!",0xffffff);
    msgLayer.visible=true;
}

// 预览信息消失
function hideSavePreview(){
    var msgLayer = kag.fore.messages[1];
    msgLayer.clear();
    msgLayer.visible=false;
}

这样的话鼠标移到档位上时,会显示预览信息。从档位移开时,预览信息就消失了。
对这部分代码简单提几点。kag.fore.base.cursorX得到的是鼠标的位置。kag.fore.base就是我们一般在KAG里写的那个layer=base层,而cursorX是它的一个属性。里面记录的就是鼠标在其之上的X坐标,因为大家知道base层是和屏幕等大小并且不能移动,所以鼠标在base层上的坐标也就一定是在屏幕上的坐标了。它跟lastMouseDownX的区别在于,lastMouseDownX需要点击之后才会变化,而cursorX是随时变化的。
calSavePos()函数就是上面写过的那个函数啦,这里直接调用它了。把通用的、多次用到的代码写成函数然后再调用是很好的习惯。
var msgLayer = kag.fore.messages[0];是拿到message0层,然后对它直接进行操作。
drawText就是在图层上写字的功能啦。0,0分别是X,Y坐标,第三个参数是要写的文字,第四个参数是字的颜色。注意这个写字是瞬间写上去的,不会一个一个蹦。
除了可以在message层上写字,直接在图片层上写字也是可以的。
font.height就是设置字号
visible就顾名思义了,为true时可见,false不可见。
clear()方法是用来把这个图层上的东西清空的,在message层功能就相当于[er]了。

效果图:

至此,本次的教程就结束了。介绍了一些获取鼠标位置的常用属性,获取图层的方法,在图层上写字的方法,以及它们在一个界面中的实际应用。这些都是基础中的基础,对于有一定的KRKR使用经验的人,就算是KAG党恐怕也早就了解了吧。何况这些知识的使用方法其实在KAG的说明档里也都有提到过。因为本着“实用教程”的原则,是希望这里提到的东西能在实际使用中能够派上用场的。下次争取讲些更“高端”的内容……如果还有下回的话。。。


KRKR简单使用实例开发

[wait time=100][loadplugin module=wuvorbis.dll][startanchor];确定在游戏中选择回到标题画面时的返回处[cm];清除全部的文字层的内容[rcl...
  • w_yunlong
  • w_yunlong
  • 2015年12月30日 09:33
  • 3940

【KRKR进阶实用教程】1、捕获鼠标位置——存档界面制作

测试测试测试测试
  • zoharxmj
  • zoharxmj
  • 2013年07月24日 22:11
  • 2833

KRKR进阶实用教程源码 1、捕获鼠标位置

  • 2013年07月24日 22:01
  • 42KB
  • 下载

VC++全局钩子实现鼠标坐标值实时捕获

自从使用.NET WinForm后已经很长时间没用VC++ MFC写过程序了,今天一问友给出一道VC++的题。 题目:使用钩子(HOOK)实现鼠标在屏幕上移动时实时捕获当前位置坐标,并在程序对话框的...
  • u010561359
  • u010561359
  • 2013年05月28日 21:45
  • 2610

Android 游戏存档位置分析

大型游戏制作发行商 GameLoft 它的游戏得so 函数名都经过了混淆, 要想快速找到想要的关键点, 通过其他没有被混淆的关键词,定位想要的关键点。...
  • frankpi
  • frankpi
  • 2015年08月19日 17:10
  • 3645

【LWJGL官方教程】总目录

原文:https://github.com/LWJGL/lwjgl3-wiki/wiki/2.6.-Tutorial-Index 译注:慢慢翻译,主要是给自己看的。基础 开始使用LWJGL 入门 ...
  • zoharxmj
  • zoharxmj
  • 2015年10月28日 18:36
  • 2067

谁要的手机用KRKR2 Onscripter 资源打包工具

本软件可以把你手机上指定目录打包为文字冒险游戏资源文件 支持打包 1、Onscripter 的NSA格式 2、吉里吉里2(KRKR2)的XP3,(分2.29以前的旧版本和2.30以后新版本) ...
  • luozhuang
  • luozhuang
  • 2014年06月19日 21:59
  • 4678

[120629]初恋1/1【汉化硬盘版+高压汉化硬盘版】[带全CG存档+攻略]

游戏类型 游戏原名:初恋1/1 制作公司:tone work’s 发布日期:2012年06月29日 汉化日期:2015年12月30日 汉化小组:星冈学园文学社&脸肿汉化组 游戏类型:学园、恋爱、社团 ...
  • wangzi867258173
  • wangzi867258173
  • 2016年02月16日 19:07
  • 6390

谈谈AVG游戏的Android移植(NScripter与吉里吉里)

大家好,很久不见,小弟最近闭关修炼iPhone中,所以很长时间没更新博文(顺便在写某物的C++版,另外某物0.3.2版与WP7版已构建完成,不久就会发布)。这次回来,先换个与某物无关的话题,以目前用户...
  • cping1982
  • cping1982
  • 2011年08月13日 14:54
  • 30506

【LWJGL2 WIKI】【基础篇】基础2:输入

原文:http://wiki.lwjgl.org/wiki/LWJGL_Basics_2_%28Input%29Introduction 介绍LWJGL用Keyboard和Mouse类自己做输入处理。...
  • zoharxmj
  • zoharxmj
  • 2016年01月02日 17:56
  • 534
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【KRKR进阶实用教程】1、捕获鼠标位置——存档界面制作
举报原因:
原因补充:

(最多只允许输入30个字)