THE NVL Maker

 找回密码
 注册
搜索
查看: 4600|回复: 10

[系统修改] 请问自定滚动条如何刷新画面?

[复制链接]

11

主题

33

帖子

0

精华

游戏开发者

积分
33
发表于 2022-2-12 15:06:56 | 显示全部楼层 |阅读模式
本帖最后由 paluouting 于 2022-2-12 15:11 编辑

D大您好!
想做一个存读档界面的滚动条翻页功能,就像历史记录那样,使用了nvl的 @myslider 指令。拖动滚动按钮后,页数变量的数值确实改变了,但画面无法即时刷新。
虽然在mychangefunc添加了跳转到刷新画面标签的函数,可也只能在点击滚动按钮上方或下方的时候翻页,拖动滚轮时还是无法正常刷新画面(除非我用飞一般的速度去拖动它,不过也只能拖一次刷新一次),这样就和普通的翻页按钮没太大区别了……
请问该如何令滚动条在滚动的同时即时刷新画面内容呢?
回复

使用道具 举报

16

主题

1008

帖子

0

精华

管理员

Rank: 9Rank: 9Rank: 9

积分
1029
发表于 2022-2-12 20:09:27 | 显示全部楼层
是不是需要修改系统让拖动时候也能执行函数。
可以参考这个:
https://hydrozoa.felisworks.com/ ... 058ec36545cded3b1b1
还有比较大的改造方法其实应该是把所有页的按钮都绘制到一个层上去,
然后拖动=这个层移动……但那样描绘的时候可能会很慢?

回复

使用道具 举报

11

主题

33

帖子

0

精华

游戏开发者

积分
33
 楼主| 发表于 2022-2-13 17:50:16 | 显示全部楼层
VariableD 发表于 2022-2-12 20:09
是不是需要修改系统让拖动时候也能执行函数。
可以参考这个:
https://hydrozoa.felisworks.com/ ... 058ec ...

水螅大大博客的那个我先前也看过,但是tjs相关太弱了只知道很少的几个指令,没太理解具体怎么做……
请问那个“在类上随便新加一个属性比如change1”是什么意思?在addSlider(elm)里要搞一个var change1=xxx之类的东西吗?
回复

使用道具 举报

16

主题

1008

帖子

0

精华

管理员

Rank: 9Rank: 9Rank: 9

积分
1029
发表于 2022-2-13 20:25:31 | 显示全部楼层
是追加参数没错,但不是在addSlider(elm)里面,是得先在slider的这个LinkSliderLayer的class定义里面追加一个var。
但NVL默认好像已经加上了,那个mychangefunc就是。

然后我看了一眼终于想起来了,【滚轮】支持是单独要魔改的,所有需要滚轮的界面都得单独写个滚轮事件注册一下。
就MainWindow里面有一个function onMouseWheel(shift, delta, x, y)
一般会在那里面加。

NVL编辑器源代码里有这个。
function page_up(scale)
function page_down(scale)


是所有界面通用的函数,在里面分歧判断是哪个界面的滚轮操作。

然后function onMouseWheel(shift, delta, x, y)里面是这样:

        function onMouseWheel(shift, delta, x, y)
        {
                // ホイールが回転した
                super.onMouseWheel(...);
        if (currentDialog !== void) {
            return;
        }
        if (inStable)
        {
            if (delta>0) page_up(delta/30);//魔改的部分
            if (delta<0) page_down(delta/30);//魔改的部分
        }

        }


回复

使用道具 举报

11

主题

33

帖子

0

精华

游戏开发者

积分
33
 楼主| 发表于 2022-2-14 23:31:52 | 显示全部楼层
VariableD 发表于 2022-2-13 20:25
是追加参数没错,但不是在addSlider(elm)里面,是得先在slider的这个LinkSliderLayer的class定义里面追加一 ...

麻烦D大了!我试着按照这个改了一下,不过还是没有变化的样子……请问是不是在存储界面添加的自定myslider指令里也要加个新参数……?mychangefunc调用的函数内容也需要更改吗?
回复

使用道具 举报

16

主题

1008

帖子

0

精华

管理员

Rank: 9Rank: 9Rank: 9

积分
1029
发表于 2022-2-16 15:00:23 | 显示全部楼层
呃,没听懂。
(1)你要自己定义pageup和down函数,里面只写一个dm,用来判断滚轮能不能生效
(2)在mainwindow的onMouseWheel里面加上pageup和down函数的调用
(3)这两样都做好以后你使用滚轮应该会在除错窗口里看到dm的信息
(4)确认pageup和pagedown和滚轮挂钩以后,再把里面的内容改成刷新存档画面之类就好
回复

使用道具 举报

11

主题

33

帖子

0

精华

