找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1885|回复: 4

[求助] 如何写函数并在label中调用

[复制链接]
发表于 2022-3-26 17:49:21 | 显示全部楼层 |阅读模式

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

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

×
[RenPy] 纯文本查看 复制代码
label check(love_points,stress,marks):
    if stress<=0:
        $stress=0
    elif stress>=100:
        $stress=100
    if love_points<=0:
        $love_points=0
    elif love_points>=100:
        $love_points=100
    if marks<=0:
        $marks=0
    elif marks>=100:
        $marks=100

这个是想要用的函数,使变量不低于0或高于100
[RenPy] 纯文本查看 复制代码
label study_room:
    "你学习了"
    $marks+=10
    $stress+=10
    call check(love_points,stress,marks)
    "学习成绩+10,压力+10"
    jump timechange

调用函数的示例
现在的问题是,如果在语句里call的话不会进行下一个语句而是会回到上一句的操作,形成无限循环,如果加上return的话函数不会起作用,用jump并传参会报错,不传参会报错显示有参数未定义


发表于 2022-3-26 18:21:46 | 显示全部楼层
这个check里面根本就没有任何的脚本演出什么的,为什么要写成label而不是function
回复 支持 抱歉

使用道具 举报

 楼主| 发表于 2022-3-27 09:56:07 | 显示全部楼层
那function怎么用啊?我不知道有这个东西
回复 支持 抱歉

使用道具 举报

发表于 2022-3-27 14:17:55 | 显示全部楼层
那就去好好学python和程序设计,这都是基础中的基础

既然数据有约束,那可以抽象加法函数出来,比如下面的例子:
[RenPy] 纯文本查看 复制代码
init python:
    def get_value_add(value_old, add_value, min_value=0, max_value=100):
        value = value_old + add_value
        if value <= min_value:
            return min_value
        elif value >= max_value:
            return max_value
        return value

label start:

    $ value = 0
    'value: [value]'

    $ value = get_value_add(value, 50)
    'value: [value]'

    $ value = get_value_add(value, 70)
    'value: [value]'

    $ value = get_value_add(value, -10)
    'value: [value]'

    $ value = get_value_add(value, -1000)
    'value: [value]'


当然将数值抽象为类还有其它的写法,比如:
[RenPy] 纯文本查看 复制代码
init python:
    class MyValue:
        def __init__(self, init_value, min_value=0, max_value=100):
            self.value = 0
            self.min_value = min_value
            self.max_value = max_value
            self.add(init_value)

        def add(self, add_value):
            value = self.value + add_value
            if value <= self.min_value:
                self.value = self.min_value
            elif value >= self.max_value:
                self.value = self.max_value
            else:
                self.value = value

            return

label start:

    $ marks = MyValue(0)
    'value: [marks.value]'

    $ marks.add(50)
    'value: [marks.value]'

    $ marks.add(70)
    'value: [marks.value]'

    $ marks.add(-10)
    'value: [marks.value]'

    $ marks.add(-1000)
    'value: [marks.value]'


至于再优化写法就看你自己了
回复 支持 抱歉

使用道具 举报

发表于 2022-3-27 20:43:17 | 显示全部楼层
呃……其实楼主在一个label里做数值运算的方法也可以,毕竟语法上允许不会报错。

return肯定是要的,执行完check不返回的话,主控流程就会继续执行check标签后的遇到的下一个合法标签。

执行之后数值没变的原因,估计是“变量作用域”和“值与引用的区别”两个问题:
check没有返回值,并且因为love_points、stress、marks这三个入参是数值而不是引用,在参与各种运算后自身是不会(也不应该)发生变化的。所以label执行完之后看上去没有任何效果。

解决方案有很多种,比如最简单粗暴的方式,把love_points、stress、marks设置为全局变量,check连入参列表都不用写,开头用 global 声明那3个全局变量就行。
比较稳妥的做法是把各种数值装进一个类中(看楼主的意思,应该是用作某个角色的3个属性),类内部成员函数实现各种数值运算。check入参改为类,这样传入参数是引用,内部的各种数值改变都会生效。
回复 支持 抱歉

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 21:50 , Processed in 0.118874 second(s), 24 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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