找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 200|回复: 2

[经验] “如何通过检测有无头像改变对话样式”的解决办法

[复制链接]
发表于 2024-9-10 20:42:26 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 烈林凤 于 2024-9-10 21:23 编辑

事先声明,本教程最终的解决方法是由@Aaron栩生阿龙 找到的,我只是以他的基础上写了篇更详细的教程,在此放上他发布的b站专栏链接:

阿龙和他的朋友们的renpy周报#1【renpy教程】 - 哔哩哔哩 (bilibili.com)

之后我也有可能(只是可能)会把自己的教程上传到b站上,各位敬请期待,在此附上我的主页链接:
烈林凤的个人空间-烈林凤个人主页-哔哩哔哩视频 (bilibili.com)


接下来进入正题——
关于检测有无头像的代码只有一小段
[RenPy] 纯文本查看 复制代码
if not isinstance(SideImage(), Null):


虽然这只是一段平平无奇的代码,却令我和龙叔两人反复思考了许久,才终于想出了这个方法(详情可见专栏)……
首先,isinstance()函数是python中的一个函数,该函数会用来判断一个对象是否是一个已知的类型,有点类似于type(),在此引用菜鸟教程中的原文:
描述
isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type()。

isinstance() 与 type() 区别:

type() 不会认为子类是一种父类类型,不考虑继承关系。

isinstance() 会认为子类是一种父类类型,考虑继承关系。

如果要判断两个类型是否相同推荐使用 isinstance()。

语法
以下是 isinstance() 方法的语法:

isinstance(object, classinfo)
参数
object -- 实例对象。
classinfo -- 可以是直接或间接类名、基本类型或者由它们组成的元组。
返回值
如果对象的类型与参数二的类型(classinfo)相同则返回 True,否则返回 False。

然后,SideImage()是renpy中原生的头像函数,会返回与当前角色对应的头像,默认为Null()【也就是空头像,但确实是存在的】
文档:界面行为(action)、值(value)和函数 — Ren'Py 中文文档 (renpy.cn)
也就意味着,一般情况下,SideImage()==Null(),但是!
经过我的测试,if SideImage()==Null():是无效的,无法通过这种判断,究其原因是因为,SideImage()并不是一个变量!【我当初明明离真相那么近,却犯了这个根本性的错误!】
既然SideImage()不是一个变量,自然不可能直接使用==进行判断,我们需要通过isinstance()来判断SideImage()是不是和Null()是同一个类型的组件。

最后,使用if not判断SideImage()是不是Null()同一类型,如果确定不是【也就是判断确定为角色头像】,则进行下一步。

至此,检测有无头像的代码讲解完成,这一代码可实际应用的地方非常广泛,最显而易见的地方就如标题所写。
[RenPy] 纯文本查看 复制代码
screen say(who, what):
    style_prefix "say"

    window:
        id "window"

        if who is not None:

            window:
                id "namebox"
                style "namebox"
                text who id "who"

        text what id "what"

        if not isinstance(SideImage(), Null):
            xoffset 200


在screen say中,在window写上这段,即可实现有角色头像显示时将对话和角色名向右偏移200像素

希望各位用得高兴
发表于 2024-9-10 20:50:32 | 显示全部楼层
烈烈~

点评

ᕕ(◠ڼ◠)ᕗ  发表于 2024-9-10 21:03
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-7 05:56 , Processed in 0.118924 second(s), 28 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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