找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 15462|回复: 5

[已解决] 怎样为同一行内的不同文字设置不同的outlines?

[复制链接]
发表于 2021-6-13 23:41:44 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 忘忧北萱草 于 2021-6-14 21:57 编辑

通用文本标签里只有outlinecolor,不能改变粗细;样式文本标签不能继承outlines属性。
 楼主| 发表于 2021-6-15 07:55:06 | 显示全部楼层
[RenPy] 纯文本查看 复制代码
style border_ is text:
    color "#fff"
    outlines [(5, "#000", 0, 0)]
    ypos -0.2

style borderbox_:
    xmaximum 24

init python:
    def border_tag(tag, argument, contents):        
        return sum([
            [(
                renpy.TEXT_DISPLAYABLE, 
                Fixed(Text(c, style="border_"), style="borderbox_")
            ) for c in text]
            if kind == renpy.TEXT_TEXT
            else [(kind, text)]
            for kind, text in contents
        ], [])

    config.custom_text_tags["border"] = border_tag

define gray = "#e0e0e0"
label main_menu:
    return
label start:
    scene gray
    "Yiri" "有时候需要一点{border}{cps=20}恐怖的文字{/cps}{/border}。"


基于版主的代码得到了这个版本,在cps和字间距显示上都没有问题了。
谢谢版主!
回复 支持 1 抱歉 0

使用道具 举报

 楼主| 发表于 2021-6-14 07:37:36 | 显示全部楼层
[RenPy] 纯文本查看 复制代码
style border_ is text:
    color "#fff"
    outlines [(5, "#000", 0, 0)]

init python:
    def border_tag(tag, argument, contents):        
        print tag, argument, contents 
        return [
            (renpy.TEXT_DISPLAYABLE, Text(text, style="border_"))
            if kind == renpy.TEXT_TEXT
            else (kind, text)
            for kind, text in contents
        ]        

    config.custom_text_tags["border"] = border_tag

label start:
    "Yiri" "有时候需要一点{border}恐怖的文字{/border}。"


用这种方式做了一个比较粗糙的实现……
但是还有问题,因为加粗描边的部分放在了另一个 Text 里,所以显示的时候会整体显示出来,不受 cps 控制;而且在显示位置上会与前后的文本存在偏移。
目前效果如图:

                               
登录/注册后可看大图
回复 支持 抱歉

使用道具 举报

发表于 2021-6-14 21:14:26 | 显示全部楼层
对话内容的确没有outline标签,不能直接修改文字轮廓线。
自定义tag的办法,如果返回时Text型可视组件(已经算个图片),不受cps控制也没办法……

文本位置偏下的问题,主要是加了文字轮廓线之后,文本的高度比前面的大。凑合的办法是调下ypos的值。比如默认对话文本的字号为22时,ypos设置为-0.2

[RenPy] 纯文本查看 复制代码
style border_ is text:
    color "#fff"
    outlines [(5, "#000", 0, 0)]
    ypos -0.2

init python:
    def border_tag(tag, argument, contents):        
        rv = []

        for kind, text in contents:
            if kind == renpy.TEXT_TEXT:
                rv.append((renpy.TEXT_DISPLAYABLE, Text(text, style="border_")))
        return rv

    config.custom_text_tags["border"] = border_tag
回复 支持 抱歉

使用道具 举报

 楼主| 发表于 2021-6-14 21:57:13 | 显示全部楼层
被诅咒的章鱼 发表于 2021-6-14 21:14
对话内容的确没有outline标签,不能直接修改文字轮廓线。
自定义tag的办法,如果返回时Text型可视组件(已经 ...

谢谢!
回复 支持 抱歉

使用道具 举报

发表于 2021-6-14 22:37:49 | 显示全部楼层
又考虑了下cps的问题,如果在脚本中显式使用cps标签的话,好像也可以把每个字拆出来渲染成Text组件,然后再拼回去。简单尝试了下,文字间距啥的还需要调整下,功能可以实现:

[RenPy] 纯文本查看 复制代码
style border_ is text:
    color "#fff"
    outlines [(5, "#000", 0, 0)]
    ypos -0.2

init python:
    def border_tag(tag, argument, contents):
        rv = []
        cps_tag = False
        cps_arg = ''

        for kind, text in contents:
            if kind == renpy.TEXT_TAG and text[:3] == u'cps':
                print (text[4:])
                cps_tag = True
                cps = text[4:]

            if kind == renpy.TEXT_TEXT and cps_tag == True:
                for i in range(0, len(text)):
                    rv.append((renpy.TEXT_TAG, u'cps={}'.format(cps)))
                    rv.append((renpy.TEXT_DISPLAYABLE, Text(text[i:(i+1)], style="border_")))
                    rv.append((renpy.TEXT_TAG, u'/cps'))
                    i+=1

            elif kind == renpy.TEXT_TEXT and cps_tag == False:
                rv.append((renpy.TEXT_DISPLAYABLE, Text(text, style="border_")))
        return rv

    config.custom_text_tags["border"] = border_tag

define gray = "#e0e0e0"

label main_menu:
    return

# 游戏在此开始。
label start:

    scene gray
    
    "Yiri" "有时候需要一点{border}{cps=20}恐怖的文字{/cps}{/border}。"
回复 支持 抱歉

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 15:17 , Processed in 0.058463 second(s), 14 queries , File On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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