렌파이 언어를 이해하려면 우선 렌파이 스크립트 구조를 알아야 합니다. 렌파이 파일은 여러 개의 블록이 모여 만들어지며, 각 블록은 여러 줄의 행으로 이루어져있습니다. 또한 각 행은 명령문을 구성하는 요소로 만들어져있습니다.
game 디렉토리 안에 있는 파일 중에서 .rpy 확장자로 끝나는 모든 파일이 렌파이 게임을 구성하는 스크립트 파일입니다. 렌파이는 유니코드 정렬 순서대로 파일을 읽으며, 파일에 적힌 내용을 렌파이 스크립트로 사용합니다.
스크립트가 여러 파일에 나뉘어있던 한 파일에 담겨 있던 별 차이는 없습니다. 다른 파일에 있는 라벨을 불러오거나 다른 라벨로 건너 뛰어 스크립트를 읽는 순서를 바꿀 수 있기 때문입니다. 그러니 스크립트 파일 짜임새를 자기 마음대로 만들어도 괜찮습니다. 어떤 게임 제작자는 이벤트 하나 단위나 하루 단위로 스크립트를 나누기도 하며, 어떤 게임 제작자는 스크립트를 통채로 파일 하나에 담기도 합니다.
렌파이를 구동하면 렌파이는 스크립트 불러오는 속도를 올리기 위해 .rpy
파일을
.rpyc
파일로 되바꿉니다. .rpy
파일 내용이 바뀌면
렌파이가 시작될 때 .rpyc
파일이 갱신됩니다. 하지만 .rpyc
파일과
이름이 같은 .rpy
파일이 없는 경우에는 .rpyc
파일이
대신 사용됩니다. 따라서 .rpy
파일과 .rpyc
파일을 함께 삭제하지 않는다면
문제가 일어날 수도 있습니다.
기본 디렉토리는 게임과 함께 배포되는 모든 파일이 포함되는 디렉토리입니다. (게임과 함께 배포되지 않는 파일도 있습니다.) README 같은 파일은 이 디렉토리에 있어야 배포판에 포함될 것입니다.
기본 디렉토리는 렌파이 디렉토리 아래에 만들어지며 게임 이름을 따라 이름이 지어집니다. 예를 들어 렌파이 디렉토리 이름이 renpy-6.11.2 이고, 게임 이름이 "HellowWorld" 라면 기본 디렉토리는 renpy-6.11.2/HelloWorld 가 됩니다.
game 디렉토리는 거의 언제나 기본 디렉토리 아래에 있는 "game"폴더입니다. 예를 들어 기본 디렉토리가 renpy-6.11.2/HelloWorld 라면 게임 디렉토리는 renpy-6.11.2/HelloWorld/game 입니다.
어쨌든 렌파이는 디렉토리를 다음과 같은 순서대로 검색합니다. However, Ren'Py searches directories in the following order:
그러나 렌파이 런처는 "game" 과 "data" 경로만 제대로 인식할 것입니다.
게임 디렉토리에는 게임에서 사용하는 모든 파일이 들어 있습니다. 게임 디렉토리와 하위디렉토리에서 .rpy 파일과 .rpyc 파일, 그리고 게임 스크립트와 관련된 파일을 전부 검색합니다. .rpa 및 게임에서 자동으로 사용하는 파일도 검색합니다. 마지막으로 파일을 불러올 경로를 설정했다면 게임 디렉토리에서 상대 경로를 검색해 경로를 탐색합니다. (하지만 config.searchpath 로 작동 방식을 변경할 수 있습니다.)
렌파이 스크립트 파일에는 주석을 적을 수도 있습니다. 주석이란 해시 기호(#) 로 시작하는 행을 가리킵니다. 문자열 안에서는 주석이 만들어지지 않습니다.
# 이것은 주석입니다.
show black # 이것도 주석입니다.
"# 이것은 주석이 아닙니다. 문자열의 일부이기 때문입니다."
렌파이는 주석을 제외하고 스크립트를 읽습니다.
스크립트 파일은 논리행 으로 이루어져있습니다. 논리행은 행의 맨 앞에서부터 시작하며 행의 맨 마지막에서 끝납니다. 그러나:
에는 논리행이 끝나지 않습니다. 한 논리행이 끝나면 다음 행의 맨 앞 부분에서부터 다음 논리행이 시작합니다.
렌파이 언어에 있는 거의 모든 명령문은 하나의 논리행으로 이루어져있습니다.
"이것은 하나의 논리행입니다."
"이 행이 문자열을 포함하고 있기 때문에, 행의 끝이 와도
이 문자열은 계속됩니다."
$ a = [ "괄호때문에 이 행 또한",
"두 줄에 걸쳐있습니다." ]
빈 논리행은 무시합니다.
명령문을 정리하기 위해 논리행 앞에 빈 공간을 넣는 것을 가리켜 들여쓰기 라고 합니다. 렌파이에서 들여쓰기를 할 때 빈 공간에는 오직 스페이스만 입력해야 합니다.
명령문을 들여쓰면 블록 으로 묶을 수 있습니다. 블록은 여러 행이나 여러 명령문으로 이루어질 수 있습니다. 파일을 블록으로 나눌 때는 다음과 같은 규칙이 적용됩니다:
렌파이에서 들여쓰기는 아주 중요한 법칙입니다. 들여쓰기를 잘못하면 구문 오류, 논리 오류 등이 발생합니다. 또한 들여쓰기를 사용하면 스크립트를 전부 훑지 않아도 스크립트 구조를 알아볼 수 있습니다.
"이 명령문과 아래 있는 if문은 첫 번째 블록에 포함됩니다."
if True:
"하지만 이 문장은 새 블록에 포함됩니다."
"이 문장 역시 새 블록에 포함됩니다."
"이 줄은 첫 번째 블록의 일부입니다."
아래는 렌파이 명령문을 이루는 기본 요소입니다.
말 그대로 소스 코드에 반드시 나타나야 하는 단어입니다. 명령문과 속성을 이끌 때 사용됩니다.
밑줄 하나(_)로 시작하는 이름은 문서화되어있지 않다면 보통은 렌파이 내부에서 사용하는 이름입니다. __로 시작하나 __로 끝나지 않는 이름은 그 이름이 지정된 파일에서만 사용하는 이름으로 바뀌게 됩니다.
이미지 이름 은 공백으로 구분된 하나 이상의 이름으로 이루어져있습니다. 이미지 이름의 첫 번째 요소는 이미지 태그 라고 합니다. 두 번째 이후 부터 나오는 요소는 이미지 속성 이라고 합니다.
예를 들어 mary beach night happy
라는 이미지 이름이 있으면,
이미지 태그는 mary
이고, 이미지 속성은 beach
,
night
, happy
입니다.
문자열은 하나의 인용 기호( ", ', ' ) 로 시작해서 많은 문자를 포함하고, 첫 번째 것과 짝이 맞는 인용 기호로 끝납니다.
일부 특수한 문자(%, {)를 사용하려면 \%, \[ \{ 처럼 백슬래시(\)를 함께 입력해야 합니다. 문자열 안에서 새 줄을 시작하려면 백슬래시와 n을 함께 (\n) 입력하면 됩니다.
렌파이 문자열 안에서 스페이스를 나란히 여러 개 입력하면 공백 한 개로 압축됩니다. 이를 방지하려면 스페이스 앞에 백슬래시를 입력해야 합니다:
'문자열 안에서은 \'탈출문자\'를 사용하지 않는 이상 구분문자를 사용할 수 없습니다.'
단순 연산식은 파이썬 연산식으로 렌파이 스크립트에서 파이썬의 능력을 이용하기 위해 쓰입니다. 단순 연산식은 :
다음에 적을 수 있습니다. 단순 연산식 뒤에는:
을 여럿 적을 수 있습니다. 그 예로, 3
, (3 + 4)
, foo.bar
, and foo(42)
는 모두 단순 연산식입니다. 그러나 '3 + 4'
는 단순 연산식이 아닌데,
연산식이 문자열 끝에서 끝나기 때문입니다.
렌파이 명령문은 대개 일반 문법 구조를 따릅니다. say문을 제외한 나머지 명령문은 명령문을 이끄는 키워드로 시작합니다. 매개 변수가 필요한 명령문을 쓸 때에는 매개 변수가 키워드 뒤에 나타납니다.
매개 변수 다음에는 하나 혹은 그 이상의 속성이 나타납니다. 속성은 순서에 상관 없이 지정할 수 있으며, 각 속성은 한 번씩만 적용됩니다. 속성은 키워드로 시작합니다. 속성 이름 뒤에는 위에 적힌 구문 요소가 따라나옵니다.
명령문이 블록을 받는다면 그 행은 콜론(:)으로 끝나야 합니다. 그렇지 않으면 행은 그냥 끝납니다.
주석
지금 당장 이 섹션을 전부 읽을 필요는 없습니다. 그냥 넘겼다가 나중에 예제를 이해하지 못하거나 실제로 스크립트가 어떻게 작동하는지를 알고 싶어졌을 때 이 부분을 다시 읽어보세요.
렌파이에서 사용되는 여러 명령문은 파이썬 표현식을 받습니다. 예를 들어 새 Character 를 정의하는 것은 Character 함수를 호출하는 것과 연관이 있습니다. 파이썬 표현식은 굉장히 쓰임새가 다양합니다만, 간단한 렌파이 게임 스크립트를 작성할 때는 그 일부만 사용해도 충분합니다.
아래는 파이썬 표현식 중 일부입니다.
3
나 42
를 가리켜 정수라고 합니다..5
, 7.
, 9.0
이 부동소수점입니다.True
는 참값, False
는 거짓값을 뜻합니다.
None
은 값이 없음을 나타냅니다.튜플은 튜플에 포함하고 있는 요소의 갯수가 중요한 컨테이너를 나타내기 위해 사용됩니다. 예를 들어 높이와 너비를 나타낼 때는 2 요소 튜플을 사용하거나, 사각형을 나타낼 때는 (x, y, 가로, 세로) 를 뜻하는 4 요소 튜플을 사용할 수도 있습니다.
튜플은 왼쪽 괄호 (
로 시작해서
0개 혹은 쉼표로 분리된 여러 개의 파이썬 표현식을 포함하며,
오른쪽 괄호 )
로 끝납니다. 요소가 하나 있는 튜플을 나타내려면
아래 예처럼 요소 다음에 쉼표를 적어주어야 합니다:
()
(1,)
(1, "#555")
(32, 24, 200, 100)
리스트는 어려 개의 아이템을 가지고 있는 컨테이너를
나타낼 때 사용됩니다. 리스트는 [
로 시작하며 쉼표로 분리된
표현식 목록을 포함하며, ]
로 끝이 납니다. 아래는 리스트의 예입니다:
[ ]
[ 1 ]
[ 1, 2 ]
[ 1, 2, 3 ]
파이썬 표현식은 변수를 사용할 수 있습니다. 변수에는 define 문이나 python 문을 사용하여 값을 저장할 수 있습니다. 변수는 문자나 밑줄(_)로 시작하며, 0개 혹은 그 이상의 문자나 숫자, 밑줄로 이루어져 있습니다. 아래는 변수의 예입니다:
name
love_love_points
trebuchet2_range
_로 시작하는 변수는 렌파이를 구동할 때 사용되는 것들이니 가능하면 _로 시작하는 변수 이름은 사용하지 말기 바랍니다.
파이썬 모듈과 객체에는 필드라는 것이 있습니다. 표현식(대부분의 경우 변수) 다음에 점을 찍고 필드 이름을 적으면 필드에 접근할 수 있습니다:
config.screen_width
위의 예는 (config) 변수의 (screen_width) 필드에 접근한다는 것을 의미합니다.
파이썬 표현식으로 변수를 반환하는 함수를 호출할 수 있습니다. 표현식 (보통은 변수)로 시작하며, 그 다음엔 왼쪽 괄호와 쉼표로 분리된 인수 리스트, 그리고 오른쪽 괄호가 나옵니다. 인수 목록은 파이썬 표현식인 위치인수로 시작합니다. 이 위치인수 다음에는 키워드 인수가 등장하는데, 이 키워드 인수는 인수 이름, 등호 기호, 표현식으로 이루어져있습니다.
Character("아이린", type=adv, color="#0f0")
위의 예제는 Character 함수를 호출합니다. 위치인수는
문자열 "아이린" 하나 입니다. 키워드 인수로는
adv
값이 지정된 type
과 "#0f0" 문자열값이 지정된
color
가 있습니다.
생성자는 새 객체를 반환하는 함수 종류이며, 이와 마찬가지 형식으로 호출할 수 있습니다.
이 문서를 읽다보면 다음과 같은 함수 표시를 발견하게 될 것입니다.:
Sample
(name, delay, position=(0, 0), **properties)¶렌파이에는 존재하지 않는 샘플 함수. 오직 이 페이지에서만 사용된다.
이 함수는:
**properties로 끝나는 함수는 스타일 속성 을 추가 키워드 인수로 받습니다. *args 라는 항목은 임의의 위치인수를, **kwargs 는 문서에서 설명한 키워드 인수를 받을 수 있습니다.
파이썬이라는 프로그래밍 언어는 이 매뉴얼에서 설명한 것보다도 더 쉽고 쓰임새도 많습니다. 파이썬을 좀 더 자세히 배우고 싶다면 python.org 에서 튜토리얼을 읽어보세요. 렌파이로 작업할 때에 파이썬에 대한 심도 있는 지식이 필요한 건 아니지만 파이썬 명령문과 표현식에 대한 기초를 배우면 도움이 많이 됩니다.