2026 Ren'Py完全手册:新手快速上手场景切换+标签+转场效果
一、对话语法详解
1.1 基本对话格式
Ren’Py的对话系统采用简洁的say语句,支持三种基本格式:
旁白格式(无角色名):
"这是一句旁白,用于叙述故事或表达角色内心想法。"角色对话格式(角色名+对话内容):
"艾琳" "你好,我是艾琳!"角色对象格式(使用预定义角色):
e "Hello, world!"1.2 角色定义方法
Character对象用于控制对话的外观和行为:
define e = Character("艾琳", who_color="#c8ffc8", what_color="#ffffff")
# 更复杂的角色定义define narrator = Character(None, what_italic=True, what_size=20)常用角色参数:
-
who_color:角色名称颜色
-
what_color:对话文本颜色
-
what_prefix/what_suffix:对话文本前缀/后缀
-
who_prefix/who_suffix:角色名前缀/后缀
-
image:关联的图片标签
1.3 对话样式设置
文本标签用于局部样式控制:
e "这是{b}粗体文本{/b},这是{i}斜体文本{/i}。"e "这是{color=#ff0000}红色{/color}和{size=30}大字体{/size}。"e "这是{w=1.0}暂停1秒{/w}的文本。"特殊对话效果:
# 打字机效果e "这段文字会逐字显示。"
# 暂停效果e "我想想...{p}好的!"
# 表情符号和图片插入e "表情符号:{image=smile.png}"注意事项:
-
左花括号 { 和左方括号 [ 在对话中具有特殊含义,使用时需要重复
-
引号需要使用反斜杠转义
-
文本标签必须成对闭合,避免嵌套错误
二、选项与分支控制
2.1 菜单选项创建
基础菜单格式:
menu: "我应该怎么做?"
"喝咖啡": "我喝了咖啡,味道很好。"
"喝茶": $ drank_tea = True "我喝了茶,尽量不发表政治声明。"
"离开": jump leave_scene2.2 条件选项显示
使用if子句控制选项的显示条件:
menu: "我想去哪里?"
"去公园" if park_available: jump park_scene
"去咖啡馆" if cafe_open: jump cafe_scene
"去秘密基地" if secret_unlocked: jump secret_base2.3 分支路径设计
完整分支示例:
label choices: menu: "选择你的道路": "魔法之路": $ path = "magic" jump magic_training "战士之路": $ path = "warrior" jump warrior_training "学者之路": $ path = "scholar" jump scholar_training
label magic_training: "你选择了魔法之路..." if path == "magic": "魔法课程开始!" jump story_continues
# 分支合并点label story_continues: "无论选择哪条路,你都开始了你的冒险。"2.4 条件判断语句
if/elif/else结构:
if points >= 100: "太棒了!你获得了最高评价!"elif points >= 60: "不错!你及格了。"else: "还需要继续努力。"复杂条件判断:
if love > 50 and trust > 30: jump good_endingelif love > 30 or trust > 50: jump normal_endingelse: jump bad_ending注意事项:
-
菜单选项至少需要有一个,否则会报错
-
所有菜单选项的条件都不满足时,会跳过整个菜单
-
使用jump跳转后,执行完目标标签不会自动返回
-
call语句可以跳转到其他标签并在执行完后返回
三、变量与数据存储
3.1 变量定义与赋值
define语句(定义常量):
define e = Character("艾琳")define game_version = "1.0.0"default语句(定义默认变量):
default love = 0default money = 100default inventory = []单行Python语句:
$ love += 10$ name = "玩家"$ items.append("剑")3.2 常用数据类型
字符串操作:
$ greeting = "你好,"$ name = "艾琳"e "[greeting][name]!"数值运算:
$ score = 0$ score += 5$ double_score = score * 2布尔值与条件:
$ is_hero = True$ has_item = False
if is_hero and not has_item: "你是英雄,但还没有装备。"列表和字典:
$ items = ["剑", "盾", "药水"]$ character_stats = { "hp": 100, "mp": 50, "attack": 20}3.3 变量作用域管理
命名存储区:
# 在指定存储区定义变量default sylvie.love = 0default alice.love = 0
# 访问存储区变量e "艾琳的好感度为[sylvie.love]"e "爱丽丝的好感度为[alice.love]"存储区访问:
python: from store import sylvie, alice sylvie.love += 1 alice.love += 23.4 Persistent数据存储
跨会话数据保存:
# 设置默认值default persistent.gallery_unlocked = Falsedefault persistent.endings_seen = []
# 修改persistent数据label ending_good: $ persistent.endings_seen.append("good") $ persistent.gallery_unlocked = True "恭喜达成好结局!"MultiPersistent多游戏数据共享:
define mp = MultiPersistent("demo.game")
label start: if mp.has_played_part1: e "欢迎回来!你已经完成了第一章。" else: e "这是你的第一次冒险!"
$ mp.has_played_part1 = True $ mp.save()注意事项:
-
define定义的变量不会随游戏存档保存
-
default定义的变量会自动包含在游戏存档中
-
persistent数据在游戏退出时保存,适合存储解锁内容
-
避免在persistent中存储自定义对象实例
四、场景与标签系统
4.1 场景切换语法
基本场景切换:
# 设置背景scene bg classroom
# 带转场效果的场景切换scene bg forest with dissolvescene bg city with fade常用转场效果:
# 淡入淡出scene bg night with fade
# 溶解效果scene bg castle with dissolve
# 滑动效果scene bg ocean with dissolve
# 拉帘效果scene bg interior with curtains4.2 角色立绘显示与隐藏
显示角色:
# 基本显示show eileen happy at leftshow sylvie normal at rightshow alice worried at center
# 带转场效果show eileen happy with dissolveshow sylvie normal at left with move
# 多角色显示show eileen happy at leftshow sylvie normal at rightshow alice worried at center隐藏角色:
# 隐藏特定角色hide eileen
# 带转场隐藏hide sylvie with dissolve
# 隐藏所有角色scene black角色属性修改:
# 临时修改(仅对当前对话生效)e @ smile "我感到很开心!"
# 永久修改e smile "我现在微笑着。"
# 组合使用e sad@smile "从不开心到开心。"4.3 标签系统
基础标签定义:
label start: "游戏从这里开始。" "欢迎来到视觉小说世界!" jump chapter1
label chapter1: "第一章开始..." e "你好,我是艾琳。"局部标签:
label chapter1: "这是第一章。"
label .intro: "这是第一章的介绍部分。" jump .main_story
label .main_story: "这是第一章的主线剧情。" jump .intro # 循环
label chapter2: "第二章开始。" jump chapter1.intro # 跳转到第一章的局部标签带参数的标签:
label show_stats(level=1, exp=0): "等级:[level]" "经验:[exp]" return
label start: call show_stats(5, 1000) call show_stats(level=3, exp=500)4.4 剧情流程控制
jump语句(单向跳转):
label start: "起点" jump middle
label middle: "中点" jump end
label end: "终点"call语句(调用后返回):
label start: "主剧情" call sub_event "返回主剧情"
label sub_event: "子事件" # 执行完会返回call语句后的代码return语句(返回调用点):
label game_start: menu: "开始游戏": jump main_story "查看帮助": call help_screen "返回游戏菜单"
label help_screen: "这是帮助信息。" return # 返回到menu语句之后特殊标签:
# 游戏启动标签label start: "游戏从这里开始"
# 主菜单替换label main_menu: # 自定义主菜单逻辑 return
# 游戏退出标签label quit: "感谢游玩!" return注意事项:
-
场景切换会清除所有显示的图片
-
show命令会保持之前的显示,需要用hide清除
-
jump是单向跳转,call会记住返回位置
-
局部标签只能在所属全局标签内直接引用
-
标签名要具有描述性,便于代码维护
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!