Ren’Py GAL开发学习笔记

📋 知识地图

说明:✅ = 已有覆盖(可继续深化) ⬜ = 待扩充

一、Ren’Py 引擎基础

  • ✅ Ren’Py 是什么(基于 Python 的跨平台视觉小说引擎)
  • ⬜ 安装与环境搭建(SDK 下载、项目创建、启动器使用)
  • ⬜ 项目目录结构详解(game/ / images/ / gui/ / screens.rpy / options.rpy)
  • ⬜ Ren’Py 版本管理(8.x vs 7.x 差异)

二、剧本脚本(Script)核心

  • ✅ 角色定义(define Character)
  • ✅ 对话系统(say 语句)
  • ✅ 标签跳转(label / jump / call / return)
  • ✅ Python 嵌入($ 前缀、Python 块)
  • ✅ 变量与条件判断(default / if 语句)
  • ⬜ 多语言 / 翻译系统(translation 文件生成与管理)
  • ⬜ 剧本分支与多结局管理
  • ⬜ 章节拆分与多 .rpy 文件组织

三、图像与显示系统

  • ✅ 图像定义(image)与显示(show / scene / hide)
  • ✅ 图像属性系统(tag + attribute)
  • ✅ 位置控制(at left / at right / 自定义位置)
  • ✅ 转场特效(with fade / with dissolve / 自定义转场)
  • ⬜ Live2D / Spine 动态立绘集成
  • ⬜ 图层(layer)体系深入
  • ⬜ 动态图像(ATL:Animation and Transformation Language)
  • ⬜ 视频播放(movie 显示组件)
  • ⬜ 摄像机控制与画面变换

四、音频系统

  • ⬜ BGM 播放与控制(play music / stop music / 淡入淡出)
  • ⬜ 音效(sound vs voice 的区别)
  • ⬜ 音频格式支持(ogg / mp3 / wav / opus)
  • ⬜ 多条音轨混合与音量控制

五、菜单与 UI 系统

  • ✅ 基础选项菜单(menu)
  • ✅ 条件选项(if 控制菜单项显示)
  • ⬜ 自定义 GUI 样式(gui.rpy 详细配置)
  • ⬜ Screen 语言系统(screen / hbox / vbox / textbutton / bar 等)
  • ⬜ 存档/读档界面定制
  • ⬜ 设置界面(音量、全屏、文本速度)定制
  • ⬜ 自定义对话框外观
  • ⬜ 画廊(CG Gallery)与音乐室实现
  • ⬜ 流程图/关系图界面

六、存档与持久化

  • ⬜ 存档机制原理(save / load / autosave)
  • ⬜ 持久化变量(persistent)与多周目数据
  • ⬜ 存档兼容性(版本升级后存档不丢失)

七、Python 集成与高级脚本

  • ⬜ Python 代码块(init python / python early)
  • ⬜ 自定义 Python 类与 Ren’Py 交互
  • ⬜ 外部 Python 包的使用
  • ⬜ 网络请求与在线功能(爬虫集成、排行榜等)
  • ⬜ 小游戏嵌入(用 Screen + Python 实现)

八、动画与特效

  • ⬜ ATL(动画变换语言)详解
  • ⬜ transform 自定义动画
  • ⬜ 粒子效果与屏幕特效
  • ⬜ 过场动画(opening / ending movie)

九、打包与发布

  • ⬜ Windows / macOS / Linux 打包
  • ⬜ Android 打包(配置签名、Google Play 上架)
  • ⬜ Web 版构建(HTML5 导出)
  • ⬜ itch.io 发布流程
  • ⬩ Steam 上架流程
  • ⬜ 版本更新与 DLC 管理

十、素材制作管线

  • ⬜ 立绘规格与导出规范(分辨率、格式、分层)
  • ⬜ 背景素材制作要点
  • ⬜ UI 切图规范
  • ⬜ 字体授权与多语言字体选择
  • ⬜ 音效/BGM 资源获取渠道

十一、实战项目

  • ✅ 御坂游戏项目(早期 Demo 计划)
  • ⬜ 完整短篇 GAL 从零开发记录

Ren’Py作用

Ren’Py是以python编译的支持安卓、pc、web的多平台GALgame开发引擎,具有脚本简单、支持广等优点。

脚本编辑

