KCDDP ADV综合创作站 » 技术发布区 » YesNoDialog.tjs图片窗口版(不支持半透明)


2008-5-6 17:22 全局变量D
YesNoDialog.tjs图片窗口版(不支持半透明)

[code]
// YesNoDialog.tjs - はい/いいえを選択するダイアログボックス
// Copyright (C)2001-2006, W.Dee and contributors  改変・配布は自由です

class YesNoDialogWindow extends Window
{
        var yesButton; // [はい] ボタン
        var noButton; // [いいえ] ボタン
        var result = false; // no:false yes:true
        
        //添加临时层
              var tempLayer;        
        property temporaryLayer
        {
                // ワークエリアとして一時的に使用できるレイヤを返す
                getter()
                {
                        if(tempLayer === void)
                        {
                                tempLayer = new KAGLayer(this, primaryLayer);
                                tempLayer.name = "一時ワークレイヤ";
                        }
                        return tempLayer;
                }
        }

        function YesNoDialogWindow(message, cap)
        {
                super.Window();

                // メインウィンドウから cursor**** の情報をとってくる
                if(global.Window.mainWindow !== null &&
                        typeof global.Window.mainWindow.cursorDefault != "undefined")
                        this.cursorDefault = global.Window.mainWindow.cursorDefault;
                if(global.Window.mainWindow !== null &&
                        typeof global.Window.mainWindow.cursorPointed != "undefined")
                        this.cursorPointed = global.Window.mainWindow.cursorPointed;

                // 外見の調整
                borderStyle = bsNone;
                innerSunken = false;
                caption = cap;

                // プライマリレイヤの作成
                add(new Layer(this, null));

                // プライマリのマウスカーソルを設定
                if(typeof this.cursorDefault !== "undefined")
                    primaryLayer.cursor = cursorDefault;
                    
                    //不同询问窗口的底图
                    if (message=="是否退出?")
                            primaryLayer.loadImages("yn_exit_cn");
                    else if (message=="是否回到开始?")
                            primaryLayer.loadImages("yn_return_cn");
                    else
                            primaryLayer.loadImages("yn_bgd");
                           
                    primaryLayer.setSizeToImageSize();
                    
                    
                // 文字样式设定               
                primaryLayer.font.face="黑体";
                primaryLayer.font.height=28;

        
                var tw = primaryLayer.font.getTextWidth(message);
                var th = primaryLayer.font.getTextHeight(message);

                // サイズを決定
              var max_tw = 0;
              var sum_th = 0;
              var messages = message.split('\n');
              for (var i=0; i < messages.count; i++)
              {
                      var lw = primaryLayer.font.getTextWidth(messages[i]);
                      var lh = primaryLayer.font.getTextHeight(messages[i]);
                      if (lw > max_tw)
                      max_tw = tw;
                      sum_th += lh + 0; // 行間が必要なら+0より大きくする
              }
              tw = max_tw;
              th = sum_th;

                var w =primaryLayer.width;
                var h = primaryLayer.height;

                setInnerSize(w, h);

                primaryLayer.width = w;
                primaryLayer.height = h;

                // ウィンドウ位置の調整
                if(global.Window.mainWindow !== null && global.Window.mainWindow isvalid)
                {
                        var win = global.Window.mainWindow;
                        var l, t;
                        l = ((win.width - width)>>1) + win.left;
                        t = ((win.height - height)>>1) + win.top;
                        if(l < 0) l = 0;
                        if(t < 0) t = 0;
                        if(l + width > System.screenWidth) l = System.screenWidth - width;
                        if(t + height > System.screenHeight) t = System.screenHeight - height;
                        setPos(l, t);
                }
                else
                {
                        setPos((System.screenWidth - width)>>1, (System.screenHeight - height)>>1);
                }


                // message文字的描绘
              var msgpos_y = 60;
              
              if (message!="是否退出?" && message!="是否回到开始?")
              {
                      for (var i=0; i < messages.count; i++)
                      {
                               var lw = primaryLayer.font.getTextWidth(messages[i]);
                               var lh = primaryLayer.font.getTextHeight(messages[i]);
                               var msgpos_x = (w - lw)\2;
                              
                               primaryLayer.drawText(msgpos_x, msgpos_y, messages[i],0xFFFFFF);
                              
                               msgpos_y += lh + 10; // 调整行间距
                      }
              }

                // Yesボタン
                add(yesButton = new ButtonLayer(this, primaryLayer));
                yesButton.loadButtons("yn_yes_cn_1.png","yn_yes_cn_2.png","yn_yes_cn_2.png");//确认按钮的图片
                yesButton.top = 135;//调整按钮显示位置
                yesButton.left = (primaryLayer.width/3)-(yesButton.width/2);//调整按钮显示位置
                yesButton.visible = true;


                // Noボタン
                add(noButton = new ButtonLayer(this, primaryLayer));
                noButton.loadButtons("yn_no_cn_1.png","yn_no_cn_2.png","yn_no_cn_2.png");//取消按钮的图片
                noButton.top = 135;//调整按钮显示位置
                noButton.left =  (primaryLayer.width*2/3)-(yesButton.width/2);;//调整按钮显示位置
                noButton.visible = true;


        }

