THE NVL Maker

 找回密码
 注册
搜索
查看: 8288|回复: 7

[常见问题] 关于播放视频时点击关闭报错的问题

[复制链接]

26

主题

47

帖子

0

精华

游戏开发者

积分
47
发表于 2020-8-19 20:52:33 | 显示全部楼层 |阅读模式
本帖最后由 吃货红毛 于 2020-8-19 21:08 编辑



播放视频的时候,点击窗口关闭按钮会报错

播放视频的代码如下 @mv canskip="0" storage="dream1.wmv"

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

16

主题

916

帖子

0

精华

管理员

Rank: 9Rank: 9Rank: 9

积分
937
发表于 2020-8-20 11:12:54 | 显示全部楼层
和视频无关,是MyYesNoDialog在播放视频和不播放视频时调用的是不同的逻辑。
如果模板工程播放时一样有此问题请告知版本,
看报错的情况,似乎是传入了“字体名”而非“带扩展名的预渲染字体文件”,到需要传入“文件”的参数。
是否是147/315行的this.font.mapPrerenderedFont(ynset.msg.face);
这个地方的ynset.msg.face应该修改为正确的预渲染字体文件,如果没有预渲染文件的话删除对应行即可。


回复

使用道具 举报

26

主题

47

帖子

0

精华

游戏开发者

积分
47
 楼主| 发表于 2020-8-20 18:12:52 | 显示全部楼层
VariableD 发表于 2020-8-20 11:12
和视频无关,是MyYesNoDialog在播放视频和不播放视频时调用的是不同的逻辑。
如果模板工程播放时一样有此问 ...

修改后,不会报错了,但是只弹出了确认框本体 确定 和 取消 按钮不见了……
回复

使用道具 举报

16

主题

916

帖子

0

精华

管理员

Rank: 9Rank: 9Rank: 9

积分
937
发表于 2020-8-20 19:38:16 | 显示全部楼层
贴一下MyYesNo的代码?
或者用这个替换。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

26

主题

47

帖子

0

精华

游戏开发者

积分
47
 楼主| 发表于 2020-8-20 21:51:02 | 显示全部楼层
VariableD 发表于 2020-8-20 19:38
贴一下MyYesNo的代码?
或者用这个替换。

替换之后 还是无法显示按钮 以防万一贴一下

//
// YesNoDialog の改変
// レイヤダイアログで処理可能にする
//

/**
* ウインドウ版
* ムービー再生中などはこちらを利用
*/

/*
添加方法:
1、在必然被加载的脚本内任意地方添加一行KAGLoadScript("MyYesNoDialog.tjs");
2、根据MainWindow.tjs里的各种询问对话,改写本插件内的字典yesnoMap的询问对话,用于对应图片
3、改造版本的效果:会将询问对话直接描绘在背景层上。当视频播放时,背景层不会透明这点请注意
*/
class MyYesNoDialogWindow extends Window
{
        var yesButton; // [はい] ボタン
        var noButton; // [いいえ] ボタン

    var tempLayer; // テンポラリレイヤ

    var result = false; // no:false yes:true

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

    var baseStorage;
    var message;
   
