找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 15|回复: 0

[求助] 如何获取一个viewport能否进行滚动

[复制链接]
发表于 昨天 23:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
本帖最后由 Aaron栩生阿龙 于 2026-5-24 23:40 编辑

最近在写代码的时候遇到一个问题,当我们写一个bar或者是vbar的时候,我们可以将它的 unscrollable 设置为'hide',这样当bar不能拖动(也就是对应的viewport内的组件小于viewport本身)的时候,bar会隐藏掉,但是实际上属于bar的那段空间依然会保留,只是不会绘制任何内容
那么这就引出一个问题:
如果我希望根据某个viewport能否滚动来应用不同的布局,应该怎么办呢?


---分界线---
下面写一下我的思考过程:
由于bar是知道viewport能否滚动的,所以我们来查看一下bar的代码:
在bar的render函数里有这一行:
[RenPy] 纯文本查看 复制代码
def render(self, width, height, st, at):
    # 一些代码
    range = self.adjustment.range # @ReservedAssignment
    # 一些代码
    if range <= 0:
        if self.style.unscrollable == "hide":
            self.hidden = True
            return renpy.display.render.Render(width, height)

也就是说,当他调整的这个adjustment对象的range<=0的时候,bar就会隐藏,那么这个adjustment对象是哪里来的呢?我们来看一下他的__init__函数:
[RenPy] 纯文本查看 复制代码
if adjustment is None:
    if isinstance(value, renpy.ui.BarValue):
        if isinstance(replaces, Bar):
            value.replaces(replaces.value)
        self.value = value
        adjustment = value.get_adjustment()


当bar的入参value是一个BarValue对象的时候就会获取这个BarValue的adjustment对象,对于viewport来说,我们使用的BarValue是XScrollValue和YScrollValue,我们以YScrollValue为例,来看看它的get_adjustment方法:
[RenPy] 纯文本查看 复制代码
def get_adjustment(self):
    w = renpy.get_widget(None, self.viewport)
    if not isinstance(w, Viewport):
        raise Exception("The displayable with id %r is not declared, or not a viewport." % self.viewport)
    return w.yadjustment

首先会获取入参(也就是这个self.viewport)的类型,如果是viewport就获取它的yadjustment对象,那么接下来就很简单了:
我们可以使用
[RenPy] 纯文本查看 复制代码
renpy.get_widget(None, viewport).yadjustment.range # 这里的入参viewport是viewport的id

来获取一个viewport是否能滚动:当range<=0的时候不能滚动,否则可以滚动
至此我们就大功告成了……吗?

---分割线---
这个方法有一个很大的问题,当我们点进这个界面的时候,它的值永远是大于0的,只有当界面更新的时候它才能显示实际的值,解决方法也很简单,将这个界面加入per_frame_screens里就好了,但是这无疑增加了性能消耗(虽然我个人是不太在意这些问题,一个视觉小说要多少性能呢?),另一个问题是这行代码不能写在viewport之前
所以:
有没有一种方法可以简单、快速、准确获取一个viewport能否进行滚动?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|RenPy中文空间 ( 苏ICP备17067825号 )

GMT+8, 2026-5-25 01:25 , Processed in 0.015319 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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