游戏开发者

积分
33
 楼主| 发表于 2022-3-2 14:11:39 | 显示全部楼层
本帖最后由 paluouting 于 2022-3-2 14:12 编辑
VariableD 发表于 2022-2-16 15:00
呃,没听懂。
(1)你要自己定义pageup和down函数,里面只写一个dm,用来判断滚轮能不能生效
(2)在mainwi ...

D大您好!很抱歉这些天才有空继续处理这个问题,所以回复晚了……
我在pageup和down函数里写下
  1. dm('翻页');
复制代码
并在onMouseWheel里调用pageup/down函数了,可是在使用滚轮时,除错窗口却看不到相关的dm内容。然后又试了一下直接在onMouseWheel里写了个dm,也是什么都没显示。
以防万一我把相同的dm信息放进其他有被调用到的函数里试了试,执行时是可以在除错窗口看到内容的,所以应该不会是简简单单一个dm写错了……
会不会这个slider在拖动时并没有用到onMouseWheel函数?以及我用的nvl是3.85版本的
回复

使用道具 举报

16

主题

1008

帖子

0

精华

管理员

Rank: 9Rank: 9Rank: 9

积分
1029
发表于 2022-3-2 18:44:05 | 显示全部楼层
首先slider拖动的时候并不会调用到onMouseWheel啊,是onMouseWheel调用slider的功能来让slider移动。
其次这个和NVL版本没有关系,应该是任何kr版本都有的(只要历史记录支持滚轮就肯定有),onMouseWheel函数在Mainwindow.tjs里面。
我测了一下直接加dm("测试"); 到如下的地方,滚动滚轮时是可以看到测试字样的。
所以请检查一下是不是加对了地方?

        function onMouseWheel(shift, delta, x, y)
        {
                // ホイールが回転した
                super.onMouseWheel(...);
        if (currentDialog !== void) {
            return;
        }
        // メッセージ窓のホイール処理
        if (inSleep && current.hasWheel()) {
            current.processWheel(shift, delta, x, y);
            return;
        }
        if(!historyLayer.visible)
                {
                        if(delta > 0)
                                showHistoryByKey(); // メッセージ履歴を表示
                        else if(System.getTickCount() - lastHistoryHiddenTick > 150)
                                        onPrimaryClick(); // クリックをエミュレート
                        // ↑ tick を比較しているのは、メッセージ履歴を隠す操作とホイールを
                        // 手前に回す操作が連続した場合に勝手に読み進むのをある程度防ぐ仕掛け
                }
                else
                {
                        // メッセージ履歴にイベントを垂れ流す
                        historyLayer.windowMouseWheel(shift, delta, x, y);
                }
               
                dm("测试");
        }
回复

使用道具 举报

11

主题

33

帖子

0

精华

游戏开发者

积分
33
 楼主| 发表于 2022-3-22 14:45:05 | 显示全部楼层
VariableD 发表于 2022-3-2 18:44
首先slider拖动的时候并不会调用到onMouseWheel啊,是onMouseWheel调用slider的功能来让slider移动。
其次 ...

D大您好,我直接按照这一段代码的dm位置原样添加进了原函数,但还是无法在除错台中看见相关信息,不知道是不是因为我这边别的地方做了什么修改所以才会出现这种状况……
不过最近大致上了解了无法正常刷新画面的主要原因!大概是因为刷新画面时需要先[er]清除按钮层,然后重新绘制一次按钮。清除按钮层的时候同层的滚轮也会被一起清除,那一瞬间滚轮是没有办法被鼠标点住的,所以会出现滚轮无法正常拖动的情况。
如果去掉[er]这一指令,就可以顺畅地使用滚轮并看到即时刷新后的界面了,但这样将无法清除旧的按钮层状态,每一页刷新的滚轮状态都会被保留在界面上,像影分身术一样……

请问有没有不会影响到滚轮拖动、但同时也可以正常清除旧按钮层状态的刷新办法呢?
实在是麻烦D大了,感觉我这个问题折腾了挺久,非常不好意思……

点评

如果是这样可能就得把所有的按钮都画到一个消息层上,然后滚轮只是移动消息层的位置。  发表于 2022-3-22 19:46
回复

使用道具 举报

11

主题

33

帖子

0

精华

游戏开发者

积分
33
 楼主| 发表于 2022-3-25 11:41:29 | 显示全部楼层
paluouting 发表于 2022-3-22 14:45
D大您好,我直接按照这一段代码的dm位置原样添加进了原函数,但还是无法在除错台中看见相关信息,不知道 ...

了解了,非常感谢D大!因为没办法点评自己所以我就直接回复了……
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|nvlmaker

GMT+8, 2024-6-20 11:12 , Processed in 0.010271 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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