找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 397|回复: 2

[经验] 她的心里话!隐藏文本!

[复制链接]
发表于 2025-7-8 22:46:05 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 Maz马 于 2025-8-10 02:19 编辑

一如既往叠甲
首先,我的编程基础为0.1(嗯,也玩了不少时间了),以下为纯摸索经验,如果有不对的地方望轻喷
基于个人需求写的东西
拉都拉了,就把这盘九转大肠捧出来给大家品鉴一下

(25.8.10有更新的方案,下滑查阅)

事情的起因是这样的,我一直很喜欢在各种软件,广告,小程序里剽窃有意思的功能
最近玩了一下AI聊天软件,其中有一个“窥探心事”功能
大概就是,正常玩,就是和ai聊天,“窥探心事”则会触发AI深度思考并且给你“表面”之下的心里话
这个功能非常的有意思,所以我决定实现一下

思路是在对话框上面加一个按钮,点击这个按钮则会对当前对话进行变更

比如:

我好 爱 你啊” 变成 “我好 恨 你啊”(直接变更文本)
我好爱你啊” 加一行变成 “我好爱你啊\n我磨好刀了桀桀桀桀桀”(在原有文本下增加一行文字)
注意,为什么这个功能有意思呢?
因为他是不影响你剧本的,只要你不点这个按钮,你就看不到,而且

它是在原对白上进行变更!不是分支!是确确实实的隐藏文本!

这个功能用到renpy一个十分冷门的东西
RestartStatement()文档链接:界面行为(action)、值(value)和函数 — Ren'Py 中文文档

这个行为,背后的逻辑实际涉及到“文本是否被阅读过的功能”。
文本如果已经被阅读过,那么对应的is_seen就会变成True,statement则是记录了文本信息
因此,即便你变更了某项数值,他也不会显现在当前的对白上

实现:有原生的方法,所以代码实际非常非常的短
[RenPy] 纯文本查看 复制代码
#首先定义持久化变量,必须要是持久化的
default persistent.test = 0.0

#创建界面和按钮
screen abc():
    #按钮执行赋值persistent.test为0.5,也就是从透明变成半透明,然后执行RestartStatement(),回滚到当前语句
    textbutton "test" action SetVariable("persistent.test",0.5),RestartStatement()

label start:
    show bg
    #显示这个窗口
    show screen abc
    #为你要隐藏的内容打上texttag,并且插值,现在,只要你点击这个按钮,隐藏内容就会出现
    "龙叔不爱KFC\n{alpha=[persistent.test]}才怪{/alpha}"
    #如果你要重复使用这个值,那么重置它,因为它是持久化的
    $ persistent.test = 0.0
    return

好的,现在我们有了一条被隐藏的对白,接下来我们进行拓展,给他加上动画
这里我使用的是Function(),将我们的刚才的screen abc迁移到原生的screen say
[RenPy] 纯文本查看 复制代码
#这里是把按钮移到了screen say里,我们想要动画,需要让这个持久化的变量持续变动
init python:

    #定义增值函数
    def change_alpha():
        persistent.test += 0.05
        renpy.run(RestartStatement())
    # 将关键回滚行为封装进增值函数,因为动画实际上是由多次回滚组成的

    #定义自动函数
    def auto_increase():
        if persistent.test >= 0.5:
            return
        change_alpha()
        return
    #将自增函数拆分成两部分,是因为我们需要一个启动器,和一个过程器
            

screen say(who, what):
    style_prefix "say"

    textbutton "test" action Function(change_alpha)#在按钮处调用启动器
    window:
        id "window"

        if who is not None:

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

        text what id "what"
    
    if persistent.test > 0.04 and persistent.test < 0.5:#当条件满足时,自动执行过程器
        timer 0.05 action Function(auto_increase) repeat True
        
    #最初的想法是仅用自增函数完成,但是由于这是*多个*交互行为,
    #而RestartStatement()这个行为本身会结束交互,因此使用了timer来进行自动化


