找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 45784|回复: 10

[已解决] screen 上的角色坐标多次变化后,但角色只动一次的问题

[复制链接]
发表于 2021-4-9 22:15:43 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 武装朝圣者 于 2021-4-21 16:53 编辑

[RenPy] 纯文本查看 复制代码
screen showAll():

    #显示多个角色

    for i in allchars:

        if i.ALIVE==-1 or i.ALIVE==1:
#给别名
            $ name1= str(i.EIDD)

            add i.pic_sprite as name1 at move(i):

                #xanchor 0.5 yanchor 0.5

                xpos i.sprite_pos[0]

                ypos i.sprite_pos[1]



    #移动,移动在0.5秒完成,从老坐标ori_pos到新坐标sprite_pos
    transform move(i):       # Same as above, dictates where the bars appear per fighter.
        xpos i.ori_pos[0]
        ypos i.ori_pos[1]
        linear 0.5 xpos  (i.sprite_pos[0])
        linear 0.5 ypos  (i.sprite_pos[1])

label test:
    show screen showAll
    call test2


label test3:
    $ dui3.ori_pos[1]= dui3.sprite_pos[1]
    $ dui3.sprite_pos[1]=dui3.sprite_pos[1]+500

    pause 1.5



    return


label test2:
    #while True:
    $ dui2.ori_pos[1]= dui2.sprite_pos[1]
    $ dui2.sprite_pos[1]=dui2.sprite_pos[1]+100
    pause 1.5
    jump test3

    return


但事实上,角色只会移动test2的一次,我多次编辑尝试,角色都永远只会移动一次

发表于 2021-4-13 22:14:08 | 显示全部楼层
我大致明白你的意思了,应该是screen的问题,screen每次只执行一编,而不会根据变量的变化实时刷新,想要刷新其中的数据,就需要重新show screen。
想要满足你的实时执行,建议用python自己写一个对应的function,只要涉及到function中变量的变化,就会自动中断,进入function函数里执行一次循环,然后跳转会原来的位置。
回复 支持 1 抱歉 0

使用道具 举报

发表于 2021-4-10 12:34:13 | 显示全部楼层
transform在screen区块里?
回复 支持 抱歉

使用道具 举报

 楼主| 发表于 2021-4-10 14:39:10 来自手机 | 显示全部楼层
不是,transform在label里面
回复 支持 抱歉

使用道具 举报

发表于 2021-4-10 15:24:47 | 显示全部楼层
额,大概看下没下拉脚本,没看到label
你应该放到screen
label是一次性的,流程往下走,除非jump跳回来
而在screen里相当于是实时,不断被检查、刷新,
这就是为什么用于血量数值之类,只要你show出这screen。
这可能就是你的问题。
回复 支持 抱歉

使用道具 举报

 楼主| 发表于 2021-4-11 18:19:04 来自手机 | 显示全部楼层
不,事实上我show screen 之后,无论怎么变化坐标信息。screen中的atl变化都不再执行。我想求教一个可行的screen中的transform执行,可随着对象的坐标变化而变化
回复 支持 抱歉

使用道具 举报

发表于 2021-4-12 14:07:41 | 显示全部楼层
把“jump test3”改成“call test3”试试呢?
回复 支持 抱歉

使用道具 举报

 楼主| 发表于 2021-4-13 20:16:02 | 显示全部楼层
不行啊,我show screen 执行完,发生一次transform。然后我赋值对象的坐标后,不会再发生transform移动。但我再hide screen ,再show screen 就会发生我想要的transform。这说明show screen过程中的 add i.pic_sprite as name1 at move(i) 的transform不会实时执行。
回复 支持 抱歉

使用道具 举报

 楼主| 发表于 2021-4-14 09:03:55 | 显示全部楼层
Zealot001 发表于 2021-4-13 22:14
我大致明白你的意思了,应该是screen的问题,screen每次只执行一编,而不会根据变量的变化实时刷新,想要刷 ...

是的。简单的text数值变化,screen是能实时变化,怎么transform就不支持。既然不能这样省力地呈现变化,我只能肢解原先的screen设计,改用其他办法实现,每次要实现transform,就show screen。频繁地show screen 操作。
回复 支持 抱歉

使用道具 举报

发表于 2021-4-14 15:16:46 | 显示全部楼层
本帖最后由 被诅咒的章鱼 于 2021-4-14 16:52 编辑

ATL需要事件(event)驱动。如果只修改自定义的某个变量,transform并不会去检测对应的变量是否发生了变化。call screen和show screen会给界面内所有组件的transform广播start事件,可以让transform执行至少一次。

一种解决方案是,将修改的变量作为入参,传给自定义的screen。每次用show screen(**kwargs)。这样做的好处是,防止引用的变量影响其他地方,即低耦合。
[RenPy] 纯文本查看 复制代码
screen showAll(i=Null, des_pos=(0, 0)):

    for i in allchars:
        if i.ALIVE==-1 or i.ALIVE==1:
            $ name1= str(i.EIDD)
            add i.pic_sprite as name1 at move(des_pos)

    transform move(des_pos):
        linear 0.5 pos des_pos

label test:
    show screen showAll()
    call test2


label test2:
    $ dui2.ori_pos[1]= dui2.sprite_pos[1]
    $ dui2.sprite_pos[1]=dui2.sprite_pos[1]+100
    show screen(dui2, des_pos=sprite_pos)
    pause 1.5
    jump test3
    return

label test3:
    $ dui3.ori_pos[1]= dui3.sprite_pos[1]
    $ dui3.sprite_pos[1]=dui3.sprite_pos[1]+500
    show screen(dui3, des_pos=dui3.sprite_pos)
    pause 1.5
    return


以上代码没有经过测试,不一定能运行……
回复 支持 抱歉

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-8 12:49 , Processed in 0.059651 second(s), 13 queries , File On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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