KCDDP ADV综合创作站 » 技术发布区 » [KR视觉研究会]支持半透明的退出询问对话框


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]

页: [1]


Powered by Discuz! Archiver 5.5.0  © 2001-2006 Comsenz Inc.