        function finalize()
        {
                super.finalize(...);
        }

        function action(ev)
        {
                // action
                if(ev.type == "onClick")
                {
                        if(ev.target == yesButton)
                        {
                                result = true;
                                close();
                        }
                        else if(ev.target == noButton)
                        {
                                result = false;
                                close();
                        }
                }
                else if(ev.type == "onKeyDown" && ev.target === this)
                {
                        // パッド入力に対応する処理
                        switch(ev.key)
                        {
                        case VK_PADLEFT:
                                yesButton.focus();
                                break;
                        case VK_PADRIGHT:
                                noButton.focus();
                                break;
                        case VK_PAD1:
                                if(focusedLayer == yesButton)
                                {
                                        result = true;
                                        close();
                                }
                                else if(focusedLayer == noButton)
                                {
                                        result = false;
                                        close();
                                }
                                break;
                        case VK_PAD2:
                                result = false;
                                close();
                                break;
                        }
                }
        }

        function onKeyDown(key, shift)
        {
                super.onKeyDown(...);
                if(key == VK_ESCAPE)
                {
                        // ESC キーが押された
                        // 「いいえ」として処理
                        result = false;
                        close();
                }
        }
}

// Yes か No かはっきりさせる関数
function askYesNo(message, caption = "确认", yesFunc=void, noFunc=void, param=void, doneFunc=void)
{
    var win = new YesNoDialogWindow(message, caption);
        win.showModal();
    var res = win.result;
    invalidate win;

    if (res) {
        if (yesFunc !== void) {
            yesFunc(param);
        }
    } else {
        if (noFunc !== void) {
            noFunc(param);
        }
    }

    if (doneFunc !== void) {
        doneFunc(param);
    }
}
[/code]

[attach]319[/attach]

把代码和范例素材一起丢进system文件夹里覆盖同名文件就可以了。
感谢翔嵐绘制的范例素材~

[[i] 本帖最后由 全局变量D 于 2012-3-23 11:00 编辑 [/i]]

2008-5-6 17:35 godxq1986
谢谢大大的无私分享啊:'(

2008-5-6 17:43 全局变量D
1基础代码来自:
shawind
[url]http://www.rpgchina.com/bbs/read-htm-tid-19562-fpage-3.html[/url]

2在询问窗口文字(通常在Mainwindow.tjs里的askyesno函数调用的地方,自己找吧...)中使用\n可以进行手动换行功能来自教程:
Arai Kou
[url]http://project-lips.net/products/krkr.htm[/url]

[[i] 本帖最后由 全局变量D 于 2011-11-22 14:06 编辑 [/i]]

2008-5-7 00:52 sarah707
这个很有爱啊~卡卡~下次如果挖新坑的话用用看看~