    function MyYesNoDialogWindow(baseStorage,message="")
        {
        super.Window();
        //非常规情况,独立底图
        /*
        if (message=="")
        {
                this.baseStorage = baseStorage;
                this.message="";
        }
        //其他情况,显示默认底图
        else
        {
                this.baseStorage = "Sample_ASKPANEL"; //改造过的,直接显示空白底图
                this.message=message;
        
        }
        */
        
                // メインウィンドウから 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;
                showScrollBars = false;

                // プライマリレイヤの作成
        add(new Layer(this, null));
        
                // プライマリのマウスカーソルを設定
                if(typeof this.cursorDefault !== "undefined")
                        primaryLayer.cursor = cursorDefault;

                // 拡大率の設定
                if (kag.fullScreen) {
                        if (kag.innerWidth / kag.scWidth < kag.innerHeight / kag.scHeight)
                                setZoom(kag.innerWidth, kag.scWidth);
                        else
                                setZoom(kag.innerHeight, kag.scHeight);
                } else {
                        setZoom(kag.zoomNumer, kag.zoomDenom);
                }
               
                primaryLayer.loadImages(baseStorage);
                primaryLayer.setSizeToImageSize();
                setInnerSize(primaryLayer.width * zoomNumer / zoomDenom,
                                         primaryLayer.height * zoomNumer / zoomDenom);
        setMaskRegion();
        
                // ウィンドウ位置の調整
                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);
                }
        var ynset=Scripts.evalStorage("uiyesno.tjs");
                       
                // Yesボタン
        add(yesButton = new ButtonLayer(this, primaryLayer));
                yesButton.loadButtons(ynset.btnyes.normal, ynset.btnyes.over, ynset.btnyes.on);
                yesButton.top  = ynset.btnyes.y;
                yesButton.left = ynset.btnyes.x;
                yesButton.visible = true;

                // Noボタン
                add(noButton = new ButtonLayer(this, primaryLayer));
        noButton.loadButtons(ynset.btnno.normal, ynset.btnno.over, ynset.btnno.on);
        noButton.top  = ynset.btnno.y;
                noButton.left = ynset.btnno.x;
                noButton.visible = true;
               
                //--------------------------------------------------------
                //自定义文字样式
                primaryLayer.font.face=kag.scflags.chDefaultFace;
                primaryLayer.font.height=ynset.msg.textsize;
                primaryLayer.font.bold=ynset.msg.bold;
                primaryLayer.font.italic=ynset.msg.italic;
               
                var color=ynset.msg.color;
                var edge=ynset.msg.edge;
                var shad=ynset.msg.shadow;
                var edgec=ynset.msg.edgecolor;
                var shadc=ynset.msg.shadowcolor;
               
                //预渲染文字
                if (ynset.msg.face!=void)
                {
                        primaryLayer.font.face=ynset.msg.face;
                        //预渲染字体加这行
                        //primaryLayer.font.mapPrerenderedFont("Font_s.tft");
                }
               
                // 取得单行文字长、宽
                var tw = primaryLayer.font.getTextWidth(message);
                var th = primaryLayer.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 = primaryLayer.font.getTextWidth(messages);
                        var lh = primaryLayer.font.getTextHeight(messages);
                        if (lw > max_tw)
                        max_tw = tw;
                        sum_th += lh + 0;
                }
                tw = max_tw;
                th = sum_th;

                var w =primaryLayer.width;
                var h = primaryLayer.height;
               
                //设定位置
                var msgpos_x = ynset.msg.centerleft-tw/2;
                var msgpos_y = ynset.msg.centertop-th/2;

                // message文字的描绘
                for (var i=0; i < messages.count; i++)
                {
                        var lw = primaryLayer.font.getTextWidth(messages);
                        var lh = primaryLayer.font.getTextHeight(messages);

                        msgpos_x = ynset.msg.centerleft-lw/2;
                       
                        //根据样式描绘文字
                        if (edge) {primaryLayer.drawText(msgpos_x, msgpos_y, messages, color, 255, true, 255, edgec, 1, 0, 0);}
                        else if (shad) {primaryLayer.drawText(msgpos_x, msgpos_y, messages, color, 255, true, 255, shadc, 0, 2, 2);}
                        else {primaryLayer.drawText(msgpos_x, msgpos_y, messages, color, 255, true);}

                        msgpos_y += lh + 3; // 调整行间距

                }
                //--------------------------------------------------------

        }

        function finalize()
        {
                invalidate tempLayer if tempLayer !== void;
                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();
                }
        }

        function onMouseDown(x, y, button)
        {
        if(button == mbRight) {
            result = false;
            close();
        }
    }
}

/**
* ダイアログ版
*/
class MyYesNoDialogLayer extends DialogLayer
{
    var baseStorage;
    var result = false;

    var yesFunc;
    var noFunc;
    var param;
    var doneFunc;
   
    function MyYesNoDialogLayer(baseStorage, yesFunc, noFunc, param, doneFunc, message)
        {
        super.DialogLayer(kag, kag.primaryLayer, baseStorage + "ダイアログ");

        var ynset=Scripts.evalStorage("uiyesno.tjs");
        this.yesFunc = yesFunc;
        this.noFunc  = noFunc;
        this.param   = param;
        this.doneFunc = doneFunc;
                this.baseStorage = ynset.bgd.frame;

        setOption(%[frame : baseStorage]);
        addButton(%[ x : ynset.btnyes.x, y :  ynset.btnyes.y, normal:ynset.btnyes.normal, over:ynset.btnyes.over, on:ynset.btnyes.on]);
        addButton(%[ x :  ynset.btnno.x, y :  ynset.btnno.y, normal:ynset.btnno.normal, over:ynset.btnno.over,  on:ynset.btnno.on]);

                //自定义文字样式
                //this.font.face=kag.scflags.chDefaultFace;
               
                this.font.height=ynset.msg.textsize;
                this.font.bold=ynset.msg.bold;
                this.font.italic=ynset.msg.italic;
                var color=ynset.msg.color;

                var edge=ynset.msg.edge;
                var shad=ynset.msg.shadow;
                var edgec=ynset.msg.edgecolor;
                var shadc=ynset.msg.shadowcolor;
               
                //修改字体
                if (ynset.msg.face!=void)
                {
                        this.font.face=ynset.msg.face;
                        //预渲染字体加这行
                        //this.font.mapPrerenderedFont("Font_s.tft");
                }
                else
                {
                        this.font.face=kag.fore.messages[0].userFace;
                }

                // 取得单行文字长、宽
                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);
                        var lh = this.font.getTextHeight(messages);
                        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;
               
                //设定位置
                var msgpos_x = ynset.msg.centerleft-tw/2;
                var msgpos_y = ynset.msg.centertop-th/2;
                       
