텍스트

Ren'Py는 텍스트를 표시하는 여러 방법을 제공합니다. say 문과 menu 문은 주로 사용자에게 텍스트를 표시하는 데 사용합니다. 사용자 인터페이스에도 텍스트가 자주 포함되며, 이때는 스크린 언어의 text, textbutton, label 문을 사용해 표시합니다. 이러한 기능을 비롯한 여러 기능은 Text() 디스플레이어블을 만들고 화면에 표시합니다.

Text 디스플레이어블은 사용자에게 텍스트를 표시하는 과정을 관리합니다. 텍스트 디스플레이어블은 다음 순서로 작업을 수행합니다.

  1. 텍스트를 번역합니다.

  2. 텍스트에 데이터를 보간합니다.

  3. 스타일과 텍스트 태그로 텍스트의 서식을 지정합니다.

  4. 서식이 지정된 텍스트를 배치합니다.

  5. 텍스트를 화면에 그립니다.

이 장에서는 Ren'Py에서 텍스트가 표시되는 과정을 설명합니다.

이스케이프 문자

Ren'Py가 텍스트를 표시하는 방식을 제어하는 특수 문자는 세 가지입니다. 작성한 글을 엔진이 의도와 다르게 해석하지 않도록 제작자는 이 문자들을 알아두어야 합니다.

(백슬래시)

백슬래시는 Ren'Py나 Python 문자열을 작성할 때 문자를 이스케이프하는 데 사용합니다. 자주 사용하는 이스케이프 코드는 다음과 같습니다.

\" (백슬래시-큰따옴표)

큰따옴표로 둘러싼 문자열에 큰따옴표를 넣습니다.

\' (백슬래시-작은따옴표)

작은따옴표로 둘러싼 문자열에 작은따옴표를 넣습니다.

\ (백슬래시-공백)

Ren'Py 문자열에 공백을 추가합니다. 기본적으로 Ren'Py 스크립트의 텍스트에서는 연속된 공백 문자를 하나의 공백으로 합칩니다.

\n (백슬래시-n)

텍스트에 줄바꿈 문자를 넣어 새 줄을 시작합니다.

\\ (백슬래시-백슬래시)

텍스트에 백슬래시 문자를 넣습니다.

\% (백슬래시-퍼센트)

텍스트에 보호된 퍼센트 문자를 넣습니다. %%로 작성할 수도 있습니다. 어느 방법을 사용하든 최종적으로는 % 문자 하나가 표시됩니다.