2008-5-7 15:24 kider
[code]D大真有爱,我再锦上添花吧。
primaryLayer.font.face="黑体";
primaryLayer.font.height=28;
更改字体、字号,加到“\\message文字的描绘”的下面即可。
primaryLayer.drawText(msgpos_x, msgpos_y, messages[i], 0xFFFFFF, 255, true, 255, 0x000000, 5, 2, 2);
这个改动是给提示文字的右下角(2,2)位置填加宽度为5的阴影。
以上注意是在不用font.tft的前提下。[/code]

[[i] 本帖最后由 kider 于 2008-5-7 15:26 编辑 [/i]]

2008-5-7 18:58 全局变量D
编辑了字体部分上去...XD

原来drawtext还有阴影属性的..(一直都直接用描绘两次来搞定阴影XDD)

[[i] 本帖最后由 全局变量D 于 2008-5-7 19:06 编辑 [/i]]

2008-5-8 15:25 godxq1986
哦~原来字体大小使用primaryLayer.font.height啊,我说我写了primaryLayer.font.size怎么不管用呢:L
另外字体设定那里还有primaryLayer.font.bold = true之类的可以用到,edge和shadow啦等等

2008-6-25 22:33 sarah707
win.showModal();
如果不是为了这个……我真想用layer做……T-T

2008-8-10 22:01 全局变量D
Window.setMaskRegion
機能/意味
ウィンドウリージョンをマスクに従って設定
タイプ
Windowクラスのメソッド

構文
setMaskRegion(threshold=1)

引数
threshold  マスクのスレッショルド ( 敷居値 ) を指定します。
 プライマリレイヤのマスク ( レイヤの不透明度の情報 ) のうち、この値よりも大きい部分の形に ウィンドウが切り取られて表示されます。


戻り値
なし (void)

説明
 ウィンドウリージョンをプライマリレイヤのマスク ( レイヤの不透明度の情報 ) に従って設定します。
 ウィンドウを不定形にする事ができます。
 表示されるプライマリレイヤと、ウィンドウの大きさ、位置がずれないようにするには 以下のことを行う必要があります。

Window.borderStyle は bsNone に設定します。
Window.innerSunken は false に設定します。
Window.layerLeft および Window.layerTop は 0 に設定します。
Layer.imageLeft および Layer.imageTop は 0 に設定します。
参照
Window.removeMaskRegion
----------------------------------------------

即是说,在primaryLayer创造出来以后,可以加入命令
setMaskRegion(数值);
则作为窗口背景使用的图片上,有某点的透明度小于该数值时,这一点将会被透明化...形成非方型窗口的效果.
但是,无法支持半透明.

2009-7-31 10:35 nozomiqx
本人菜鸟~~~

真的很好用,但是不好意思问一下,tlg可以用什么软件查看?(总不能要看的时候都要打开游戏吧~~本人菜鸟~~~)

2011-11-21 19:33 全局变量D
格式范例:

一般的按钮,三张图:
一般:[attach]313[/attach]
按下:[attach]314[/attach]
选中:[attach]315[/attach]

YESNO里需要用到的按钮,一张图:
[attach]316[/attach]

2011-11-21 19:55 全局变量D
使用普通按钮的方法:
还有,第二个办法是:
在一开始的
var yesButton; // [はい] ボタン
var noButton; // [いいえ] ボタン
这两行后面,加入:

        var tempLayer;        
        property temporaryLayer
        {
                // ワークエリアとして一時的に使用できるレイヤを返す
                getter()
                {
                        if(tempLayer === void)
                        {
                                tempLayer = new KAGLayer(this, primaryLayer);
                                tempLayer.name = "一時ワークレイヤ";
                        }
                        return tempLayer;
                }
        }


然后再采用
add(noButton = new ButtonLayer(this, primaryLayer));
noButton.loadButtons("normal", "over", "on");
的方式来处理按钮。

页: [1]


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