找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 215|回复: 5

[教程] 支持链式if-elif-else的If行为

[复制链接]
发表于 2026-6-21 01:13:27 | 显示全部楼层 |阅读模式

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

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

×
我这个标题好像起的很烂……主要是不知道该怎么说,也不知道之前有没有人做过这个东西如果有人做过的话那就最好了,我们可以用别人的了


好了废话不多说,我们来看看实际内容吧
---
我们知道renpy有一个名叫If的action,它的作用是根据入参表达式的值选择不同的action,但是这个东西有一个缺点,那就是相当于只支持if/else语句块,如果我们想写if/elif……/else的话需要多层嵌套,虽然嵌套几层不是什么大问题,但是如果(我是说如果)要嵌套非常多层的话,那If就不太好用了
于是我们带来了一个新函数:IfElif(掌声)
[Python] 纯文本查看 复制代码
def IfElif(*args):
    default = None
    args = list(args)

    if len(args) % 2 == 1:
        last = args[-1]

        if isinstance(last, list):
            all_action = all(isinstance(item, Action) for item in last)
            if all_action:
                default = last
        elif isinstance(last, Action):
            default = last

        args = args[:-1]

    for i in range(0, len(args), 2):
        cond = args[i]
        value = args[i + 1]
        if cond:
            return value

    return default



这个函数的功能很简单,就是让renpy原本的函数可以增加很多表达式,根据表达式返回不同的action

函数解析如下:
函数的入参是*args,入参规则是condition1, action1, condition2, action2……简单来说就是第1、3、5位入参是表达式、第2、4、6位入参是表达式对应的action
当总入参数是奇数的时候,如果最后一个入参是action或者由action组成的列表,那么它会被当作“所有表达式都为False”时的默认值,如果他不是action,那么会被忽略

了解完功能之后就要来说缺点了:缺点就是没法延迟加载,所有的表达式都会被运行然后计算最终的值,这可能会产生一些副作用(比如某个函数的运行和整体的运行时间变长等)
我本来想做一些延迟加载的优化,比如说用lambda表达式或者eval,但是那样的话就会太麻烦了反而不好调用,而且也可能会产生一些其他问题
所以,暂时就这样吧,下课


发表于 2026-6-25 01:28:41 | 显示全部楼层
建议遵守规范继承Action类
回复 支持 抱歉

使用道具 举报

发表于 2026-6-25 12:48:02 | 显示全部楼层
同意沙发。

复杂逻辑判断优先使用 Function 行为,若需要自己命名则继承 Action
https://doc.renpy.cn/zh-CN/screen_actions.html#Function
回复 支持 抱歉

使用道具 举报

 楼主| 发表于 2026-6-27 12:01:13 | 显示全部楼层
ZYKsslm 发表于 2026-6-25 01:28
建议遵守规范继承Action类

好的我就猜到会有人提到这个问题,为什么我没有选择继承Action类呢,因为原版的If也没有继承action类,原版的if真的就只是一个if,所以在这里我还是选择了更renpy的写法(
回复 支持 抱歉

使用道具 举报

发表于 2026-6-29 15:51:40 | 显示全部楼层
Aaron栩生阿龙 发表于 2026-6-27 12:01
好的我就猜到会有人提到这个问题,为什么我没有选择继承Action类呢,因为原版的If也没有继承action类,原 ...

这样吗,那我还真没注意到
回复 支持 抱歉

使用道具 举报

发表于 2026-7-1 09:39:58 | 显示全部楼层
楼主关于“原版的If也没有继承action类”的说法,用个粗俗的类比是:“我看到有人在大街上拉屎,所以我也要在大街上拉屎。”

倒也不是能不能的问题,毕竟在哪拉不是拉(代码能跑就行),选择在哪拉基本是个人价值取向的差异。
仅就我的个人偏好,不到万不得已,不会在大街上拉屎,更不会号召其他人一起来拉。
回复 支持 抱歉

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-7-12 07:26 , Processed in 0.031012 second(s), 9 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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