실행 중인 Ren'Py 게임의 생명주기
Ren'Py 게임은 실행 파일에서 시작하든 런처에서 시작하든 종료할 때까지 일정한 단계를 거칩니다. 이 페이지에서는 각 단계와 관련된 문을 설명합니다.
부팅 시점
게임 창이 나타나기 전에도 여러 작업이 진행됩니다. 이를 부팅 시점이라고 합니다. 이때 화면에 보일 수 있는 것은 프리스플래시뿐입니다.
스크립트 구문 분석 단계
Ren'Py는 게임 코드를 읽기 위해 각 .rpy 파일과 _ren.py 파일을 하나씩 처리합니다. 이를 구문 분석(parsing) 단계 또는 early 단계라고 합니다. 파일을 읽는 순서는 다음과 같습니다.
renpy/common의 파일을 전체 경로의 유니코드 순서로 읽습니다. 이 디렉터리는 Ren'Py 내부 전용입니다.game/libs/libs.txt가 있을 때만game/libs의 파일을 읽습니다. 하위 경로의 첫 디렉터리가 있으면 이를 제외한 경로를 기준으로 유니코드 순서로 읽습니다. 따라서game/libs/plants/aloe.rpy가game/libs/animals/zebra.rpy보다 먼저 로드됩니다.
game의 파일을 전체 경로의 유니코드 순서로 읽습니다. 이 순서에서는game/animals/zebra.rpy가game/plants/aloe.rpy보다 먼저 로드됩니다.game/mods/mods.txt가 있을 때만game/mods의 파일을 읽습니다. 하위 경로의 첫 디렉터리가 있으면 이를 제외한 경로를 기준으로 유니코드 순서로 읽습니다. 따라서game/mods/plants/aloe.rpy가game/mods/animals/zebra.rpy보다 먼저 로드됩니다.
제작자가 작성한 코드 중 가장 먼저 실행되는 것은 python early 블록입니다. 해당 파일의 읽기와 구문 분석이 끝난 직후, 다음 파일을 읽기 전에 실행합니다. 따라서 사용자 정의 문, 사용자 정의 스크린 언어 문, 새로운 워퍼처럼 구문 분석 방식에 영향을 주는 코드는 python early 블록에 작성해야 합니다.
init python early라는 표기를 볼 수도 있지만 init은 불필요하며, python early와 실행 방식이 같습니다.
초기화 단계
구문 분석/early 단계 다음에는 초기화(init) 단계가 시작됩니다. init python 문, define 문, transform 문, image 문, screen 문, style 문 등이 이때 실행됩니다.
초기화 단계는 우선순위별로 나뉘어 차례로 실행됩니다. 우선순위라는 이름과 달리 숫자가 작은 단계부터 실행합니다. 게임은 -99~99를 사용하고, 라이브러리와 모드는 -999~-100 및 100~999를 사용하는 것을 권장합니다. -999~999 범위 밖의 값은 Ren'Py 내부 전용입니다.
기본적으로 이 문들의 초기화 오프셋은 0입니다. init offset 문 등으로 변경할 수 있습니다. image 문은 예외로, 기본 초기화 우선순위가 500이며 init offset은 이 값을 대체하지 않고 500에 더하거나 뺍니다.
images 디렉터리의 이미지 자동 정의는 초기화 우선순위 0에서 수행됩니다.
define 문 <define-statement>은 초기화 시점에 실행됩니다. Ren'Py는 성능 최적화를 위해 이 변수들을 상수로 취급하므로 이후에 값을 바꾸면 안 됩니다.
default 문은 초기화 시점에 실행되지 않지만, 문에 지정한 우선순위는 default 문끼리의 실행 순서에 영향을 줍니다.
init offset 문
init offset 문은 초기화 시점에 실행할 문의 우선순위 오프셋을 설정합니다. 파일 앞부분에 두는 것이 좋으며, 현재 블록과 하위 블록에서 다음 우선순위 설정 문이 나올 때까지 이후의 모든 문에 적용됩니다. 다음 문은:
init offset = 42
우선순위 오프셋을 42로 설정합니다. 다음 예제에서는:
init offset = 2
define foo = 2
init offset = 1
define foo = 1
init offset = 0
첫 define 문의 우선순위가 2이므로 두 번째 define 문보다 나중에 실행됩니다. 따라서 foo의 최종값은 2입니다.
스크립트 실행
이 단계에서는 일반적인 Ren'Py 문이 실행되며 레이블과 제어 흐름의 규칙이 적용됩니다.
이 단계에서 변경한 변수는 게임 저장 시 함께 저장되고, 불러올 때 복원됩니다. 게임 창은 이 단계에서 첫 상호작용이 일어날 때 표시됩니다.
Ren'Py가 설정 변수의 값을 캐시할 수 있으므로 스크립트 실행이 시작된 뒤에는 설정 변수를 바꾸면 안 됩니다.
스플래시 화면 전
이 절의 작업은 Ren'Py 시작 시 또는 메인 메뉴로 돌아온 뒤 실행됩니다. 스플래시 화면을 건너뛰더라도 실행됩니다.
스플래시 화면을 표시하기 전에 default 문을 실행하고, 이어서 config.start_callbacks를 실행합니다.
스플래시 화면
splashscreen 레이블이 있으면 반환할 때까지 실행합니다.
스플래시 화면은 Ren'Py를 한 번 실행할 때 한 번만 표시되며, 스크립트 실행이 다시 시작될 때는 건너뜁니다.
스플래시 화면이 끝나면, 건너뛴 경우에도 scene black을 실행해 화면을 지우고 기본 검은 배경을 표시합니다.
게임 진행 단계
실제 게임을 플레이하는 단계로, 플레이어가 가장 많은 시간을 보내는 구간입니다. 게임을 종료하거나 다시 시작해 메인 메뉴로 돌아갈 때까지 이어집니다.
게임 진행 중 ShowMenu 액션을 사용하면 새로운 컨텍스트에서 스크린을 표시할 수 있습니다.
이 단계는 플레이어가 종료하거나 게임을 다시 시작해 메인 메뉴로 돌아갈 때 끝납니다. 레이블과 제어 흐름에서 설명하듯 호출 스택이 빈 상태에서 반환하면 게임이 다시 시작됩니다. MainMenu 액션이나 renpy.full_restart() 함수로도 다시 시작할 수 있습니다.
게임이 다시 시작되면 영구 데이터를 제외한 모든 데이터가 스크립트 초기화 단계 종료 시점의 값으로 돌아갑니다. 그 뒤 스플래시 화면을 건너뛰고 스크립트 실행 단계를 다시 시작합니다.