렌파이는 파이썬 프로그래밍 언어로 만들어졌으며 렌파이 스크립트에서 파이썬 코드를 사용할 수 있도록 파이썬 사용을 지원합니다. 파이썬 코드는 분기를 설정하는 것에서부터 새로운 디스플레이어블 만들 때 등 여러 곳에서 활용됩니다. 이 장에서는 다양한 파이썬 명령문들을 사용해 렌파이 스크립트에서 파이썬 코드를 직접 사용하는 방법을 다룹니다.
python문은 파이썬 코드 블럭을 받으며 제어 흐름이 해당 명령문에 도달하면 블럭에 포함된 코드들을 실행합니다. 기본 python 문은 매우 간단하게 작성할 수 있습니다.
python:
flag = True
필요하다면 복잡하게 작성할 수도 있습니다.
python:
player_health = max(player_health - damage, 0)
if enemy_vampire:
enemy_health = min(enemy_health + damage, enemy_max_health)
python 문의 작동방식을 변경할 수 있는 수식어로는 두 가지가 있습니다.:
hide
hide 수식어가 있다면 python 문은 이름 없는 영역에서 코드를 실행합니다. 이 이름 없는 영역은 파이썬 블럭이 종료하면 사라집니다.
이를 이용해 파이썬 코드로 저장되지 않는 임시 변수를 사용할 수 있습니다. 그러나 이는 스토어를 직접 접근하는 것이 아닌 스토어 객체의 필드로서 접근해야한다는 의미입니다.
in
in
은 이름을 받습니다. 이 수식어를 사용하면 파이썬 코드는 기본 스토어에서 실행되지 않고 in으로 이름을 지정한 스토어에서 실행될 것입니다.
가장 기본적인 상황은 기본 스토어에서 실행되는 한 줄짜리 파이썬 코드일 것입니다. 예를 들어 한 줄 파이썬 코드는 분기를 초기화하거나 변경할 때 사용할 수 있습니다. 한 줄 파이썬 코드를 더 편하게 사용할 수 있도록, 렌파이에서는 한 줄 파이썬 명령문을 지원합니다.
한 줄 파이썬 명령문은 제일 먼저 달러 기호($)를 적은 다음 해당 기호가 적힌 하나의 행에 파이썬 코드를 적어 사용합니다. 한 줄 파이썬 명령문의 예제입니다.:
# 분기를 설정한다.
$ flag = True
# 변수를 초기화한다.
$ romance_points = 0
# 변수 값을 증가시킨다.
$ romance_points += 1
# 렌파이 기능을 사용하는 함수를 호출한다.
$ renpy.movie_cutscene("opening.ogv")
한 줄 파이썬은 언제나 기본 스토어에서 실행됩니다.
init python
명령문은 게임을 불러오기 전 초기화 단계에 파이썬 코드를
실행합니다. 이 블럭에 입력한 코드는 무엇보다 클래스와 함수를 정의하거나,
스타일을 초기화하거나, 변수나 지속 데이터를 설정할 때
사용할 수 있습니다.
init python:
def auto_voice_function(ident):
return "voice/" + ident + ".ogg"
config.auto_voice = auto_voice_function
if persistent.endings is None:
persistent.endings = set()
init 1 python:
# 배드 엔딩은 항상 잠금해제된다.
persistent.endings.add("bad_ending")
init
와 python
사이에는 우선순위를 정하는 숫자를
입력할 수 있습니다. 숫자를 입력하지 않으면 0을 사용합니다. init문은 우선순위가
작은 것에부터 높은 순서대로 실행합니다. 우선순위가 동일한 init문이 있다면
유니코드 순서대로 정렬한 파일이름 순서로 실행되며, 하나의 파일 안에서는 위에서 아래 순서대로 실행됩니다.
렌파이 엔진이 사용하는 우선순위와 충돌하지 않도록 제작자는 우선순위 범위를 -999에서 999 범위 내에서 사용해야 합니다. 0보다 작은 우선순위의 init 블럭은 보통 라이브러리가 사용하거나 테마를 설정할 때 사용합니다. 일반적인 init 코드에는 우선순위를 0 이상으로 지정해야 합니다.
init python 문은 hide
또는 in
절을 받습니다.
init python 블럭에서 값이 설정된 변수는 참조하는 객체가 바뀌지 않는 이상, 저장되거나 불려오거나 롤백에 관여하지 않습니다.
define 문은 초기화 단계에서 변수 하나에 값을 설정합니다. 예를 들면 다음 명령문은:
define e = Character("아이린")
아래 명령문과 동일하게 작동합니다.
init python:
e = Character("아이린")
define문으로 변수 이름 뒤에 점을 찍고 스토어 이름을 적어 변수를 저장할 스토어를 추가로 지정할 수도 있습니다(스토어에 대한 내용은 이 페이지 하단을 참조하세요).
define character.e = Character("아이린")
define문의 장점은 값이 변수에 배정되는 행 번호와 파일 이름을 기록해 런처의 스크립트 살펴보기 기능에서 사용할 수 있도록 한다는 점입니다.
default문은 게임이 시작하거나 새 게임을 불러온 이후에 변수가 정의되지 않은 경우에 변수에 값을 설정합니다. 예를 들면,:
default points = 0
points
변수가 게임 시작 단계에 정의되지 않았다면, 이 명령문은
다음과 같은 기능을 합니다.:
label start:
$ points = 0
points
변수가 게임을 불러온 이후에 정의되지 않았따면, 이 명령문은 다음과 같은 기능을 합니다.
label after_load:
$ points = 0
default문으로 변수 이름 뒤에 점을 찍고 스토어 이름을 적어 변수를 저장할 스토어를 추가로 지정할 수도 있습니다(스토어에 대한 내용은 이 페이지 하단을 참조하세요).
default schedule.day = 0
렌파이가 파이썬 변수를 저장하는 기본 장소의 이름을 스토어라고 합니다. 중요한 점은 스토어에서 사용하는 이름이 서로 충돌하지 않게 이름을 짓는 일입니다.
define문은 이미 캐릭터를 정의한 변수에조차도 값을 배정합니다. 이는 이름이 동일한 변수에 캐릭터와 분기를 동시에 설정할 수 없다는 것을 의미합니다.
아래처럼 잘못 짜인 코드는 작동하지 않을 것입니다.:
define e = Character("아이린")
label start:
$ e = 0
e "Hello, world."
$ e += 1
e "1점을 얻었습니다!"
e 변수가 캐릭터와 분기를 동시에 설정하고 있기 때문입니다. 스토어에 저장되어 있는 다른 것들은 일반적으로 트랜지션과 트랜스폼입니다.
언더바(_)로 시작하는 이름들은 렌파이 내부에서 사용하는 이름입니다. 예비 할당된 이름 목록 을 참고하세요.
스토어에 이름을 지정하는 것으로 파이썬 코드를 모듈로 정리할 수 있습니다. 모듈에 코드를 입력하면 이름이 서로 충돌할 가능성을 최소화 할 수 있습니다.
이렇게 지명한 스토어는 python
또는 init python
에
in
절을 붙여 접근할 수 있으며, 코드는 스토어 내부에 접근한 상태로
실행할 수 있습니다. 각각의 스토어는 파이썬 모듈 하나와 일치합니다. 기본 스토어는
store
이며 지명 스토어는 store
.`이름` 으로 접근할 수 있습니다. 이런
파이썬 모듈은 파이썬 import 문을 사용해 끌어올 수 있으며, 모듈에
있는 이름들은 파이썬의 from 문으로 끌어올 수
있습니다.
다음은 예제입니다.:
init python in mystore:
serial_number = 0
def serial():
global serial_number
serial_number += 1
return serial_number
init python:
import store.mystore as mystore
label start:
$ serial = mystore.serial()
지명 스토어는 기본 스토어와 동일한 방식으로 저장하기, 불러오기, 롤백 과정에 관여합니다. define문은 지명 스토어에 이름을 정의할 때 사용할 수 있습니다.
렌파이는 순수 파이썬 모듈과 패키지를 임포트할 수 있습니다. (게임에서 사용하기 위해 작성한 코드와 함께) 퍼스트 파티 모듈과 패키지는 직접 게임 디렉토리에 배치할 수 있습니다. 서드 파티 패키지는 game/python-packages 경로에 배치할 수 있습니다.
예를 들어 요청한 패키지를 설치하기 위해서는 게임의 기본 경로로 이동해 다음 커맨드를 실행할 수 있습니다.
pip install --target game/python-packages requests
두 가지 경우 모두에 모듈과 패키지는 init python 블럭에서 임포트할 수 있습니다.:
init python:
import requests
경고
.rpy 파일 내부에 정의된 파이썬 코드는 롤백이 작동할 수 있도록 변환됩니다. .py 파일에서 임포트한 파이썬 코드는 불가능합니다. 그 결과 해당 파이썬 코드에서 생성된 객체는 롤백이 작동하지 않으며 한 번 생성된 이후에는 변경되지 않을 것입니다.