拓展,这里只是使用了function(),实际上也可以做成text_tag,也可以对任何接受插值的文本标签操作
(例如kinetic_text_tags),甚至你可以做出拖动某个字加入到对白中的效果,本质是一个按钮与原生的screen say联动的接口

25.8.10更新:
主要其实是备份一下代码和思路(
旧的例子中,需要为每一句对白都设置持久化变量,这既不利于逻辑的判断,也不利于管理
@Koji 的帮助下,实现了用对白哈希值来动态的、批量的使用隐藏文本

[RenPy] 纯文本查看 复制代码
default persistent.alpha_dict = {}#一个动态字典
default trans_id = None#新的哈希值
default last_id = None#旧的哈希值
#设置新旧是因为renpy会预加载下一句对白,因此用新旧来锁定应该变更的对白,
#对于这个问题,我并不肯定是不是预加载的原因,总之,能跑就行

init python:
#这一部分是alpha增加的动效
    def change_alpha(trans_id):
        persistent.alpha_dict[trans_id] += 0.05
        if persistent.alpha_dict[trans_id] >= 0.5:
            persistent.alpha_dict[trans_id] = 0.5
        renpy.run(RestartStatement())

    def auto_increase(trans_id):
        if persistent.alpha_dict[trans_id] >= 0.5:
            return
        change_alpha(trans_id)
        return
#这里是把字典中缓存的值恢复成0.0
    def reset_alpha_dict():
        for key in persistent.alpha_dict:
            persistent.alpha_dict[key] = 0.0
#原生对话窗口
screen say(who, what):
#通过检测文本标签来判断这句对白是否含有隐藏文本
#{#ss}用调试文本标签来特定{alpha标签,避免正常的{alpha被检测
    $ has_alpha_tag = "{#ss}{alpha=" in what

#如果检测到了隐藏文本
    if has_alpha_tag:
        python:
            # 获取当前对话的哈希值(关于多语言的函数真是妙用无穷...)
            get_trans_id = renpy.get_translation_identifier()
            # 初始化透明度为0.0,并存储在动态字典里
            if get_trans_id not in persistent.alpha_dict:
                persistent.alpha_dict[get_trans_id] = 0.0
            #锁定对白,避免预加载的干扰,并把值拷贝到全局
            if trans_id != get_trans_id:
                renpy.run((SetVariable("last_id",trans_id),SetVariable("trans_id",get_trans_id)))

        vbox:
            # 按钮触发透明度变化
            if persistent.alpha_dict[last_id] < 0.5:
                textbutton "显示隐藏内容" action Function(change_alpha,last_id)
    
            textbutton "清理缓存" action[Function(reset_alpha_dict), SetDict(persistent.alpha_dict,last_id,0.0), RestartStatement()]

        # 自动动画
        if persistent.alpha_dict[last_id] > 0.04 and persistent.alpha_dict[last_id] < 0.5:
            timer 0.05 action Function(auto_increase,last_id) repeat True
#原生的screen say内容
    style_prefix "say"
    window:
        id "window"
        if who is not None:
            window:
                id "namebox"
                style "namebox"
                text who id "who"
        text what id "what"
    

label start:
    show bg
    # 测试不同句子的透明度控制,也是使用的方法,直接使用{#ss}{alpha=[persistent.alpha_dict[trans_id]]}XXXX{/alpha}包裹隐藏文本就可以了
    "这句话的隐藏内容会独立控制。\n{#ss}{alpha=[persistent.alpha_dict[trans_id]]}这是隐藏内容{/alpha}"
    "测试"
    "这是第二句话,透明度也是独立的。\n{#ss}{alpha=[persistent.alpha_dict[trans_id]]}另一段隐藏内容{/alpha}"










发表于 2025-7-9 09:16:02 | 显示全部楼层
赞美大佬
回复

使用道具 举报

发表于 2025-7-9 19:59:54 | 显示全部楼层
好适合白切黑病娇哦
回复 支持 抱歉

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-24 14:29 , Processed in 0.049290 second(s), 24 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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