找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6190|回复: 0

[转载] Ren'Py引擎从入门到放弃(支线2·续)——只有文字也要搞NV(?)

[复制链接]
发表于 2019-4-25 18:51:15 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 BuErShen 于 2019-4-25 16:46 编辑

Ren'Py引擎从入门到放弃(支线2·续)——只有文字也要搞NV(?)

世上无难事,只要肯放弃。

支线系列是独立于基础之外的内容,会使用一些犄角旮旯的知识点,感觉有困难的同学可以暂时不(fang)看(qi)。

本篇内容将继续讲解文本的一些使用和处理。请善用官方文档的搜索功能,能解决大部分疑问。

续上一篇支线2,我们了解一下,如何在不动用美工人员的情况下,把文本搞点花样出来。

第一个问题:如何添加文字投影?

答:与大多数图像编辑软件不同,Ren'Py没有给文字直接添加投影(drop-shadow)的“选项”。但是,与其他很多游戏引擎类似,Ren'Py提供了轮廓线(outlines)来实现类似效果。文档原文的说法是:The outline functionality can also be used to give drop-shadows to fonts, by specifying a size of 0 and non-zero offsets. 就是把轮廓线外延size设置为0,然后添加一个非零偏移量。

举个栗子,我们要给几个字添加右下方的投影。样例代码如下:
[RenPy] 纯文本查看 复制代码
# 样式drop_shadow_1
style drop_shadow_1:
    size 40
    outlines [ (0, "#101010", 2, 2) ]

# 使用文本组件定义图像
image test_text_1 = Text("测试文本", style="drop_shadow_1")

这样显示出来的文本就会带一个投影,显示在文本的右下方。
显示在文本的右下方.jpg
关于“什么是样式”的问题,我(大概)会在主线的文章中说明。

需要注意,轮廓线(outlines)是样式(style)的一个特性(property)。在定义样式时,同一个特性只能出现一次,否则程序会报错。也就是说,不能同时出现轮廓线和投影效果。不过,文本组件(text displayable)可以使用多个图像合成的办法,也就是使用Composite。Composite有个限制,需要指定合成后的大小。如果合成中的文本组件宽度超过Composite定义的尺寸,文字就会自动换行,总之不灵活。代码如下:
[RenPy] 纯文本查看 复制代码
# 文字的绿色轮廓线。
style drop_shadow_ex1:
    size 80
    outlines [ (2, "#008000", 0, 0) ]

# 文字的深灰色投影。
style drop_shadow_ex2:
    size 80
    outlines [ (4, "#404040", 4, 4) ]
    color "#404040"

# 合成的显示顺序与Composite入参顺序一致。所以先显示投影,再显示带轮廓线的文字。
image test_text_2 = Composite(
    (600, 600),
    (0, 0), Text("测试文本", style="drop_shadow_ex2"),
    (0, 0), Text("测试文本", style="drop_shadow_ex1"))

这个办法只能用在文本组件中。对话窗口的文字,貌似没辙……

第二个问题:如何实现文字遮罩效果?

答:这是个略微有点亮骚并且常用功能。实现的关键在于“AlphaMask()”。AlphaMask()至少有两个入参,child是颜色,mask是遮罩图。对于文字遮罩来说,child是背景图,文本组件是mask。下面是一个样例。

这里我先做了个带渐变的图片:
带渐变的图片.jpg
图片名称为“ground.png”,定义:
[RenPy] 纯文本查看 复制代码
image mask_image = "images/background/ground.png"

接着定义文本组件:

# 为了突出遮罩效果,文号设置很大。
[RenPy] 纯文本查看 复制代码
# 为了突出遮罩效果,文号设置很大。
image test_text = Text("测试文本", size=300)

使用AlphaMask()定义一个遮罩效果的图像(image):
[RenPy] 纯文本查看 复制代码
# 这里提前使用At()将文本居中。
image test_text = AlphaMask("mask_image", At("test_text", truecenter))

显示效果如图:
显示效果如图.jpg
当然,遮罩也可以用于视频。语法是类似的,这里就不写了。

第三个问题:还有啥骚操作吗?

答:AlphaBlend()也是个展示动态效果的好功能。它自身的使用比较简单,难点在于 设计control 这个参数。由于涉及到转场等问题,此处暂不展开……

最后,有一个特别需要注意的点:所有使用 alpha通道 的操作都可能会在安卓平台失效!如果做安卓移动端开发就比较麻烦……

预告部分:下个支线应该会配合主线的 变换(transform)内容讲解两个样例……

广告部分
Lemma论坛是个好东西,能搜出很多实用的内容~



“Ren'Py引擎从入门到放弃”系列教程
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-3-29 23:33 , Processed in 0.051371 second(s), 15 queries , File On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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