언어 기초
Ren'Py 스크립트의 구조
Ren'Py 언어를 설명하기 전에 먼저 Ren'Py 스크립트의 구조를 설명해야 합니다. 이는 파일이 줄로 이루어진 블록으로 나누어지는 방법과 이러한 줄이 명령을 이루는 요소로 어떻게 나누어지는지를 포함합니다.
파일들
Ren'Py 게임의 스크립트는 .rpy 확장자로 끝나는 게임 디렉터리 아래에서 찾은 모든 파일로 이루어집니다. Ren'Py는 이러한 파일 각각을 (경로의 유니코드 순서로) 고려하고 파일 내용을 스크립트로 사용합니다.
일반적으로 여러 파일로 나눠진 스크립트와 하나의 큰 파일로 이루어진 스크립트 간에 차이가 없습니다. 파일 간에 제어는 다른 파일의 레이블로 점프하거나 호출함으로써 전달될 수 있습니다. 이로 인해 스크립트를 파일로 나누는 것은 개인적인 스타일 문제입니다. 어떤 게임 제작자들은 작은 파일 (이벤트 당 하나 또는 하루 당 하나)을 선호하고, 다른 사람들은 하나의 큰 스크립트를 선호합니다.
로딩 시간을 단축하기 위해 Ren'Py는 시작할 때 .rpy 파일을 .rpyc 파일로 컴파일합니다. .rpy 파일이 변경되면 Ren'Py가 시작될 때 .rpyc 파일이 업데이트됩니다. 그러나 .rpy 파일이 삭제되고 해당하는 .rpyc 파일이 삭제되지 않으면 문제가 발생할 수 있습니다.
파일 이름은 문자나 숫자로 시작해야 하며 "00"으로 시작해서는 안 되며, Ren'Py는 해당 파일을 자체 목적으로 사용합니다.
베이스 디렉토리
베이스 디렉토리는 게임과 함께 배포되는 모든 파일을 포함하는 디렉토리입니다. (게임과 함께 배포되지 않은 일부 파일도 포함될 수 있습니다.) README 파일과 같은 것들은 베이스 디렉토리에 배치되어 배포됩니다.
베이스 디렉토리는 Ren'Py 디렉토리 아래에 생성되며 게임의 이름을 가지고 있습니다. 예를 들어, Ren'Py 디렉토리의 이름이 renpy-6.11.2이고 게임의 이름이 "HelloWorld"이면 베이스 디렉토리는 renpy-6.11.2/HelloWorld가 될 것입니다.
게임 디렉토리
게임 디렉토리는 거의 항상 베이스 디렉토리 아래의 "game"이라는 디렉토리입니다. 예를 들어, 베이스 디렉토리가 renpy-6.11.2/HelloWorld라면 게임 디렉토리는 renpy-6.11.2/HelloWorld/game이 될 것입니다.
그러나 Ren'Py는 다음과 같은 순서로 디렉토리를 검색합니다:
- 접미사 없는 실행 파일의 이름. 예를 들어 실행 파일의 이름이 moonlight.exe이면 Ren'Py는 베이스 디렉토리 아래에 moonlight라는 디렉토리를 찾습니다.
- 접미사가 제거된 접두사로 된 실행 파일의 이름. 예를 들어 실행 파일이 moonlight_en.exe이면 Ren'Py는 en이라는 디렉토리를 찾습니다.
- "game", "data", "launcher" 디렉토리, 이 순서대로.
그러나 런처는 "game" 및 "data" 디렉토리만 제대로 인식합니다.
게임 디렉토리에는 게임에서 사용하는 모든 파일이 포함되어 있습니다. 이것은 모든 하위 디렉토리를 포함하여 .rpy 및 .rpyc 파일이 검색되고 이 파일들이 결합되어 게임 스크립트를 형성합니다. 또한 .rpa 아카이브 파일이 검색되어 게임에서 자동으로 사용됩니다. 마지막으로 게임이 파일을 로드할 때, 그것은 게임 디렉토리를 기준으로 로드됩니다. (그러나 config.searchpath가 이를 변경할 수 있음에 유의하세요.)
주석
Ren'Py 스크립트 파일에는 주석을 포함할 수 있습니다. 주석은 해시 기호 ('#')로 시작하여 주석을 포함하는 줄의 끝에 이르게 됩니다. 단, 주석은 문자열의 일부일 수 없습니다.
# 이것은 주석입니다.
show black # 이것 또한 주석입니다.
"# 이것은 주석이 아닙니다. 왜냐하면 문자열의 일부이기 때문입니다."
Ren'Py는 주석을 무시하므로 주석이 있더라도 스크립트는 주석이 없는 것처럼 처리됩니다.
논리적인 줄
Ren'Py 스크립트 파일은 논리적인 줄로 나뉩니다. 논리적인 줄은 항상 파일의 시작에서 시작됩니다. 논리적인 줄은 다음과 같은 경우를 제외하고 줄의 끝에서 끝납니다:
- 줄의 마지막 문자가 역슬래시 ('')인 경우.
- 줄에 일치하는 닫는 괄호 문자 (')', '}', 또는 ']')가 없는 열린 괄호 문자 ('(', '{', 또는 '[')가 포함된 경우.
- 문자열 중에 줄이 끝나는 경우.
한 번 논리적인 줄이 끝나면 다음 논리적인 줄은 다음 줄의 시작에서 시작됩니다.
Ren'Py 언어의 대부분의 명령문은 단일 논리적인 줄로 이루어져 있지만, 일부 명령문은 여러 줄로 이루어져 있습니다.
"This is one logical line"
"Since this line contains a string, it continues
even when the line ends."
$ a = [ "Because of parenthesis, this line also",
"spans more than one line." ]
빈 논리적인 줄은 무시됩니다.
들여쓰기와 블록
들여쓰기는 각 논리적인 줄의 시작 부분에 있는 공간을 나타냅니다. Ren'Py에서 들여쓰기는 반드시 공백으로 이루어져야 합니다.
들여쓰기는 명령문을 블록으로 그룹화하는 데 사용됩니다. 블록은 라인의 그룹이자 종종 명령문의 그룹입니다. 파일을 블록으로 나누는 규칙은 다음과 같습니다:
- 파일의 시작에서 블록이 시작됩니다.
- 논리적인 줄이 이전 논리적인 줄보다 들여쓰기가 많이 되면 새로운 블록이 시작됩니다.
- 블록 내의 모든 논리적인 줄은 동일한 들여쓰기를 가져야 합니다.
- 블록 내의 라인이 블록의 라인보다 들여쓰기가 적은 논리적인 줄이 나타나면 블록이 끝납니다.
들여쓰기는 Ren'Py에게 매우 중요하며 잘못된 경우 구문 또는 논리적인 오류가 발생할 수 있습니다. 동시에 들여쓰기를 사용하여 블록 구조를 나타내면 스크립트 텍스트를 압도하지 않고도 해당 구조를 나타낼 수 있는 방법을 제공합니다.
"This statement, and the if statement that follows, is part of a block."
if True:
"But this statement is part of a new block."
"This is also part of that new block."
"This is part of the first block, again."
명령문의 요소
Ren'Py 명령문은 몇 가지 기본 부분으로 이루어져 있습니다.
- 키워드 (Keyword): 게임 스크립트에 명시적으로 나타나야 하는 단어입니다. 키워드는 명령문과 속성을 소개하는 데 사용됩니다.
- 이름 (Name): 밑줄 (_) 또는 문자로 시작하며, 뒤에는 문자, 숫자, 밑줄이 올 수 있는 이름입니다. 사용자 정의 변수 및 Ren'Py 내부에서 사용하는 변수 등이 여기에 해당합니다.
- 이미지 이름 (Image Name): 이미지 태그와 이미지 속성으로 구성된 하나 이상의 구성 요소로 이루어진 것입니다.
- 문자열 (String): 인용 부호 (", ', 또는 `)로 시작하여 동일한 인용 부호로 끝나는 문자열입니다. 역슬래시 ()는 인용 부호, 특수 문자 (%는 %로 작성), 대괄호 ([는 [로 작성), 중괄호 ({는 {로 작성)를 이스케이프하는 데 사용됩니다. 또한 역슬래시를 사용하여 새 줄을 포함시킬 수 있습니다.
- 간단한 표현식 (Simple Expression): Ren'Py 스크립트의 일부 부분에서 Python 표현식을 포함하기 위해 사용됩니다. 이름, 문자열, 숫자 또는 괄호 안의 Python 표현식으로 시작합니다.
- at 리스트 (At List): 쉼표로 구분된 간단한 표현식의 목록입니다.
- Python 표현식 (Python Expression): 콜론을 포함할 수 없는 임의의 Python 표현식입니다. if 및 while 문에서 조건을 나타내는 데 사용됩니다.
일반 명령문 구문
대부분의 Ren'Py 명령문은 일반적인 구문을 공유합니다. say 문을 제외한 모든 명령문은 명령문을 소개하는 키워드로 시작하며 이 키워드 다음에는 필요에 따라 하나의 매개변수가 옵니다.
매개변수 다음에는 하나 이상의 속성이 옵니다. 각 속성은 한 번만 제공되어야 하며 각 속성은 키워드로 시작합니다. 대부분의 속성
의 경우 속성 이름 다음에는 위에서 설명한 구문 요소 중 하나가 따릅니다.
명령문이 블록을 사용하는 경우 줄은 콜론 (:)으로 끝납니다. 그렇지 않으면 줄은 그냥 끝납니다.
Python 표현식 구문
참고: 지금은 이 섹션을 자세히 읽을 필요가 없을 수 있습니다. 대신 앞으로 나아가서 예제를 이해하거나 실제로 어떻게 작동하는지 알고 싶을 때 돌아와 이 내용을 검토할 수 있습니다.
Ren'Py의 많은 부분이 Python 표현식을 사용합니다. 예를 들어, 새로운 캐릭터를 정의하는 것은 Character() 함수를 호출하는 것을 포함합니다. Python 표현식은 매우 강력하지만 Ren'Py 게임을 작성하는 데 필요한 기능의 일부에 그 강력함을 모두 사용하는 것은 필요하지 않습니다.
Python 표현식에 관한 개략적인 내용은 다음과 같습니다.
- 정수 (Integer): 소수점이 없는 숫자입니다. 3과 42는 정수입니다.
- 플로트 (Float): 소수점을 포함하는 숫자입니다. .5, 7., 9.0은 모두 플로트입니다.
- 문자열 (String): Python 문자열은 " 또는 '로 시작하여 동일한 문자로 끝나는 것입니다. \는 끝 문자를 이스케이프하거나 \n과 같은 특수 문자를 소개하는 데 사용됩니다. Ren'Py 문자열과 달리 Python 문자열은 여러 줄로 확장될 수 없습니다.
- True, False, None: 세 가지 특수 값입니다. True는 참 값을, False는 거짓 값을 나타내며, None은 값이 없음을 나타냅니다.
- 튜플 (Tuple): 항목 수가 중요한 컨테이너를 나타내기 위해 사용됩니다. 예를 들어, 너비와 높이를 나타내기 위해 2-튜플 (쌍이라고도 함)을 사용하거나, 4-튜플 (x, y, 너비, 높이)을 사용하여 사각형을 나타낼 수 있습니다.
- 리스트 (List): 항목 수가 가변적인 컨테이너를 나타내기 위해 사용됩니다. 리스트는 [로 시작하고 쉼표로 구분된 표현식 목록으로 구성되며 ]로 끝납니다.
- 변수 (Variable): Python 표현식은 define 문이나 Python 문을 사용하여 정의된 값이 저장된 변수를 사용할 수 있습니다. 변수는 문자 또는 밑줄로 시작하고 그 뒤에 문자, 숫자 또는 밑줄이 올 수 있습니다. 밑줄로 시작하는 변수는 Ren'Py의 사용을 위해 예약되어 있으며 제작자에 의해 사용되어서는 안 됩니다.
- 필드 액세스 (Field Access): Python 모듈 및 객체에는 필드가 있으며, 표현식 (일반적으로 변수) 뒤에 점과 필드 이름을 따라가면 액세스할 수 있습니다.
- 호출 (Call): Python 표현식은 값을 반환하는 함수를 호출할 수 있습니다. 표현식 (일반적으로 변수)로 시작하여 왼쪽 괄호, 쉼표로 구분된 인수 목록 및 오른쪽 괄호로 끝납니다. 이 목록은 위치 인수로 시작되며, 키워드 인수가 뒤따릅니다. 호출하는 함수에 따라 특정한 매개변수가 필요할 수 있습니다.
Ren'Py 문서를 읽을 때 "Sample(name, delay, position=(0, 0), **properties)"와 같은 함수 시그니처를 볼 수 있습니다. 이 함수는 Ren'Py에 실제로 존재하지 않지만 문서에서만 사용되는 샘플 함수입니다.
Python에 대한 참고 사항
이 문서에서는 Python에 대해 자세히 읽을 필요가 없을 것으로 생각됩니다. 그러나 Python을 더 자세히 배우고 싶다면 python.org에서 제공하는 Python 튜토리얼을 시작하는 것이 좋습니다. Ren'Py와 함께 깊은 지식이 필요한 것은 아니지만 Python 문장과 표현식의 기본은 종종 도움이 됩니다.
'Programming > Renpy' 카테고리의 다른 글
렌파이 이미지 갤러리 (1) | 2024.01.25 |
---|---|
렌파이 메뉴 : renpy docs 한국어 번역 (1) | 2024.01.24 |
렌파이 대화 - renpy 한국어 번역 (1) | 2024.01.24 |
렌파이 레이블 및 제어 흐름 : renpy 한국어 번역 (0) | 2024.01.22 |