
这个专栏会定期(应该)总结一下群里讨论的成果和未解决的问题
话不多说我们来看一下这周我们都干了些什么
乍一看这个问题其实有点奇怪,因为是否显示了小头像最简单的方法就是打开游戏看一眼,但是这里说的显然是如何用代码判断是否显示了小头像。
废话下面再说,先看代码:
if not isinstance(SideImage(), Null):
add SideImage():
align (0.0, 1.0) SideImage()函数会返回一个可视组件_side_image,它的默认值是config.side_image_null,是Null的实例,也就是说,如果没有小头像,这个函数会返回一个看不见的可视组件(不可视组件),如果有小头像则返回对应的头像。
所以我们可以利用这一点,用python内置的isinstance()函数来判断它的返回值是否是Null类(或者是它的子类)的实例。 isinstance() 函数接受两个参数:第一个参数是你要检查的对象,第二个参数是一个类或者包含多个类的元组。
20251129更新:在renpy8.4版本中更新了一个内置函数:
The new HasSideImage() function returns the presence or absence of a side image before the side image itself is determined, making it useable in the say screen for layout.

英文文档
也就是说如果此时有头像可以显示的话,这个函数会返回True,否则返回False,也就是说8.4.0之后可以直接这么写了:
if HasSideImage():
add SideImage():
align (0.0, 1.0) 那么这个东西有什么用呢?比如说:你可以在头像周围放上一个头像框,或者是根据角色有没有显示头像来控制对话的位置(毕竟头像默认情况下要占据对话框左边的空间使得对话文本不能顶格显示)。
在这里也浅浅分享一下讨论过程:这个问题其实很久很久以前就有同学提出来过,直到今年八月初,“椒糖”同学再次提问“如何侦测有无头像”以此来实现对话文本的缩放效果,我当时回复了一下但是说错了(主要是记错了),然后我们的烈烈(爆肝の烈林凤)提出可以使用回调函数但是并没有给出写法,后来他自己也做了一些尝试但是以失败告终,这件事就这么放着了。
直到这周一我再次提出疑问“怎么判断当前说话的这个角色有没有头像”,烈烈问我这件事为什么还没解决(那确实没解决嘛我有什么办法),然后我就开始着手解决这个问题了。首先我想到的是通过获取当前发言角色有没有设置image标签来判断有没有显示头像,但是这会引发一个问题——并不是所有有image标签的角色的发言都带有头像,这会导致在没有显示头像的时候对话框显示错误,但是我们抛开这个问题不谈,接着往下走。
下一步就是如何判断这个发言角色有没有image标签——我不会(前面的区域,以后再来探索吧),但是我想到了另一个解法,HistoryEntry对象的字段里有一个image_tag,它是用于Character()的图像标签,默认值是None,所以我们可以通过_history_list[-1].image_tag来访问这个标签(详情见中文文档-对话历史这一章节),但是呢——还会有一个问题,并不是每一个对话都会被“立即”添加进对话历史里,对于不会调用say函数的语句,他会在下一句出现的时候被加入对话历史中,所以大多数情况下这个标签表示的都是上一句话的image_tag,更严重的是,如果开头第一句话没有调用say函数,那么这种写法会直接报错IndexError: list index out of range,因为此时_history_list中没有任何元素,因此这个方法失败。
后来我又尝试了直接判断SideImage()这个函数的返回值,其实此时此刻距离完成已经很近了,但是我的方法错了,我是判断它为不为None,此时烈烈说他的默认值是Null(),但是某人(不是我)并没有注意到这句话,在后面还尝试了其他方式(比如使用_last_say_what之类的什么东西),直到我去翻SideImage()的源码才发现可以用isinstance方法……
让我们在这里感谢烈烈,当然也感谢我自己。总之事情解决了就好。
由于这个专栏是这两天才想出来的,所以并没有收录太多东西(其实是我懒得翻记录)绝对不是因为我懒得翻记录奥,所以我们就在这里说些有的没的小东西吧。
(renpy规则怪谈)
1、官方文档是很好用的东西,没事的时候多看看官方文档。
2、编辑器请使用带有renpy language拓展的vs code。
3、交流群里的人们都很友好,有什么问题都可以在交流群里问。
就这样吧,不过有一点要说的是我们还是会选择一些问题来做视频,那些比较少见或者少用的东西也正好可以放在这里。