镜头特效
本页属于 GenPy Ren'Py 学习路线。教程内容面向 Ren'Py 8.x,并在页面末尾连接到 GenPy 的对应工作流。
学习目标
- 了解“镜头特效”在 Ren'Py 项目中的用途。
- 能在一个最小项目里验证本章相关语法或工作流。
- 知道发布前需要检查的常见风险,并能在 GenPy 中继续维护。
核心语法
shakezoomKen Burnsflashvignetteletterbox
可运行示例
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 letterbox7. 镜头平移(配合 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。 - 频繁强震/缩放会让人不适,给“减少动态效果”开关(无障碍)。
官方参考
- 转场(vpunch/hpunch 等):https://www.renpy.org/doc/html/transitions.html
- ATL(function/缩放/平移):https://www.renpy.org/doc/html/atl.html
- 3D 舞台镜头:https://www.renpy.org/doc/html/3dstage.html
在 GenPy 里怎么做
- 在 GenPy 的代码模式中维护相关 .rpy 文件,先保持语法清晰,再逐步加入本章功能。
- 用故事图谱、变量、校验或演出编辑器把“能运行”提升到“可维护”。
- 导出前结合 Ren'Py Lint 和 GenPy 校验结果,确认脚本、素材和发布路径一致。
推荐继续阅读:
