2010-9-25 20:28
全局变量D
[KR视觉研究会]支持半透明的退出询问对话框
我也不知道为什么一直在折腾这个……好吧至少它做出来了。
看这横跨我KR学习生涯的帖子们:
[url]http://kcddp.keyfc.net/bbs/viewthread.php?tid=228[/url]
[url]http://kcddp.keyfc.net/bbs/viewthread.php?tid=724[/url]
[code]
;------------------------------------------------------------------------------------------------------------------------
;【带半透明效果的退出询问对话框】ver 1.0
;------------------------------------------------------------------------------------------------------------------------
;by 全局变量D 改造·加工自由,转载请保留此注释信息
;感谢KCDDP群里的吐槽众……-v-
;说明:
;在kag脚本里call一下askyesno.ks当然是必要的
;使用时请查找修改MainWindow.tjs,在对应askYesNo指令前加上yesno_object.
;修改退出游戏询问窗口:askYesNo("是否退出?", "确认", onCloseYes);=》yesno_object.askYesNo("是否退出?", "确认", onCloseYes);
;修改返回标题询问窗口:askYesNo("是否回到开始?", "确认", goToStart);=》yesno_object.askYesNo("是否回到开始?", "确认", goToStart);
;特点:
;不与kag.callExtraConductor冲突
;相比YesNoDialog.tjs图片窗口版,支持半透明,但是也有缺陷
;不支持存储、读取时弹出的询问框,因为需要终止脚本取得返回值,这部分请自行使用kag制作╮(╯_╰)╭
;------------------------------------------------------------------------------------------------------------------------
@if exp="typeof(global.yesno_object) == 'undefined'"
@iscript
// 可将消息传递到母层的按钮
class YNButtonLayer extends ButtonLayer
{
function YNButtonLayer(window, parent)
{
super.ButtonLayer(window, parent);
focusable = false;
}
function finalize()
{
super.finalize(...);
}
function onClick()
{
super.onClick(...);
}
function onMouseUp(x, y, button, shift)
{
if(enabled && button == mbLeft)
parent.onButtonClick(this);
super.onMouseUp(...);
}
}
//获取鼠标键盘键盘响应,返回值的层
class AskFrame extends KAGLayer
{
var yesButton;
var noButton;
var result;
//创建层以及按钮
function AskFrame(win, par)
{
super.KAGLayer(...);
hitType = htMask;
hitThreshold = 0;
focusable=true;
loadImages("yesno_bgd"); // 载入背景图片,当然可以随便修改
setSizeToImageSize();
//图片位置设定,这里设定成自动居中,高度为窗口三分之一左右的位置
left=(kag.width-this.width)/2;
top=(kag.innerHeight-this.height)/3;
//确认按钮
yesButton = new YNButtonLayer(kag, this);
yesButton.loadImages("yes",);//确认按钮的图片
yesButton.top = (this.height-yesButton.height)*2/3+10;
yesButton.left = (this.width-yesButton.width)/3;
yesButton.visible = true;
//取消按钮
noButton = new YNButtonLayer(kag, this);
noButton.loadImages("no",);//取消按钮的图片
noButton.top = (this.height-yesButton.height)*2/3+10;
noButton.left = (this.width-yesButton.width)*2/3;
noButton.visible = true;
}
function finalize()
{
super.finalize(...);
}
//描绘询问窗口上的文字信息
function show(message)
{
//设定字体,当然可以随便修改
this.font.face="幼圆";
this.font.height="24";
this.font.bold=true;
// 取得单行文字长、宽
var tw = this.font.getTextWidth(message);
var th = this.font.getTextHeight(message);
//读取换行符\n效果
var max_tw = 0;
var sum_th = 0;
var messages = message.split('\n');
for (var i=0; i < messages.count; i++)
{
var lw = this.font.getTextWidth(messages[i]);
var lh = this.font.getTextHeight(messages[i]);
if (lw > max_tw)
max_tw = tw;
sum_th += lh + 0;
}
tw = max_tw;
th = sum_th;
var w =this.width;
var h = this.height;
// message文字的描绘
var msgpos_y = 40;
for (var i=0; i < messages.count; i++)
{
var lw = this.font.getTextWidth(messages[i]);
var lh = this.font.getTextHeight(messages[i]);
var msgpos_x = (w - lw)\2;
this.drawText(msgpos_x, msgpos_y, messages[i],0x75d9a9,,,255,0xFFFFFF,2);//反正drawText支持的所有功能也都有,随便描吧
msgpos_y += lh + 10; // 调整行间距
}
}
//隐藏并返回点下后的结果
function onButtonClick(sender)
{
if(sender == yesButton)
{
result=true;
}
else if(sender == noButton)
{
result=false;
}
//根据结果执行
yesno_object.done(result);
}
}
//插件本体
class YesNoPlugin extends KAGPlugin
{
var win;
var yesFunc;
var noFunc;
var param;
var doneFunc;
var visible=false;
var result=false;
function YesNoPlugin(window,owner)
{
super.KAGPlugin();
this.window = window;
this.owner=owner;
}
function finalize()
{
super.finalize(...);
}
function askYesNo(message, caption = "确认", yesFunc=void, noFunc=void, param=void, doneFunc=void)
{
if (visible==true) return;//假如已经有询问对话框显示,不执行
if (kag.inStable==false) return;//非安定状态,不执行
win=new AskFrame(kag,kag.fore.base);//创建一个图片询问对话框
win.visible = true;//显示对话框
win.setMode();//使询问对话框可以取得鼠标键盘动作
win.focus();
win.show(message);//在询问对话框上描绘文字
kag.systemMenu.enabled=false;//禁止系统菜单操作
visible=true;//将状态设定为显示
//取得点选后执行的函数
this.yesFunc=yesFunc;
this.noFunc=noFunc;
this.param=param;
this.doneFunc=doneFunc;
}
//当点选后,根据层返回的值,执行内容
function done(result)
{
this.result=result;
if (result==true)
{
if (yesFunc !== void)
{
yesFunc(param);
}
}
else
{
if (noFunc !== void)
{
noFunc(param);
}
}
if (doneFunc !== void)
{
doneFunc(param);
}
win.removeMode();//不再取得鼠标键盘动作
win.visible = false; //隐藏询问对话框
kag.systemMenu.enabled=true;//恢复系统菜单操作
visible=false;//将状态设定为隐藏
}
function onCloseYes()
{
kag.onCloseYes();
//神奇的是,goToStart()是可执行的,但是onCloseYes()执行不能,于是多加了一个函数
}
}
kag.addPlugin(global.yesno_object = new YesNoPlugin(kag));
@endscript
@endif
[return]
[/code]
ks文件:
[attach]289[/attach]
范例素材:
[attach]290[/attach]
效果——我知道很难看……不过反正就那样吧……orz
[attach]291[/attach]
2010-9-26 23:58
全局变量D
更新,加入了键盘按键响应的部分……
[code]
;------------------------------------------------------------------------------------------------------------------------
;【带半透明效果的退出询问对话框】ver 1.0
;------------------------------------------------------------------------------------------------------------------------
;by 全局变量D 改造·加工自由,转载请保留此注释信息
;感谢KCDDP群里的吐槽众……-v-
;说明:
;在kag脚本里call一下askyesno.ks当然是必要的
;使用时请查找修改MainWindow.tjs,在对应askYesNo指令前加上yesno_object.
;修改退出游戏询问窗口:askYesNo("是否退出?", "确认", onCloseYes);=》yesno_object.askYesNo("是否退出?", "确认", onCloseYes);
;修改返回标题询问窗口:askYesNo("是否回到开始?", "确认", goToStart);=》yesno_object.askYesNo("是否回到开始?", "确认", goToStart);
;特点:
;不与kag.callExtraConductor冲突
;相比YesNoDialog.tjs图片窗口版,支持半透明,但是也有缺陷
;不支持存储、读取时弹出的询问框,因为需要终止脚本取得返回值,这部分请自行使用kag制作╮(╯_╰)╭
;------------------------------------------------------------------------------------------------------------------------
@if exp="typeof(global.yesno_object) == 'undefined'"
@iscript
// 可将消息传递到母层的按钮
class YNButtonLayer extends ButtonLayer
{
function YNButtonLayer(window, parent)
{
super.ButtonLayer(window, parent);
focusable = false;
}
function finalize()
{
super.finalize(...);
}
function onClick()
{
super.onClick(...);
}
function onMouseUp(x, y, button, shift)
{
if(enabled && button == mbLeft)
parent.onButtonClick(this);
super.onMouseUp(...);
}
}
//获取鼠标键盘键盘响应,返回值的层
class AskFrame extends KAGLayer
{
var yesButton;
var noButton;
var result;
//创建层以及按钮
function AskFrame(win, par)
{
super.KAGLayer(...);
hitType = htMask;
hitThreshold = 0;
focusable=true;
loadImages("yesno_bgd"); // 载入背景图片,当然可以随便修改
setSizeToImageSize();
//图片位置设定,这里设定成自动居中,高度为窗口三分之一左右的位置
left=(kag.width-this.width)/2;
top=(kag.innerHeight-this.height)/3;
//确认按钮
yesButton = new YNButtonLayer(kag, this);
yesButton.loadImages("confirm_3.bmp",);//确认按钮的图片
yesButton.top = (this.height-yesButton.height)*2/3+10;
yesButton.left = (this.width-yesButton.width)/3;
yesButton.visible = true;
//取消按钮
noButton = new YNButtonLayer(kag, this);
noButton.loadImages("cancel_3.bmp",);//取消按钮的图片
noButton.top = (this.height-yesButton.height)*2/3+10;
noButton.left = (this.width-yesButton.width)*2/3;
noButton.visible = true;
}
function finalize()
{
super.finalize(...);
}
//描绘询问窗口上的文字信息
function show(message)
{
//设定字体,当然可以随便修改
this.font.face="幼圆";
this.font.height="24";
this.font.bold=true;
// 取得单行文字长、宽
var tw = this.font.getTextWidth(message);
var th = this.font.getTextHeight(message);
//读取换行符\n效果
var max_tw = 0;
var sum_th = 0;
var messages = message.split('\n');
for (var i=0; i < messages.count; i++)
{
var lw = this.font.getTextWidth(messages[i]);
var lh = this.font.getTextHeight(messages[i]);
if (lw > max_tw)
max_tw = tw;
sum_th += lh + 0;
}
tw = max_tw;
th = sum_th;
var w =this.width;
var h = this.height;
// message文字的描绘
var msgpos_y = 40;
for (var i=0; i < messages.count; i++)
{
var lw = this.font.getTextWidth(messages[i]);
var lh = this.font.getTextHeight(messages[i]);
var msgpos_x = (w - lw)\2;
this.drawText(msgpos_x, msgpos_y, messages[i],0x75d9a9,,,255,0xFFFFFF,2);//反正drawText支持的所有功能也都有,随便描吧
msgpos_y += lh + 10; // 调整行间距
}
}
//按键时变换选中的按钮
function focus_switch()
{
if (yesButton.Butt_mouseOn==false)
{
yesButton.onMouseEnter();
noButton.onMouseLeave();
}
else
{
yesButton.onMouseLeave();
noButton.onMouseEnter();
}
}
//键盘响应
function onKeyDown(key, shift)
{
window.hideMouseCursor();
switch(key)
{
//ESC
case VK_ESCAPE:
onButtonClick(noButton);
break;
//ENTER
case VK_RETURN:
if(yesButton.Butt_mouseOn==true)
{
onButtonClick(yesButton);
}
else if(noButton.Butt_mouseOn==true)
{
onButtonClick(noButton);
}
break;
//左
case VK_LEFT:
focus_switch();
break;
//右
case VK_RIGHT:
focus_switch();
break;
}
}
//隐藏并返回点下后的结果
function onButtonClick(sender)
{
if(sender == yesButton)
{
result=true;
}
else if(sender == noButton)
{
result=false;
}
//根据结果执行
yesno_object.done(result);
}
}
//插件本体
class YesNoPlugin extends KAGPlugin
{
var win;
var yesFunc;
var noFunc;
var param;
var doneFunc;
var visible=false;
var result=false;
function YesNoPlugin(window,owner)
{
super.KAGPlugin();
this.window = window;
this.owner=owner;
}
function finalize()
{
super.finalize(...);
}
function askYesNo(message, caption = "确认", yesFunc=void, noFunc=void, param=void, doneFunc=void)
{
if (visible==true) return;//假如已经有询问对话框显示,不执行
if (kag.inStable==false) return;//非安定状态,不执行
win=new AskFrame(kag,kag.fore.base);//创建一个图片询问对话框
win.visible = true;//显示对话框
win.setMode();//使询问对话框可以取得鼠标键盘动作
win.focus();
win.show(message);//在询问对话框上描绘文字
kag.systemMenu.enabled=false;//禁止系统菜单操作
visible=true;//将状态设定为显示
//取得点选后执行的函数
this.yesFunc=yesFunc;
this.noFunc=noFunc;
this.param=param;
this.doneFunc=doneFunc;
}
//当点选后,根据层返回的值,执行内容
function done(result)
{
this.result=result;
if (result==true)
{
if (yesFunc !== void)
{
yesFunc(param);
}
}
else
{
if (noFunc !== void)
{
noFunc(param);
}
}
if (doneFunc !== void)
{
doneFunc(param);
}
win.removeMode();//不再取得鼠标键盘动作
win.visible = false; //隐藏询问对话框
kag.systemMenu.enabled=true;//恢复系统菜单操作
visible=false;//将状态设定为隐藏
}
function onCloseYes()
{
kag.onCloseYes();
//神奇的是,goToStart()是可执行的,但是onCloseYes()执行不能,于是多加了一个函数
}
}
kag.addPlugin(global.yesno_object = new YesNoPlugin(kag));
@endscript
@endif
[return]
[/code]