RenPy中文空间

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5651|回复: 5

[已解决] 随机语句,如何转跳后不刷新?

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

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

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

x
本帖最后由 怀念丶落樱 于 2021-7-6 21:51 编辑

随机语句,如何转跳后不刷新?我添加了一个Jump出去,Jump回来后发现这个界面刷新了。
如何使Jump不触发刷新,点击刷新按钮才刷新?
[RenPy] 纯文本查看 复制代码
screen aaa(x,y):
 
    default a1_name = renpy.random.choice(['周一', '王二', '张三', '李四', '刘五', '赵六', '田七'])
    default a1_Star = renpy.random.randint(1, 3)
    if a1_Star == 1:
        default a1_grade = renpy.random.randint(1, 3)
        default a1_charm = renpy.random.randint(10, 30)
        default a1_gold = renpy.random.randint(10, 100)
    if a1_Star == 2:
        default a1_grade = renpy.random.randint(4, 6)
        default a1_charm = renpy.random.randint(40, 60)
        default a1_gold = renpy.random.randint(200, 600)
    if a1_Star == 3:
        default a1_grade = renpy.random.randint(7, 10)
        default a1_charm = renpy.random.randint(70, 100)
        default a1_gold = renpy.random.randint(800, 1000)
 
    frame:
        pos (x,y)
        vbox:
            spacing 5
            text "人物卡"
            text "姓名:[a1_name]"
            text "品阶:[a1_Star]"
            textbutton "查看详细属性" action ShowTransient("bbb",transition=dissolve,name=a1_name,aa=a1_grade ,bb=a1_charm ,cc=a1_gold)
    #transclude
 
screen bbb(name,aa,bb,cc):
    tag m123
    frame:
        align (0.2,0.2) 
        vbox:
            spacing 10
            text "[name]:各项属性值"
            text "级别:[aa]"
            text "魅力:[bb]"
            text "金币:[cc]"
            textbutton "关闭" action Hide("bbb")
    #transclude
 
screen ccc():
    #tag m123
    on "show" action Notify("已刷新人物卡")
    vbox:
        xpos 0.6
        spacing 5
        use aaa(0.8, 0.1)
        use aaa(0.8, 0.5)
        use aaa(0.8, 0.9)
 
    textbutton "生成新人物卡":
        pos (0.5, 0.8)
        action Hide("ccc"),Show("ccc")
    textbutton "转跳":
        pos (0.5, 0.6)
        action Jump("c10")
 
    textbutton "退出":
        pos (0.9, 0.1)
        action Hide("ccc"),Jump("fff")
 
# 游戏在此开始。
label start:
 
    "演示开始"
 
    call screen ccc with dissolve
 
label fff:
    "演示结束"
 
    # 此处为游戏结尾。
    return

label c10:
    jump start


 楼主| 发表于 2021-7-5 23:21:38 | 显示全部楼层
第二个问题,这串代码如何使它刷新随机?这串代码,点击jump后,如何才能刷新?为什么不刷新?
[RenPy] 纯文本查看 复制代码
define a = renpy.random.choice(["漂亮","美丽"])



label start:
    "回到了start"
    call screen c10
    screen c10:

        fixed:
            vbox:
                text "{color=0020FF}自身 [a]{/size}"
            textbutton "返回":
                xcenter 0.27
                ycenter 0.97
                xsize 400
                ysize 100
                action Jump ("c8")
label c8:
    jump start

return
回复 支持 反对

使用道具 举报

发表于 2021-7-6 09:11:17 | 显示全部楼层
本帖最后由 被诅咒的章鱼 于 2021-7-6 09:14 编辑

最简单的解决方案,把随机结果暂存,非主动刷新时直接使用暂存的结果。


[RenPy] 纯文本查看 复制代码
init python:
    nameList = ['周一', '王二', '张三', '李四', '刘五', '赵六', '田七']
    tempName = ''
    tempStar = 0
    
    def getRandomName():
        global tempName
        if(tempName == ''):
            tempName = renpy.random.choice(nameList)
        return tempName;
        
    def getRandomStar():
        global tempStar
        if(tempStar == 0):
            tempStar = renpy.random.randint(1, 3)
        return tempStar
            
    def refreshNameStar():
        global tempName, tempStar
        tempName = renpy.random.choice(nameList)
        tempStar = renpy.random.randint(1, 3)


screen aaa(x,y):

    #default a1_name = renpy.random.choice(['周一', '王二', '张三', '李四', '刘五', '赵六', '田七'])

    #default a1_Star = renpy.random.randint(1, 3)
    
    $ a1_name = getRandomName()
    $ a1_Star = getRandomStar()

    if a1_Star == 1:
        default a1_grade = renpy.random.randint(1, 3)
        default a1_charm = renpy.random.randint(10, 30)
        default a1_gold = renpy.random.randint(10, 100)
    if a1_Star == 2:
        default a1_grade = renpy.random.randint(4, 6)
        default a1_charm = renpy.random.randint(40, 60)
        default a1_gold = renpy.random.randint(200, 600)
    if a1_Star == 3:
        default a1_grade = renpy.random.randint(7, 10)
        default a1_charm = renpy.random.randint(70, 100)
        default a1_gold = renpy.random.randint(800, 1000)
  
    frame:
        pos (x,y)
        vbox:
            spacing 5
            text "人物卡"
            text "姓名:[a1_name]"
            text "品阶:[a1_Star]"
            textbutton "查看详细属性" action ShowTransient("bbb",transition=dissolve,name=a1_name,aa=a1_grade ,bb=a1_charm ,cc=a1_gold)
    #transclude


回复 支持 反对

使用道具 举报

发表于 2021-7-6 09:17:46 | 显示全部楼层
怀念丶落樱 发表于 2021-7-5 23:21
第二个问题,这串代码如何使它刷新随机?这串代码,点击jump后,如何才能刷新?为什么不刷新?[mw_shl_code ...

变量a的值在程序初始化阶段就确定了,后续不会发生变化,除非主动修改a的值。
另外,define语句定义的变量好像是不会在持久化数据时保存,请根据实际需求考虑是否改成default。
回复 支持 反对

使用道具 举报

发表于 2021-7-6 09:35:51 | 显示全部楼层
首先第一个问题
不知道你为什么要把default放在screen里面,文档里有一句话:
界面的改变不应该引发界面之外可视区域的副作用。 Ren’Py会根据需要多次运行同一个界面。Ren’Py会在界面显示之前运行一些运行图像预加载进程。因此,如果界面有副作用,在预加载阶段就会发生。

对新手而言,最好避免把设计运算的部分放进screen里面,因为screen运行界面可能会多次运行,如果有运算,那么运算将会不断计算(预加载之前也让我困惑了好久)
你每次执行
use aaa
这条语句,都会重新运行若干次计算
解决方法也很简单,把需要运算的部分放进label里面,比较好的是写一个简单的函数或者类,把功能封装进去,不行的话,把运算部分放进label里面
另外,全局变量最好在文件开头声明,之后找的时候好找,你放在标签里,游戏构造简单还好说,当你出现大量声明,大量标签的时候,很容易把自己搞晕

第二个问题
因为你定义a之后,没有执行语句,所以声明之后,a是什么,后面就会显示什么
加一句$ a = renpy.random.choice(["漂亮","美丽"])在label start后面就行了。

回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-6 21:40:32 | 显示全部楼层
懂了,谢谢两位大佬。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2022-10-3 01:03 , Processed in 0.026519 second(s), 11 queries , File On.

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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