[ (여는 대괄호)

여는 대괄호는 텍스트에 값을 보간하기 시작하는 문자입니다. 텍스트에 여는 대괄호 하나를 넣으려면 [[처럼 두 번 작성합니다.

{ (여는 중괄호)

여는 중괄호는 텍스트 태그를 시작하는 문자입니다. 텍스트에 여는 중괄호를 넣으려면 {{처럼 두 번 작성합니다.

【 (여는 검정 렌즈형 괄호)

여는 검정 렌즈형 괄호는 루비/후리가나 텍스트를 시작하는 문자입니다. 텍스트에 이 괄호를 넣으려면 【【처럼 두 번 작성합니다.

데이터 보간

Ren'Py는 텍스트 문자열을 표시하기 전에 데이터를 보간할 수 있습니다. 예를 들어 플레이어의 이름을 playername 변수에 저장했다면 다음과 같이 대사를 작성할 수 있습니다.

g "네코미미 학원에 온 걸 환영해요, [playername]!"

Ren'Py는 다음 순서로 변수를 찾습니다.

  • 스크린에서 사용하는 경우, 스크린 지역 변수.

  • interpolate 네임스페이스의 변수.

  • 전역 네임스페이스의 변수.

Ren'Py는 단순한 변수뿐 아니라 유효한 Python 표현식도 보간할 수 있습니다. 따라서 다음과 같이 작성할 수 있습니다.

g "제 이름은 [player.names[0]]입니다."

숫자를 표시할 때 서식을 지정할 수 있습니다. 다음 예제는 부동 소수점 수를 소수점 아래 두 자리까지 표시합니다.

g "당신을 [100.0 * points / max_points:.2]퍼센트만큼 좋아해요!"

Ren'Py의 문자열 서식은 PEP 3101의 문자열 서식 구문을 바탕으로 합니다. {는 텍스트 태그에 사용하므로 Ren'Py에서는 [로 문자열 보간을 시작합니다.

Ren'Py는 Python이 지원하는 !s와 !r 변환 플래그 외에도 여러 플래그를 지원합니다. !q 변환 플래그는 텍스트 태그를 올바르게 이스케이프하여 문자열을 표시할 때 원치 않는 서식 구문이 적용되지 않도록 합니다. 예를 들면 다음과 같습니다.

g "[playername!q], 날 속일 생각은 하지 마요."

!t 플래그는 보간한 문자열을 번역합니다.

if points > 5:
    $ mood = _("반가워요")
else:
    $ mood = _("짜증이 나요")

g "당신을 보니 [mood!t]."

!i 플래그는 보간한 문자열에 보간을 한 번 더 수행합니다.

define earned_points_info = _("[points]{image=points.png}점을 획득")
g "당신이 [earned_points_info!ti]한 걸 보니 기뻐요."

내부에 치환 구문이 들어 있는 텍스트를 치환할 때 사용합니다. 스크린 언어에서 유용한 경우가 많습니다. 상수 텍스트를 참조하세요.

!f 플래그는 config.say_menu_text_filter가 None이 아니면 결과 문자열을 이 함수에 전달합니다. 이를 통해 보간한 텍스트에 필터를 적용할 수 있습니다.

!u 플래그는 텍스트를 모두 대문자로, !l 플래그는 모두 소문자로 바꿉니다. !c 플래그는 첫 번째 문자에만 적용되어 이를 대문자로 바꿉니다. 이 플래그들은 조합할 수 있습니다. 예를 들어 !cl을 사용하면 첫 번째 문자는 대문자로, 나머지는 소문자로 바꿉니다.

다음 사항에 유의하세요.

  • 플래그를 지정하는 순서는 결과에 영향을 주지 않습니다. !cl과 !lc는 같은 동작을 수행합니다.

  • 추가 느낌표는 무시되며 앞의 규칙도 바뀌지 않습니다. !l!c는 !c!l이나 !cl과 같은 동작을 수행합니다.

변환은 다음 순서로 수행합니다.

  1. r/s (repr 또는 str)

  2. t (번역)

  3. i (재귀 보간)

  4. q (이스케이프)

  5. u (대문자 변환)

  6. l (소문자 변환)

  7. c (첫 글자 대문자 변환)

인수가 실제 데이터로 치환된 결과 문자열을 얻으려면 문자열을 renpy.substitute에 전달하면 됩니다.

스타일과 텍스트 태그

Ren'Py의 텍스트는 두 가지 방법으로 스타일 정보를 얻습니다. 첫 번째는 텍스트 블록 전체에 적용되는 스타일입니다. 자세한 내용은 스타일 시스템, 특히 텍스트 스타일 속성 절을 참조하세요.

두 번째는 텍스트 태그입니다. 텍스트 태그는 텍스트 블록의 일부나 프로그램에 있는 텍스트 블록 중 소수에만 서식을 지정할 때 적합합니다. 모든 줄에 같은 텍스트 태그를 적용하고 있다면 스타일 사용을 고려하세요.

텍스트 태그에는 두 종류가 있습니다. 자체적으로 닫히는 태그도 있고 닫는 태그를 사용할 수 있는 태그도 있습니다. 닫는 태그는 슬래시(/)로 시작하며, 나중에 연 태그부터 먼저 닫습니다. 각 닫는 태그는 해당 여는 태그와 일치해야 합니다. 그렇지 않으면 Ren'Py가 린트 경고를 표시합니다.

예를 들면 다음과 같습니다.

# This line is correct.
"보통 {b}굵게 {i}굵은 기울임꼴{/i} 굵게{/b} 보통"

# This line is incorrect, and will cause incorrect behavior.
"보통 {b}굵게 {i}굵은 기울임꼴{/b} 기울임꼴{/i} 보통"

모든 텍스트 태그를 직접 닫을 필요는 없습니다. Ren'Py는 텍스트 블록이 끝날 때 열려 있는 태그를 모두 닫습니다. 예를 들면 다음과 같습니다.

"{size=+20}이 글자는 커요!"

일부 텍스트 태그는 인수를 받습니다. 이 경우 태그 이름 뒤에 등호(=)와 인수를 작성합니다. 인수에는 닫는 중괄호(})를 포함할 수 없습니다. 인수의 의미는 텍스트 태그에 따라 다릅니다.

일반 텍스트 태그

모든 텍스트에 적용할 수 있는 태그는 다음과 같습니다.

a

anchor 태그는 여는 태그와 닫는 태그 사이에 하이퍼링크를 만듭니다. 하이퍼링크의 동작은 hyperlink_functions 스타일 속성으로 제어하며, 기본 핸들러는 다음과 같이 동작합니다.

  • 인수가 jump:로 시작하면 나머지 부분을 점프할 레이블로 사용합니다.

  • 인수가 call:로 시작하면 나머지 부분을 호출할 레이블로 사용합니다. 일반적인 경우와 마찬가지로 호출하면 현재 Ren'Py 문이 끝납니다.

  • 인수가 call_in_new_context:로 시작하면 나머지 부분을 새 컨텍스트에서 호출할 레이블로 사용합니다(renpy.call_in_new_context() 사용).

  • 인수가 show:로 시작하면 나머지 부분을 표시할 스크린으로 사용합니다.

  • 인수가 showmenu:로 시작하면 나머지 부분을 표시할 게임 메뉴 스크린으로 사용합니다.

  • 그 밖의 경우 인수는 시스템 웹 브라우저에서 열 URL입니다.

인수에 프로토콜 부분이 없으면 앞에 config.hyperlink_protocol을 붙입니다. config.hyperlink_protocol을 "jump"로 설정하면 {a=label}과 {a=jump:label}은 같은 의미가 됩니다. 제작자는 config.hyperlink_handlers로 새 프로토콜을 정의할 수 있습니다.

label test:

    e "{a=https://renpy.org}Ren'Py 홈페이지{/a}에 가 보는 건 어때요?"

    e "아니면 {a=jump:more_text}여기서 더 알아보세요{/a}."

    return

label more_text:

    e "아칸소주 핫스프링스에는 함께 사진을 찍을 수 있는 알 카포네 동상이 있어요."

    e "추가 정보는 맞지만, 원하던 정보는 아니죠?"

    return
alpha

alpha 텍스트 태그는 여는 태그와 닫는 태그 사이의 텍스트를 지정한 불투명도로 렌더링합니다. 불투명도는 0.0에서 1.0 사이의 값이어야 하며, 각각 완전히 투명한 상태와 완전히 불투명한 상태를 뜻합니다. 값 앞에 +나 -를 붙이면 불투명도를 새 값으로 바꾸는 대신 지정한 양만큼 조정합니다. 값 앞에 *를 붙이면 현재 불투명도에 해당 값을 곱합니다.

"{alpha=0.1}이 글자는 거의 보이지 않아요!{/alpha}"
"{alpha=-0.1}이 글자는 기본값보다 10퍼센트 더 투명해요.{/alpha}"
"{alpha=*0.5}이 글자의 불투명도는 기본값의 절반이에요.{/alpha}"
alt

alt 태그는 텍스트를 렌더링하지 않지만, 텍스트 음성 변환 시스템에서는 읽을 수 있게 합니다.

g "만나서 반가워요! {image=heart.png}{alt}하트{/alt}"

alt 캐릭터도 참조하세요.

art

alternate ruby top 태그는 여는 태그와 닫는 태그 사이의 텍스트를 대체 루비 윗글자로 지정합니다. 자세한 내용은 루비 텍스트 절을 참조하세요.

b

bold 태그는 여는 태그와 닫는 태그 사이의 텍스트를 굵은 글꼴로 렌더링합니다.

"{b}굵은 글씨{/b}의 예입니다."
color

color 텍스트 태그는 여는 태그와 닫는 태그 사이의 텍스트를 지정한 색상으로 렌더링합니다. 색상은 #rgb, #rgba, #rrggbb 또는 #rrggbbaa 형식이어야 합니다.

"{color=#f00}빨강{/color}, {color=#00ff00}초록{/color}, {color=#0000ffff}파랑{/color}"
cps

characters per second 태그는 여는 태그와 닫는 태그 사이의 텍스트 표시 속도를 설정합니다. 인수가 별표로 시작하면 현재 텍스트 속도에 곱할 값으로 사용합니다. 그렇지 않으면 초당 표시할 문자 수로 사용합니다.

"{cps=20}일정한 속도{/cps} {cps=*2}두 배 속도{/cps}
feature

feature 태그는 OpenType 레이아웃 기능을 켜거나 끕니다. 기능 이름은 콜론으로 구분하여 태그에 포함합니다. 인수는 기능을 켜려면 1, 끄려면 0이어야 합니다. 예를 들어 합자를 끄려면 다음과 같이 작성합니다.

"오늘은 {feature:liga=0}Traffic{/feature}(교통량)이 적네요."

레이아웃 기능 목록은 여기에서 볼 수 있습니다.

font

font 태그는 여는 태그와 닫는 태그 사이의 텍스트를 지정한 글꼴로 렌더링합니다. 인수는 사용할 글꼴의 파일명입니다.

"{font=mikachan.ttf}mikachan 글꼴{/font}을 써 보세요."
i

italics 태그는 여는 태그와 닫는 태그 사이의 텍스트를 기울임꼴로 렌더링합니다.

"{i}피사의 사탑{/i}에 가 보세요."
image

image 태그는 텍스트에 이미지를 삽입하는 자체 닫힘 태그입니다. 이미지 높이는 텍스트 한 줄의 높이여야 합니다. 인수는 이미지 파일명이나 image 문으로 정의한 이미지의 이름이어야 합니다.

g "만나서 반가워요! {image=heart.png}{alt}하트{/alt}"
k

kerning 태그는 여는 태그와 닫는 태그 사이 문자의 커닝을 조정합니다. 각 커닝 쌍에 추가할 커닝의 픽셀 수를 부동 소수점 인수로 받습니다. 커닝을 줄이려면 음수를 사용할 수 있습니다.

"{k=-.5}음수{/k} 보통 {k=.5}양수{/k}"
noalt

noalt 태그는 텍스트 음성 변환 시스템이 해당 텍스트를 읽지 않도록 합니다. 접근성용 텍스트와 시각적으로 표시할 텍스트를 제공하기 위해 alt 태그와 함께 사용하는 경우가 많습니다.

g "만나서 반가워요! {noalt}<3{/noalt}{alt}하트{/alt}"
outlinecolor

outline 텍스트 태그는 그림자를 포함한 모든 외곽선의 색상을 지정한 색상으로 바꿉니다. 색상은 #rgb, #rgba, #rrggbb 또는 #rrggbbaa 형식이어야 합니다. 기존 외곽선만 조정하며 새 외곽선을 추가하지는 않습니다.

"{outlinecolor=#00ff00}초록색{/outlinecolor} 테두리를 넣어 봐요."
plain

plain 태그는 텍스트에 굵게, 기울임꼴, 밑줄, 취소선이 적용되지 않도록 합니다.

"{b}이 글씨는 굵어요. {plain}이건 아니에요.{/plain} 이 글씨는 굵어요.{/b}"
rb

ruby bottom 태그는 여는 태그와 닫는 태그 사이의 텍스트를 루비 아랫글자로 지정합니다. 자세한 내용은 루비 텍스트 절을 참조하세요.

rt

ruby top 태그는 여는 태그와 닫는 태그 사이의 텍스트를 루비 윗글자로 지정합니다. 자세한 내용은 루비 텍스트 절을 참조하세요.

s

strikethrough 태그는 여는 태그와 닫는 태그 사이의 텍스트에 취소선을 긋습니다.

g "{s}당신을 만나니{/s} 좋네요."
shader

shader 태그는 텍스트의 일부에 텍스트 셰이더를 적용합니다. 인수는 적용할 셰이더의 이름입니다.

"이 글자는 {shader=jitter:u__jitter=1.0, 3.0}흔들려요{/shader}."

자세한 내용은 텍스트 셰이더를 참조하세요.

size

size 태그는 여는 태그와 닫는 태그 사이의 텍스트 크기를 바꿉니다. 인수는 정수여야 하며 앞에 +나 -를 붙일 수 있습니다. 정수만 지정하면 높이를 해당 픽셀 수로 설정합니다. 부호가 있으면 해당 양만큼 크기를 늘리거나 줄입니다.

"{size=+10}더 크게{/size} {size=-10}더 작게{/size} {size=24}24 px{/size}."

*로 시작하는 부동 소수점 수를 지정할 수도 있습니다. 이 경우 크기에 해당 수를 곱한 다음 소수점 이하를 버립니다.

"{size=*2}두 배 크기{/size} {size=*0.5}절반 크기.{/size}"
space

space 태그는 텍스트 줄 안에 가로 여백을 삽입하는 자체 닫힘 태그입니다. 추가할 여백의 픽셀 수를 정수 인수로 받습니다.

"공백 앞.{space=30}공백 뒤."
u

underline 태그는 여는 태그와 닫는 태그 사이의 텍스트에 밑줄을 긋습니다.

g "당신을 {u}만나니{/u} 좋네요."
vspace

vspace 태그는 텍스트 줄 사이에 세로 여백을 삽입하는 자체 닫힘 태그입니다. 추가할 여백의 픽셀 수를 정수 인수로 받습니다.

"1행{vspace=30}2행"
#

#으로 시작하는 텍스트 태그는 무시되지만, 번역할 때 문자열을 구분하는 용도로 넣을 수 있습니다.

"새 재생 목록{#playlist}"

대사 텍스트 태그

대사에만 적용되는 텍스트 태그는 다음과 같습니다.

w

wait 태그는 사용자가 클릭해 진행할 때까지 기다리는 자체 닫힘 태그입니다. 인수를 지정하면 숫자로 해석하며 해당 초만큼 지나면 자동으로 기다림을 끝냅니다.

"1행{w} 1행{w=1.0} 1행"
p

paragraph pause 태그는 현재 문단을 끝내고 사용자가 클릭해 진행할 때까지 기다리는 자체 닫힘 태그입니다. 인수를 지정하면 숫자로 해석하며 해당 초만큼 지나면 자동으로 기다림을 끝냅니다.

"1행{p}2행{p=1.0}3행"
nw

no-wait 태그는 현재 대사의 끝까지 표시되면 자동으로 대사를 닫는 자체 닫힘 태그입니다.

g "저 사람들{nw}"
show trebuchet
g "저 사람들{fast} 또 투석기를 갖고 노는 것 같아요."

인수를 지정하면 숫자로 해석하며 해당 초만큼 지나면 자동으로 기다림을 끝냅니다.

g "몇 초 뒤면 떨어지겠어요!{nw=2}"
show g_gone

no-wait 태그는 셀프 보이싱이 끝날 때까지 기다린 뒤 진행합니다.

fast

텍스트 줄에 fast 태그가 있으면 느린 텍스트 표시 모드에서도 그 앞의 모든 텍스트를 즉시 표시합니다. fast 태그는 자체 닫힘 태그입니다.

g "저 사람들{nw}"
show trebuchet
g "저 사람들{fast} 또 투석기를 갖고 노는 것 같아요."

{fast} 태그가 있으면 이전 줄의 음성이 계속 재생됩니다.

done

done 태그 뒤의 텍스트는 표시되지 않습니다. 이 기능은 adjust_spacing이 True일 때 텍스트의 위치가 갑자기 바뀌는 것을 방지하는 데 사용합니다.

done 태그가 있으면 해당 대사를 대사 기록 버퍼에 추가하지 않습니다. nw 태그를 함께 사용할 때는 done 태그 앞에 두어야 합니다.

g "저 사람들{nw}{done} 또 투석기를 갖고 노는 것 같아요."
show trebuchet
g "저 사람들{fast} 또 투석기를 갖고 노는 것 같아요."
clear

clear 텍스트 태그는 NVL 독백 모드에서 단독으로 한 줄에 있을 때만 의미가 있습니다. 텍스트 블록을 끝내지 않으면서 nvl clear 문과 같은 동작을 수행합니다.

"""
1페이지의 첫 번째 블록.

1페이지의 두 번째 블록.

{clear}

2페이지의 첫 번째 블록.

이하 생략.
"""

Python으로 사용자 정의 텍스트 태그를 정의할 수도 있습니다.

스타일 텍스트 태그

Ren'Py는 스타일에 접근하는 텍스트 태그를 지원합니다. 태그 이름이 비어 있는 텍스트 태그가 이에 해당하며, 이 경우 인수를 스타일 이름으로 사용합니다. 예를 들어 {=mystyle} 태그는 mystyle 스타일에 접근합니다.

여는 태그와 해당 닫는 태그 사이의 텍스트에는 다음 속성들이 스타일에 정의된 값으로 설정됩니다.

스타일의 필드가 None이면 상위 텍스트의 값을 사용합니다.

영어 이외의 언어

Ren'Py의 기본 글꼴에는 영어와 여러 언어의 문자가 포함되어 있습니다. 다만 용량 문제로 중국어, 일본어, 한국어 등 일부 언어를 렌더링하는 데 필요한 문자는 포함되어 있지 않습니다. 이 언어들을 지원하려면 먼저 프로젝트에서 사용하는 글꼴을 바꾸어야 합니다.

그런 다음에는 대부분의 언어를 별도 설정 없이 지원합니다. 다만 한국어는 단어 사이에 띄어쓰기를 할 수도 있고 하지 않을 수도 있습니다. Ren'Py는 띄어쓰기가 있는 한국어를 위한 특별한 모드를 제공하며 다음과 같이 설정하여 켤 수 있습니다.

define gui.language = "korean-with-spaces"

gui.rpy에서 기본값인 "unicode"를 이 값으로 바꾸면 됩니다.

일본어에는 여러 줄바꿈 규칙이 있습니다. 먼저 "japanese-normal"을 사용한 뒤, 줄바꿈할 수 있는 위치를 늘리려면 "japanese-loose"로, 줄이려면 "japanese-strict"로 바꾸는 것을 권장합니다.

define gui.language = "japanese-loose"

표의문자 언어에서는 줄바꿈할 수 있는 위치가 매우 많습니다. 정확도는 낮지만 더 빠른 줄바꿈 알고리즘을 사용하려면 다음과 같이 설정합니다.

define gui.language = "greedy"

NVL 모드처럼 많은 양의 텍스트를 표시하는 게임이 아니라면 더 빠른 줄바꿈 알고리즘을 사용할 필요는 없습니다.

renpy.language_tailor() 함수로 줄바꿈 알고리즘을 더 세밀하게 설정할 수 있습니다.

세로쓰기

vertical 스타일 속성을 설정하면 Ren'Py가 텍스트를 세로 방향으로 표시합니다. 글자는 위에서 아래로, 줄은 오른쪽에서 왼쪽으로 배치됩니다.

세로쓰기와 관련된 텍스트 태그는 두 가지입니다.

horiz

세로쓰기 텍스트 안에 가로쓰기 텍스트를 넣습니다.

vert

가로쓰기 텍스트 안에 세로쓰기 텍스트를 넣습니다. 텍스트를 세로 방향으로 회전하지는 않습니다.

참고

글꼴에 세로쓰기 간격 정보가 없으면 Ren'Py는 가로쓰기 정보를 바탕으로 이 정보를 생성하려고 합니다. 이때 간격은 Ren'Py 버전에 따라 달라질 수 있습니다.

루비 텍스트

루비 텍스트는 후리가나 또는 행간 주석이라고도 하며, 문자나 단어 위에 작은 글자를 배치하는 방식입니다. 게임에서 루비 텍스트를 지원하려면 몇 가지 설정이 필요합니다.

먼저 루비 텍스트의 스타일을 설정해야 합니다. 다음과 같이 스타일을 변경해야 합니다.

  1. line_leading 또는 ruby_line_leading 속성으로 루비 텍스트를 표시할 세로 공간을 충분히 확보해야 합니다.

  2. 이름이 있는 새 스타일을 만들어야 합니다. size 등의 스타일 속성을 루비 텍스트에 적합하게 설정해야 합니다.

  3. 루비 텍스트를 기준선 위로 옮기도록 새 스타일의 yoffset을 설정해야 합니다.

  4. 대사와 대사 기록 창 텍스트 모두 텍스트 스타일의 ruby_style 필드를 새로 만든 스타일로 설정해야 합니다.

새 스타일에서는 다음 속성을 설정할 수 있습니다.

속성이 None이면 상위 텍스트의 값을 사용합니다.

예를 들면 다음과 같습니다.

style ruby_style is default:
    size 12
    yoffset -20
    color None # Use the same color as the parent text.
    font None # Use the same font as the parent text.

style say_dialogue:
    ruby_line_leading 12
    ruby_style style.ruby_style

style history_text:
    ruby_line_leading 12
    ruby_style style.ruby_style

이 용도로 스타일을 참조하려면 style.style_name을 사용합니다.

Ren'Py 설정을 마치면 두 가지 방법으로 루비 텍스트를 넣을 수 있습니다.

검정 렌즈형 괄호. 루비 텍스트를 전각 검정 렌즈형 괄호(【】)로 감싸고, 아랫글자와 윗글자 사이를 전각 또는 반각 세로줄(| 또는 |)로 구분해 작성할 수 있습니다. 예를 들면 다음과 같습니다.

e "루비는 후리가나를 표기하는 데 쓸 수 있어요(【東|とう】 【京|きょう】)."

e "번역을 표시하는 데도 쓰여요(【東京|도쿄】)."

세로줄이 있어야만 루비 텍스트로 처리합니다. 여는 검정 렌즈형 괄호는 두 번 써서 이스케이프할 수 있습니다. 이 괄호로 작성한 루비 텍스트에는 다른 텍스트 태그를 넣을 수 없습니다.

{rt} 및 {rb} 텍스트 태그. {rt} 태그는 하나 이상의 문자를 루비 텍스트로 표시하도록 지정합니다. 루비 텍스트 앞에 {rb} 태그로 감싼 텍스트가 있으면 그 텍스트 위에 가운데 정렬합니다. 그렇지 않으면 바로 앞 문자 위에 가운데 정렬합니다.

예를 들면 다음과 같습니다.

e "루비는 후리가나를 표기하는 데 쓸 수 있어요(東{rt}とう{/rt} 京{rt}きょう{/rt})."

e "번역을 표시하는 데도 쓰여요({rb}東京{/rb}{rt}도쿄{/rt})."

루비 텍스트가 텍스트 영역의 경계를 벗어나지 않도록 하는 것은 제작자의 책임입니다. 이런 문제를 방지하려면 행간이나 텍스트 좌우의 여백을 추가해야 할 수 있습니다.

Ren'Py는 두 번째 종류의 루비 윗글자인 대체 루비 텍스트도 지원합니다. {rt} 대신 {art} 텍스트 태그를 사용하고, ruby_style 대신 altruby_style 속성을 사용합니다.

글꼴

Ren'Py는 OpenType, TrueType, WOFF, WOFF2 형식의 크기 조절 가능한 글꼴을 지원합니다.

크기 조절 가능한 글꼴은 글꼴 파일명을 문자열로 지정합니다. game 디렉터리와 아카이브 파일에서 글꼴을 찾으며, 없으면 파일명 앞에 fonts/를 붙여 다시 찾습니다. 예를 들어 "test.ttf"를 찾을 때 Ren'Py는 먼저 game/test.ttf를 찾고, 이어서 game/fonts/test.ttf를 찾습니다. 아카이브 파일에서도 검색합니다.

Ren'Py는 여러 글꼴을 정의하는 TrueType/OpenType 컬렉션을 지원합니다. 컬렉션에 접근하려면 0부터 시작하는 글꼴 인덱스 뒤에 @ 기호와 파일명을 붙입니다. 예를 들어 "0@font.ttc"는 컬렉션의 첫 번째 글꼴, "1@font.ttc"는 두 번째 글꼴을 뜻합니다.

Ren'Py는 시스템 메모리 한도 내에서 크기 제한 없이 글꼴 파일을 지원하지만, WOFF2 압축 도구는 매우 큰 글꼴 파일을 처리할 때 문제가 생길 수 있습니다. 관련 논의는 GitHub 버그 6605를 참조하세요.

글꼴 대체

config.font_replacement_map 변수는 글꼴을 매핑하는 데 사용합니다. 글꼴 파일명, 굵게 여부, 기울임꼴 여부의 조합을 다른 조합에 매핑합니다. 이를 통해 자동으로 생성한 기울임꼴 대신 제대로 디자인된 기울임꼴 글꼴을 사용할 수 있습니다.

Deja Vu Sans 글꼴의 기울임꼴을 공식 oblique 글꼴로 바꾸는 매핑을 예로 들 수 있습니다. oblique 글꼴은 웹에서 다운로드해야 합니다.

init python:
    config.font_replacement_map["DejaVuSans.ttf", False, True] = ("DejaVuSans-Oblique.ttf", False, False)

이 매핑을 사용하면 기울임꼴 텍스트의 모양을 개선할 수 있습니다.

글꼴 이름과 별칭

config.font_name_map 변수는 글꼴에 이름이나 별칭을 지정하는 데 사용합니다. 이렇게 하면 {font} 태그를 사용하는 대사를 더 짧고 편하게 작성할 수 있고, 태그에서 글꼴 그룹도 사용할 수 있습니다.

define config.font_name_map["jap"] = "electroharmonix.ttf"
define config.font_name_map["tjap"] = FontGroup().add("OrthodoxHerbertarian.ttf", "A", "Z").add("electroharmonix.ttf", None, None)

label yamato:
    e "저기, {font=jap}Black holes and revelations{/font}가 무슨 뜻인가요?"
    y "{font=tjap}Black Holes And Revelations{/font}라고 읽어요." # the capital letters appear in OrthodoxHerbertarian

글꼴 그룹

다국어 게임을 만들 때 게임에 사용하는 모든 문자 체계를 지원하면서 제작자가 의도한 분위기도 살리는 글꼴 하나를 찾기 어려울 수 있습니다. 이를 위해 Ren'Py는 둘 이상의 글꼴에서 문자를 가져와 하나의 글꼴로 조합하는 글꼴 그룹을 지원합니다.

글꼴 그룹을 만들려면 FontGroup 객체를 만들고 .add 메서드를 한 번 이상 호출합니다. FontGroup은 글꼴 이름을 사용할 수 있는 모든 곳에서 사용할 수 있습니다. add 메서드는 유니코드 코드 포인트 범위의 시작과 끝을 받으며, 어떤 코드 포인트가 여러 범위에 포함되면 가장 먼저 지정한 범위를 사용합니다.

예를 들면 다음과 같습니다.

style default:
    font FontGroup().add("english.ttf", 0x0020, 0x007f).add("japanese.ttf", 0x0000, 0xffff)
class FontGroup

하나의 글꼴처럼 사용할 수 있는 글꼴 그룹입니다.

add(font, start, end, target=None, target_increment=False)

문자 범위를 font와 연결합니다.

start

범위의 시작입니다. 한 글자 문자열이나 유니코드 코드 포인트를 나타내는 정수일 수 있습니다. start가 None이면 이 글꼴을 기본 글꼴로 사용합니다.

end

범위의 끝입니다. 한 글자 문자열이나 유니코드 코드 포인트를 나타내는 정수일 수 있습니다. start가 None이면 무시합니다.

target

지정하면 target_increment에 따라 해당 문자 범위를 지정한 글꼴의 특정 문자들과 연결합니다. 한 글자 문자열이나 유니코드 코드 포인트를 나타내는 정수일 수 있습니다. 이미 추가된 문자는 무시합니다.

target_increment

True이면 [start, end] 범위를 [target, target+end-start] 범위에 매핑합니다. False이면 범위의 모든 문자를 target 문자 하나에 연결합니다.

여러 .add() 호출에 같은 문자가 포함되면 첫 번째 호출이 우선합니다.

FontGroup을 반환하므로 여러 .add() 호출을 연이어 연결할 수 있습니다.

remap(cha, target)

하나 이상의 문자를 대상 문자 하나로 다시 매핑합니다.

cha

다시 매핑할 문자입니다. 한 글자 문자열, 유니코드 코드 포인트를 나타내는 정수, 또는 이들로 이루어진 이터러블일 수 있습니다.

target

매핑할 대상 문자입니다. 한 글자 문자열이나 유니코드 코드 포인트를 나타내는 정수일 수 있습니다.

add나 remap으로 이미 다시 매핑한 문자는 무시합니다. 다만 FontGroup에 기본 글꼴이 없으면 지정하는 모든 문자가 이전에 추가되어 있어야 합니다.

이 메서드도 같은 이유로 FontGroup을 반환합니다.

FontGroup에는 config.font_name_map으로 이름을 지정할 수 있지만, FontGroup 자체는 글꼴로 파일 경로만 받으며 해당 변수로 정의한 이름이나 별칭은 인식하지 않습니다.

이미지 기반 글꼴

참고

새 프로젝트에서는 이미지 기반 글꼴을 권장하지 않습니다. 글꼴에 그래픽 효과를 적용하려면 텍스트 셰이더를 사용할 수 있습니다.

이미지 기반 글꼴은 다음 등록 함수 중 하나를 호출하여 등록할 수 있습니다. 등록할 때는 이름, 크기, 굵게 여부, 기울임꼴 여부, 밑줄 여부를 지정해야 합니다. 이 속성이 모두 등록한 글꼴과 일치하면 해당 글꼴을 사용합니다.

renpy.register_bmfont(name=None, size=None, bold=False, italics=False, underline=False, filename=None)

지정한 정보로 BMFont를 등록합니다. size, bold, italic, underline은 일치 여부를 확인하는 정보로만 사용하며 글꼴 모양을 바꾸지는 않습니다.

BMFont를 만드는 도구는 BMFont 홈페이지를 참조하세요. Ren'Py는 filename 매개변수가 32비트 글꼴을 설명하는 BMFont 텍스트 형식 파일을 가리킨다고 가정합니다. Alpha 채널에 글꼴 정보를 넣고 Red, Green, Blue 채널은 1로 설정해야 합니다. 이미지 파일, 커닝 및 기타 제어 정보는 BMFont 파일에서 읽습니다.

Ren'Py 인터페이스 전체가 렌더링되도록 BMFont에 Latin 및 General Punctuation 문자 영역을 포함하는 것을 권장합니다.

name

등록할 글꼴의 이름을 나타내는 문자열입니다.

size

등록할 글꼴의 크기를 나타내는 정수입니다.

bold

등록할 글꼴의 굵게 여부를 나타내는 불리언입니다.

italics

등록할 글꼴의 기울임꼴 여부를 나타내는 불리언입니다.

underline

무시하는 매개변수입니다.

filename

BMFont 제어 정보가 들어 있는 파일입니다.

renpy.register_mudgefont(name=None, size=None, bold=False, italics=False, underline=False, filename=None, xml=None, spacewidth=10, default_kern=0, kerns={})

지정한 정보로 MudgeFont를 등록합니다. size, bold, italic, underline은 일치 여부를 확인하는 정보로만 사용하며 글꼴 모양을 바꾸지는 않습니다.

MudgeFont를 만드는 도구는 MudgeFont 홈페이지를 참조하세요. Ren'Py는 MudgeFont xml 파일의 문자 코드를 유니코드 문자 번호로 간주하며 음수 문자 코드는 무시합니다.

name

등록할 글꼴의 이름을 나타내는 문자열입니다.

size

등록할 글꼴의 크기를 나타내는 정수입니다.

bold

등록할 글꼴의 굵게 여부를 나타내는 불리언입니다.

italics

등록할 글꼴의 기울임꼴 여부를 나타내는 불리언입니다.

underline

무시하는 매개변수입니다.

filename

MudgeFont 이미지가 들어 있는 파일을 나타내는 문자열입니다. 일반적으로 TGA 파일을 사용하지만 PNG나 Ren'Py가 지원하는 다른 형식도 사용할 수 있습니다.

xml

MudgeFont 도구가 생성한 정보가 들어 있는 xml 파일입니다.

spacewidth

공백 문자의 너비를 픽셀 단위로 나타내는 정수입니다.

default_kern

문자 사이의 기본 커닝 간격으로, 픽셀 단위입니다.

kerns

두 글자 문자열을 해당 문자 사이에 사용할 커닝 값에 매핑합니다.

renpy.register_sfont(name=None, size=None, bold=False, italics=False, underline=False, filename=None, spacewidth=10, baseline=None, default_kern=0, kerns={}, charset='!"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~')

지정한 정보로 SFont를 등록합니다. size, bold, italic, underline은 일치 여부를 확인하는 정보로만 사용하며 글꼴 모양을 바꾸지는 않습니다.

SFont에 대한 자세한 정보.

name

등록할 글꼴의 이름을 나타내는 문자열입니다.

size

등록할 글꼴의 크기를 나타내는 정수입니다.

bold

등록할 글꼴의 굵게 여부를 나타내는 불리언입니다.

italics

등록할 글꼴의 기울임꼴 여부를 나타내는 불리언입니다.

underline

무시하는 매개변수입니다.

filename

sfont 이미지가 들어 있는 파일을 나타내는 문자열입니다.

spacewidth

공백 문자의 너비를 픽셀 단위로 나타내는 정수입니다.

baseline

글꼴의 맨 위에서 기준선(글자가 놓이는 보이지 않는 선)까지의 거리를 픽셀 단위로 나타내는 정수입니다. 다른 글꼴과 함께 사용하면 기준선을 서로 맞춥니다. 음수는 글꼴의 맨 아래에서부터의 거리를 뜻하며, None이면 기준선이 글꼴 높이와 같습니다. 즉, 글꼴의 맨 아래에 놓입니다.

default_kern

문자 사이의 기본 커닝 간격으로, 픽셀 단위입니다.

kerns

두 글자 문자열을 해당 문자 사이에 사용할 커닝 값에 매핑합니다.

charset

글꼴의 문자 집합입니다. 이미지에 나타나는 순서대로 문자를 나열한 문자열입니다. SFont의 기본 문자 집합은 다음과 같습니다.

! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
@ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _
` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~

BMFont 사용 예제는 다음과 같습니다.

init python:
    renpy.register_bmfont("bmfont", 22, filename="bmfont.fnt")

define ebf = Character('에일린', what_font="bmfont", what_size=22)

label demo_bmfont:

    ebf "드디어 Ren'Py가 BMFonts를 지원해요."

텍스트 디스플레이어블

텍스트를 디스플레이어블로 사용할 수도 있습니다. 그러면 텍스트에 트랜스폼을 적용하여 이미지처럼 표시하고 화면에서 이동시킬 수 있습니다.

class ParameterizedText(style='default', **properties)

추가 문자열 매개변수를 지정하여 표시할 수 있는 디스플레이어블입니다. 해당 문자열을 이미지처럼 표시합니다. 일반적으로 미리 정의된 text 이미지의 일부로 사용합니다.

예를 들어 다음과 같이 사용할 수 있습니다.

show text "안녕, 세상아" at truecenter
with dissolve
pause 1
hide text
with dissolve

ParameterizedText를 직접 사용하여 스타일 속성이 다른 유사한 이미지를 정의할 수 있습니다. 예를 들어 다음과 같이 작성할 수 있습니다.

image top_text = ParameterizedText(xalign=0.5, yalign=0.0)

label start:
    show top_text "이 글자는 화면 위쪽 중앙에 표시됩니다"
class Text(text, slow=None, scope=None, substitute=None, slow_done=None, *, tokenized=False, **properties)

화면에 텍스트를 표시하는 디스플레이어블입니다.

text

화면에 표시할 텍스트입니다. 문자열이거나 문자열과 디스플레이어블로 이루어진 리스트일 수 있습니다.

slow

텍스트를 한 번에 한 글자씩 입력하듯 느리게 표시할지 결정합니다. None이면 slow_cps 스타일 속성이 느린 텍스트 모드를 결정합니다. 그 밖의 경우 이 매개변수의 참·거짓 값으로 느린 텍스트 모드 사용 여부를 결정합니다.

scope

None이 아니면 텍스트 보간에 사용할 추가 스코프를 제공하는 딕셔너리여야 합니다.

substitute

참이면 텍스트 보간을 수행하고, 거짓이면 수행하지 않습니다. None이면 config.new_substitutions의 설정을 따릅니다.

slow_done

None이 아니고 느린 텍스트 모드가 켜져 있으면(slow 매개변수 참조), 텍스트 표시를 마쳤을 때 인수 없이 호출하는 함수 또는 호출 가능한 객체입니다.

tokenized

참이면 text는 문자열이 아닌 토큰 리스트여야 합니다. 토큰은 사용자 정의 텍스트 태그 페이지에서 설명합니다.

**properties

다른 디스플레이어블과 마찬가지로 Text는 mipmap 등을 포함한 스타일 속성을 받습니다.

텍스트 유틸리티 함수

renpy.filter_text_tags(s, allow=None, deny=None)

텍스트 태그를 필터링한 s의 사본을 반환합니다. allow와 deny 키워드 인수 중 정확히 하나를 지정해야 합니다.

allow

허용할 태그의 집합입니다. 이 집합에 없는 태그는 제거합니다.

deny

금지할 태그의 집합입니다. 이 집합에 없는 태그는 문자열에 그대로 둡니다.

renpy.substitute(s, scope=None, translate=True)

문자열 s에 번역과 새 방식의 서식 지정을 적용합니다.

scope

None이 아니면 기본 스토어와 함께 서식 지정에 사용하는 스코프입니다.

translate

번역을 수행할지 결정합니다.

번역과 서식 지정이 적용된 문자열을 반환합니다.

renpy.transform_text(s, function)

텍스트 태그와 보간 구문을 그대로 두고 s를 변환합니다.

function

연속된 텍스트 구간에 해당하는 문자열을 받아 호출되는 함수입니다. 해당 구간을 대체할 문자열을 반환해야 합니다.

init python:
    def upper(s):
        return s.upper()

$ upper_string = renpy.transform_text("{b}Not Upper{/b}", upper)

느린 텍스트 표시 시 유의점

Ren'Py에서는 제작자나 사용자가 텍스트를 느리게 표시하도록 설정할 수 있습니다. 이 경우 Ren'Py는 텍스트를 텍스처에 렌더링한 뒤 그 텍스처의 사각형 영역들을 화면에 그립니다.

이 방식에서는 문자가 겹칠 때 렌더링 오류가 나타날 수 있습니다. 오류를 최소화하려면 line_leading과 line_spacing 속성을 충분히 크게 설정하여 줄끼리 겹치지 않도록 합니다. 첫 번째 줄의 글자 아래쪽이 잘리면, 특히 line_spacing이 음수일 때는 line_overlap_split을 늘리는 것을 고려하세요.

커닝으로 문자가 서로 가까워질 때 가로 방향의 렌더링 오류가 나타날 수도 있습니다. 다만 이 오류는 한 프레임 동안만 나타나므로 영향이 더 작습니다.

메뉴나 사용자 인터페이스의 다른 부분에 있는 정적인 텍스트에서는 이러한 오류가 문제가 되지 않습니다.

텍스트 영역 넘침 기록

Ren'Py는 텍스트가 할당된 영역 밖으로 넘치는 경우를 기록할 수 있습니다. 이 기능을 켜려면 다음 단계를 따릅니다.

  1. config.debug_text_overflow 변수를 참으로 설정합니다.

  2. Text 디스플레이어블이나 이를 감싸는 컨테이너에 xmaximum 및 ymaximum 스타일 속성을 설정합니다.

  3. 게임을 실행합니다.

사용 가능한 영역을 넘치는 텍스트가 표시될 때마다 Ren'Py가 text_overflow.txt 파일에 오류를 기록합니다.

가변 글꼴

Ren'Py는 OpenType 가변 글꼴을 지원합니다. 가변 글꼴은 두께, 너비 등의 여러 축을 지원할 수 있으며, 각 축의 값에 따라 글꼴 모양이 달라집니다. 축 값의 조합을 제공하는 이름 있는 인스턴스가 포함될 수도 있습니다. 예를 들어 "bold" 인스턴스는 대체로 굵은 글꼴을, "regular"는 일반적인 글꼴을 제공합니다.

가변 글꼴을 사용하려면 shaper 스타일 속성으로 제어하는 harfbuzz 텍스트 셰이퍼를 사용해야 합니다. 설정한 뒤에는 instance 속성으로 이름 있는 인스턴스를 선택하고, axis 속성으로 하나 이상의 축 값을 설정합니다.

gui 시스템에서도 설정할 수 있습니다. 예를 들어 다음과 같이 사용할 수 있습니다.

define gui.text_font = "nunito.ttf"
define gui.text_instance = "light"
define gui.text_axis = {"width" : 125}

light 인스턴스에서 시작하여 너비를 넓힙니다.

인스턴스를 지정하지 않으면 Ren'Py는 굵지 않은 텍스트에는 "regular", 굵은 텍스트에는 "bold"를 기본으로 사용합니다.

가변 글꼴을 지원하는 텍스트 태그는 두 가지입니다.

instance

instance 태그는 사용하는 인스턴스를 바꿉니다. 예를 들면 다음과 같습니다.

"이 글자는 {instance=heavy}굵어요{/instance}."

instance 태그를 사용하면 axis 속성을 덮어씁니다.

axis

axis 태그는 하나 이상의 축 값을 바꿉니다. 예를 들면 다음과 같습니다.

"이 글자는 {axis:width=125}넓어요{/axis}."

axis 태그는 여러 번 사용할 수 있으며 각 값이 함께 적용됩니다.

"This is {axis:width=125}{axis:weight=200}wide and bold{/axis}{/axis} text."

등호 오른쪽 값은 부동 소수점 수여야 합니다.

글꼴에서 사용할 수 있는 인스턴스와 축을 알아보려면 renpy.variable_font_info() 함수를 사용합니다. 이 함수는 콘솔에서 호출하도록 설계되었습니다. shift+O를 눌러 콘솔을 연 뒤 다음과 같이 입력합니다.

renpy.variable_font_info("nunito.ttf")

nunito.ttf 글꼴의 정보가 표시됩니다.

renpy.variable_font_info(font)

가변 글꼴에 대한 정보를 반환합니다. 가변 글꼴이 아니면 None을 반환합니다.

font

글꼴이 들어 있는 파일의 이름입니다.

반환값은 다음 필드를 가진 객체입니다.

instance

키가 글꼴의 이름 있는 인스턴스 이름인 딕셔너리입니다. 예를 들어 'light', 'regular', 'bold', 'heavy' 등이 있습니다. 값은 무시해도 됩니다.

axis

글꼴의 축 이름을 다음 필드를 가진 객체에 매핑하는 딕셔너리입니다.

minimum

축의 최솟값입니다.

default

축의 기본값입니다.

maximum

축의 최댓값입니다.

이 함수가 반환한 객체와 그 안의 데이터는 변경하면 안 됩니다.

이 함수는 Ren'Py의 디스플레이가 초기화된 뒤에만 호출할 수 있습니다. 사람이 읽기 쉬운 형태로 출력하는 콘솔에서 호출하도록 설계되었습니다.