                // message文字的描绘
                for (var i=0; i < messages.count; i++)
                {
                        var lw = this.font.getTextWidth(messages);
                        var lh = this.font.getTextHeight(messages);
                       
                        msgpos_x = ynset.msg.centerleft-lw/2;
                       
                        //根据样式描绘文字
                        if (edge) {this.drawText(msgpos_x, msgpos_y, messages, color, 255, true, 255, edgec, 1, 0, 0);}
                        else if (shad) {this.drawText(msgpos_x, msgpos_y, messages, color, 255, true, 255, shadc, 0, 2, 2);}
                        else {this.drawText(msgpos_x, msgpos_y, messages, color, 255, true);}

                        msgpos_y += lh + 3; // 调整行间距

                }
                          

               
    }

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

    /**
     * オープン直後によばれる
     */
    function onOpen() {
        setFocusToLink(1,true);
    }
   
    function processLink(num) {
        super.processLink(num);
        if (num == 0) {
            result = true;
            if (yesFunc !== void) {
                yesFunc(param);
            }
        } else {
            if (noFunc !== void) {
                noFunc(param);
            }
        }
        if (this isvalid) {
            if (doneFunc !== void) {
                doneFunc(param);
            }
            close();
        }
    }
}

KAGLoadScript("YesNoDialog.tjs");

var origAskYesNo = askYesNo;

var yesnoMap = %[
    //"是否回到开始?" => "dialog_title_base",
    //"是否退出?" => "dialog_exit_base"
   // "上書きしてよろしいですか?" => "dialog_overwrite_base",
    //"ロードしますか?" => "dialog_load_base",
    //"初期化" => "dialog_configini_base"
    ];

// Yes か No かはっきりさせる関数をのっとる
var askYesNo = function(message, caption = "確認", yesFunc, noFunc, param, doneFunc)
{
    if (kag.isMoviePlaying()) {

        var win;
        if (message.indexOf("まで戻りますか?") >= 0) {
            win = new MyYesNoDialogWindow("dialogprev");
        } else {
            var bgd = yesnoMap[message];
            //假如能够取得背景图,直接使用对应背景图+空白文字
            if (bgd !== void) {
                win = new MyYesNoDialogWindow(bgd,"");
            }
            //否则使用空白图+文字
            else {
                //win = new YesNoDialogWindow(message, caption);
                var ynset=Scripts.evalStorage("uiyesno.tjs");
                win = new MyYesNoDialogWindow(ynset.bgd.frame,message);
            }
        }

        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);
        }

    } else {

        if (message.indexOf("まで戻りますか?") >= 0) {
            var dialog = new MyYesNoDialogLayer("dialogprev", yesFunc, noFunc, param, doneFunc);
            dialog.open();
        } else {
            var bgd = yesnoMap[message];
            //假如能够取得对应信息的背景图,则直接显示背景图
            if (bgd !== void) {
                var dialog = new MyYesNoDialogLayer(bgd, yesFunc, noFunc, param, doneFunc,"");
                dialog.open();
            }
            //假如不能取得对应信息的背景图,则显示空白图+文字
            else {
               //origAskYesNo(message, caption, yesFunc, noFunc, param, doneFunc);
                var ynset=Scripts.evalStorage("uiyesno.tjs");
                    var dialog = new MyYesNoDialogLayer(ynset.bgd.frame, yesFunc, noFunc, param, doneFunc, message);
                    dialog.open();
               
            }
        }
    }
};
回复

使用道具 举报

16

主题

916

帖子

0

精华

管理员

Rank: 9Rank: 9Rank: 9

积分
937
发表于 2020-8-21 10:23:36 | 显示全部楼层
贴一下你的询问窗口设置图?
怀疑是按钮位置歪到窗口外面去了。又:
平时是能正常显示的?播放视频时是全屏还是窗口情况会出现此问题?切换全屏窗口是否有变化?
模板工程(在不做任何改动的情况下)播放视频是否有此问题?
启动时使用的是KRKRZ还是KRKR?

或者干脆把工程发我……
3.9不是对外公开版,那下的是源代码版?如果是源代码版告诉一下是对应的哪个版本(zip压缩包上的名字)。
回复

使用道具 举报

26

主题

47

帖子

0

精华

游戏开发者

积分
47
 楼主| 发表于 2020-8-21 14:56:07 | 显示全部楼层
VariableD 发表于 2020-8-21 10:23
贴一下你的询问窗口设置图?
怀疑是按钮位置歪到窗口外面去了。又:
平时是能正常显示的?播放视频时是全屏 ...


设置图如上

1.平时能正常显示,播放视频时不管是全屏还是窗口都无法正常显示。点击关闭,弹出确认框后无法切换全屏或窗口。
2.模板工程能正常显示
3.启动是是在脚本编辑里。打包出来后用krkr启动也是一样的问题。
4.版本是VariableD-the-nvl-maker-72e2338111f9
回复

使用道具 举报

16

主题

916

帖子

0

精华

管理员

Rank: 9Rank: 9Rank: 9

积分
937
发表于 2020-8-21 16:48:15 | 显示全部楼层
视频时弹出窗口不支持半透明,并且会把背景透明部分整个挖掉……你的按钮正好放在全透明部分。
所以你给底板上那俩按钮的位置加两个半透明黑块(透明度很低也行,只要不是全透明就行),就能显示出来了。= =
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|nvlmaker

GMT+8, 2023-10-3 11:14 , Processed in 0.017450 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表