因为想要尝试把Ren'Py移植到Cocos上,尽可能的使用原来的rpy文件,这就难免要解析rpy文件,因此就参考了一下Ren'Py自己是怎么解析脚本的。
文件加载
那么从哪里看起呢?先简要看一下Ren'Py的启动过程。启动脚本肯定是根目录下的renpy.py了,前面是一堆设置路径的方法,我们暂且跳过,直接看最后一行
if __name__ == "__main__":
main()
这里调用了main()函数,算是入口了,main()函数在上面一段
def main():
renpy_base = path_to_renpy_base()
# Add paths.
if os.path.exists(renpy_base + "/module"):
sys.path.append(renpy_base + "/module")
sys.path.append(renpy_base)
# This is looked for by the mac launcher.
if os.path.exists(renpy_base + "/renpy.zip"):
sys.path.append(renpy_base + "/renpy.zip")
# Ignore warnings that happen.
warnings.simplefilter("ignore", DeprecationWarning)
# Start Ren'Py proper.
try:
import renpy.bootstrap
except ImportError:
print >>sys.stderr, "Could not import renpy.bootstrap. Please ensure you decompressed Ren'Py"
print >>sys.stderr, "correctly, preserving the directory structure."
raise
if android:
renpy.linux = False
renpy.android = True
renpy.bootstrap.bootstrap(renpy_base)
前面依然是设置路径导入package,最关键的还是在最后一行,调用了
bootstrap下面的bootstrap()函数,并传入了renpy的根目录。
好那么我们移步bootstrap.py,在renpy文件夹下面,前面又是一堆设定目录的代码,直到第289行
renpy.main.main()
又调用了
main的main(),继续跳转。
我们要找的在main.py的第239行
# Load the script.
renpy.game.exception_info = 'While loading the script.'
renpy.game.script = renpy.script.Script()
# Set up error handling.
renpy.exports.load_module("_errorhandling")
renpy.style.build_styles() # @UndefinedVariable
renpy.display.screen.prepare_screens()
# Load all .rpy files.
renpy.game.script.load_script() # sets renpy.game.script.
把一个
Script对象赋给了renpy.game.scritp,然后调用
load_script函数。
Script.py这个类是处理脚本的主要类,前面有这么一段说明注释:
This class represents a Ren'Py script, which is parsed out of a
collection of script files. Once parsing and initial analysis is
complete, this object