Skip to content

镜头特效 ​

本页属于 GenPy Ren'Py 学习路线。教程内容面向 Ren'Py 8.x,并在页面末尾连接到 GenPy 的对应工作流。

学习目标 ​

  • 了解“镜头特效”在 Ren'Py 项目中的用途。
  • 能在一个最小项目里验证本章相关语法或工作流。
  • 知道发布前需要检查的常见风险,并能在 GenPy 中继续维护。

核心语法 ​

  • shake
  • zoom
  • Ken Burns
  • flash
  • vignette
  • letterbox

可运行示例 ​

text
init python:
    import random
    def make_shake(intensity=12, duration=0.5):
        def f(trans, st, at):
            if st >= duration:
                trans.xoffset = 0
                trans.yoffset = 0
                return None                  # 结束,复位
            # 随时间衰减的随机抖动
            decay = 1.0 - (st / duration)
            trans.xoffset = random.randint(-intensity, intensity) * decay
            trans.yoffset = random.randint(-intensity, intensity) * decay
            return 0
        return f

transform big_shake:
    function make_shake(24, 0.6)

label boom:
    show eileen happy at big_shake
    # 给整层震动更震撼:
    show layer master at big_shake
    "地动山摇!"

教程正文 ​

模拟“摄影机”的动态:震动、缓慢推拉(Ken Burns)、闪白闪黑、缩放冲击、暗角与信箱黑边。 这些是营造张力与电影感的常用手段。

1. 震屏(Screen Shake) ​

最快:内置震动转场 ​

text
"砰!"
with vpunch          # 垂直震一下
"轰隆隆……"
with hpunch          # 水平震一下

自定义可控震动(强度/时长) ​

用 ATL function + 随机偏移,做可调的持续震动:

text
init python:
    import random
    def make_shake(intensity=12, duration=0.5):
        def f(trans, st, at):
            if st >= duration:
                trans.xoffset = 0
                trans.yoffset = 0
                return None                  # 结束,复位
            # 随时间衰减的随机抖动
            decay = 1.0 - (st / duration)
            trans.xoffset = random.randint(-intensity, intensity) * decay
            trans.yoffset = random.randint(-intensity, intensity) * decay
            return 0
        return f

transform big_shake:
    function make_shake(24, 0.6)

label boom:
    show eileen happy at big_shake
    # 给整层震动更震撼:
    show layer master at big_shake
    "地动山摇!"

给 show layer master 加震动 = 整个画面一起抖,比单个立绘更有冲击力。

2. Ken Burns(缓慢推拉/平移) ​

让背景缓慢放大并平移,静态 CG 立刻有了呼吸感与电影感:

text
transform ken_burns:
    zoom 1.0 xalign 0.0 yalign 0.0
    linear 8.0 zoom 1.15 xalign 1.0 yalign 1.0    # 8 秒缓慢推近并右下移

label scene1:
    scene bg city at ken_burns
    "城市在晨光中苏醒。"

变体:纯推近 linear 6.0 zoom 1.2;横摇 linear 6.0 xalign 1.0。

3. 闪白 / 闪黑(Flash) ​

用纯色 + 转场 ​

text
image white = Solid("#ffffff")
image black = Solid("#000000")

label flash:
    show white
    with Dissolve(0.05)        # 瞬间变白
    hide white
    with Dissolve(0.4)         # 慢慢褪去
    "(雷光一闪)"

封装成可复用 transform(闪一下自动消失) ​

text
transform flash_out:
    alpha 1.0
    linear 0.4 alpha 0.0

label lightning:
    show white at flash_out onlayer screens behind nothing
    "轰!"

4. 缩放冲击(Zoom Punch) ​

强调瞬间:画面猛地放大再弹回。

text
transform zoom_punch:
    zoom 1.0
    ease 0.08 zoom 1.12
    ease 0.18 zoom 1.0

label hit:
    show eileen angry at zoom_punch
    e "什么!?"

5. 暗角(Vignette) ​

四角压暗,聚焦中心。最简单是叠一张中空透明、四周变黑的 PNG:

text
image vignette = "fx/vignette.png"     # 中间透明、四周渐黑的覆盖图

screen vignette_overlay():
    zorder 90
    add "vignette"

label start:
    show screen vignette_overlay

想动态加深(如进入紧张段落)可对它做 alpha 动画。

6. 信箱黑边(Letterbox / 电影感) ​

上下加黑边,进入“过场/回忆”氛围。Ren'Py 自带 cinema/letterbox 思路,也可自己做:

text
transform bar_in_top:
    yalign 0.0
    ypos -100
    ease 0.4 ypos 0

transform bar_in_bottom:
    yalign 1.0
    ypos 100
    ease 0.4 ypos 0

screen letterbox():
    add Solid("#000") xsize config.screen_width ysize 100 at bar_in_top
    add Solid("#000") xsize config.screen_width ysize 100 at bar_in_bottom yalign 1.0

label cutscene:
    show screen letterbox
    "……(电影感过场)"
    hide screen letterbox

7. 镜头平移(配合 3D 舞台) ​

真正的“镜头移动”用 camera(见第 14 章):

text
camera:
    perspective True
    xpos 0
    linear 4.0 xpos 250        # 镜头横移,不同 zpos 的层产生视差

常见坑 ​

  • 震动用 random 时,记得到时间复位 xoffset/yoffset 并 return None。
  • 整屏效果作用在 show layer master;只想震立绘就作用在该立绘。
  • 闪白/暗角/信箱用屏幕叠加时注意 zorder,别盖住该显示的 UI。
  • 频繁强震/缩放会让人不适,给“减少动态效果”开关(无障碍)。

官方参考 ​

在 GenPy 里怎么做 ​

  • 在 GenPy 的代码模式中维护相关 .rpy 文件,先保持语法清晰,再逐步加入本章功能。
  • 用故事图谱、变量、校验或演出编辑器把“能运行”提升到“可维护”。
  • 导出前结合 Ren'Py Lint 和 GenPy 校验结果,确认脚本、素材和发布路径一致。

推荐继续阅读:

Built for GenPy creators.