script.rpy脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
define s = Character('希尔维亚', color="#c8ffc8")
define w = Character('我', color="#c8c8ff") //定义角色名和角色名颜色
define e = Character("艾琳", image="eileen") //定义了角色图片
define p = Character("player_name", dynamic=True) //从一个变量中获取角色名称
default wodouyao = False //后宫flag

label start: //label语句,用于剧情块。此处创建了start标签,是“start game”游戏入口。

scene bg meadow //scene清空所有图像,后面两个参数是tag标签(文件名)和属性(多个对应属性)。bg习惯指背景图片。图片输出命名规律如bg meadow.jpg、bg uni.jpg。

\# 这是一条注释。

//图像默认居中相接于底部

with fade //with转场标签,后方参数为转场样式。此处是褪色。

"希尔维亚" "嗨!今天的课怎么样?"

play music "illurock.ogg" //播放音乐

"我" "挺好的……" //say语句,第一个参数是说话角色,第二个参数是正在说的话。**“\”**反斜杠是转义符。

e happy "不过这都是过去的事了。" //等价于show eileen happy
e @ happy "虽然还挺有趣的。" // `@`表示临时改变,此句之后变回去


"我当然不会承认,上课的时候内容只是左耳进右耳出。" //内心所想?或**旁白**?

stop music
play sound "effect.ogg" //音效,不会循环播放

w "你现在要回家了吗?要不要跟我一起走?"

s "当然!"

show sylvie green smile //标签为sylvie的图片,后两个为属性。忽略图片扩展名。
with dissolve //溶解

"她把脸转向我,上面挂着微笑。她看起来兴致高昂。我觉得自己刚才的紧张情绪已经消散。"

"我得问问她!"

m "嗯呣……你是否可以……"

m "你是否可以做我的视觉小说画师?"

show sylvie green surprised //同标签,将自动替换之前的,常用于表现角色表情变换

"沉默。"

s "我立刻去办!"

hide sylvie //隐藏该图形,角色消失
pause 3.0 //暂停3秒,不指定时间,则等待鼠标点击

show sylvie green sad

s "你为什么那么熟练啊!"

show sylvie green smile at right //图像靠左。right等关键词可自定义。

menu:

"你们都是我的翅膀!":
jump badend //可任一跳转到其他rpy文件中

"我能有什么办法,不是我花心,是tm船裂了啊!":
jump book

label badend:

$ wodouyao = True //后宫选项被选中,赋值。$表示py语句。

".:. Bad结局预定"

return //结局


if wodouyao:

"渣男死路一条" //wodouyao为真

else:

"不选也是死路一条。" //wodouyao为假

Ren’Py游戏脚本详细

1
2
3
4
5
6
7
8
脚本
├── 语句块(block) #多行脚本构成
| ├── 各行脚本
| | ├── 基本元素(element)
| | ├── 基本元素(element)
| 语句块(block) #多行脚本构成
| └── 各行脚本 #核查证件上传类
| └── 基本元素(element)

game目录下有多个.rpy文件组成。在Ren’Py启动时,会将.rpy文件编译为.rpyc文件。

python基础(略)

重要语句解释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
label loop_start:  //jump跳转

e "哦,不!看起来我们陷入了一个无限循环之中。"

jump loop_start


e "首先,我们调用一个子程序(subroutine)。" //call可带参

call subroutine

call subroutine(2)

call expression "subroutine" pass (count=3)

label subroutine(count=1):

e "我来过这里 [count] 次了。"
e "接着,我们会返回到子程序(subroutine)。"

return

控制图像

控制图像的四种语句:

  • image - 定义一个新的图像(image)。
  • show - 在图层上(layer)显示一个图像。
  • scene -清空图层(layer),并可选是否在那个图层上显示一个图像。
  • hide - 将图层(layer)上的某个图像移除。
  • with - 用于图像切换,降低图像变化的突兀感。
1
2
3
4
5
6
7
8
image eileen happy = "eileen_happy.png"
image black = "#000"
image bg tiled = LiveTile("tile.jpg")

image eileen happy question = VBox(
"question.png",
"eileen_happy.png",
)

控制菜单

1
2
3
4
5
6
7
menu:
"向左": //选项
...
"向右":
...
"向前看" if drank_tea: //值为真,则可选
...

GUI图形界面定制(暂略)

御坂游戏项目

嘛,目前缺立绘、缺场景素材、缺剧本,抽时间吧,看6月前搞不搞得出来个短剧本GALgame demo。

-------------本文结束感谢您的阅读-------------