马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
本帖最后由 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能否进行滚动?
|