목차

이전 항목

음성

다음 항목

번역

링크


원문 보러 가기
오역 신고하기
Created using Sphinx.

텍스트

렌파이에서 텍스트를 나타내는 방법에는 여러가지가 있습니다. 대표적으로 say문menu문 으로 사용자에게 텍스트를 표시합니다. 사용자 인터페이스에도 text, textbutton, label 를 이용해 텍스트를 표시할 수 있습니다. 위에 적힌 함수처럼 게임 화면에 글자를 넣는 함수들은 Text() 디스플레이어블을 만들어 화면에 텍스트를 나타냅니다.

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

  1. 텍스트를 번역하기.
  2. 데이터를 텍스트에 보간하기.
  3. 스타일과 텍스트 태그로 텍스트를 꾸미기.
  4. 꾸민 텍스트를 배치하기.
  5. 텍스트를 화면에 그리기.

이 장에서는 렌파이에서 텍스트를 나타내는 과정에 대해서 다루도록 하겠습니다.

탈출 문자

텍스트가 나타나는 방식을 제어하기 위해 사용할 수 있는 특별한 문자가 세 가지 있습니다. 이 문자들을 사용할 때에는 렌파이가 그 쓰임을 잘못 인식하지 않도록 각별히 유의해야 합니다.

(역슬래시)

역슬래시 문자는 렌파이나 파이썬 문자열을 이끌 때 사용되는 문자입니다. 흔히 사용되는 탈출 코드는 다음과 같습니다:

\" (역슬래시-따옴표)
따옴표로 만들어진 문자열에 따옴표를 넣는다.
\' (역슬래시-홑따옴표)
홑따옴표로 만들어진 문자열에 홑따옴표를 넣는다.
\ (역슬래시-공백)
렌파이 문자열에 공백을 넣는다. 보통 렌파이 스크립트 텍스트는 공백이 여럿 뭉친 때에는 공백을 하나의 공백으로 만든다.
\n (역슬래시-n)
텍스트에 새줄 문자를 넣는다.
\\ (역슬래시-역슬래시)
텍스트에 역슬래시 문자를 넣는다.
[ (왼쪽 대괄호)
왼쪽 대괄호는 텍스트로 나타낼 값을 이끌 때 사용되는 문자입니다. 왼쪽 대괄호를 텍스트로 넣으려면 두 번 연속해서 적으면 됩니다. ([[)
{ (왼쪽 중괄호)
왼쪽 중괄호는 텍스트 태그를 이끌 때 사용되는 문자입니다. 왼쪽 중괄호를 텍스트로 넣으려면 두 번 연속해서 적으면 됩니다. ({{)

데이터를 텍스트로 나타내기

렌파이에서는 데이터를 텍스트 문자열로 나타낼 수 있습니다. 예를 들어 플레이어의 이름이 playername 변수에 저장되어 있다면, 다음처럼 적어서 대사에 플레이어 이름을 나타낼 수 있습니다:

g "네코미미 회사에 어서와, [playername]!"

렌파이는 전역 영역에서 변수를 찾아 데이터를 텍스트로 나타냅니다. 화면에서 텍스트 위젯을 사용할 때에는 렌파이는 스크린 지역 변수를 찾아 데이터를 텍스트로 나타낼 것입니다. (텍스트 디스플레이어블에 영역 인수를 명확히 지정하면 작동방식이 바뀌게 됩니다)

이 때 텍스트로 나타낼 수 있는 데이터는 단순 변수에만 국한되지 않습니다. 튜플의 요소나 필드도 다음처럼 적으면 쉽게 텍스트로 나타낼 수 있습니다.

g "내 이름은 [player.names[0]]."

숫자를 나타낼 때는 포매팅 코드를 적용할 수도 있습니다. 아래처럼 적으면 부동소수점을 두 자리 십진수로 나타냅니다.:

$ percent = 100.0 * points / max_points
g "네가 [percent:.2] 퍼센트 마음에 드는 걸!"

렌파이의 문자열 보간 방식은 PEP 3101 문자열 포매팅 구문에서 따왔습니다. 다른 점이 있다면 렌파이에서는 [ 를 사용해야 한다는 점입니다. { 는 렌파이에서 텍스트 태그를 이끌 때 사용되는 문자이기 때문입니다.

렌파이는 파이썬의 !s, !r 전환 플래그와 !q, !t 전환 플래그를 지원합니다. !q 플래그를 사용할 때에는 텍스트 태그가 적절히 따옴표로 감싸져 있어 문자열을 표시할 때 원하던 형식 구조 그대로를 이끌도록 해야 합니다.:

g "날 속일 생각은 그만 둬, [playername!q]."

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

if points >5:
    $ mood = _("기뻐")
else:
    $mood = _("짜증나")

g "만나서 [mood!t]."

텍스트 꾸미기와 텍스트 태그

텍스트를 꾸미는 방법은 두 가지가 있습니다. 첫 번째 방법은 텍스트 전체에 스타일을 적용하는 것입니다. 이 내용은 스타일 시스템 부분, 특히 텍스트 스타일 속성 부분을 살펴보세요.

두 번째 방법은 텍스트 태그를 이용하는 것입니다. 텍스트 태그는 텍스트 블록 또는 프로그램에 있는 텍스트 일부를 꾸밀 때 유용합니다. 동일한 텍스트 태그를 모든 텍스트 행에 적용하고 싶다면 스타일 시스템을 이용하는 것 좋습니다.

텍스트 태그에는 두 가지 종류가 있습니다. 스스로 닫히는 텍스트 태그가 있는 반면, 닫는 태그를 적어야 하는 태그도 있습니다. 닫는 태그가 여러 개 필요할 때에는 마지막에 열린 태그부터 닫아야 합니다. 렌파이는 정확히 닫히지 않는 태그는 정상적으로 적용시키지 않습니다. 아래는 예제입니다.

# 이 줄은 제대로 된 줄이고
"민짜 {b}굵게 {i}굵은 기울임꼴{/i} 굵게{/b} 민짜"

# 이 줄은 잘못된 줄이므로 오류가 나타나거나 텍스트 태그가
# 잘못 작동합니다.
"민짜 {b}굵게 {i}굵은 기울임꼴{/b} 기울임꼴{/i} 민짜"

텍스트 태그 중에는 인수를 취하는 태그도 있습니다. 이런 텍스트 태그는 텍스트 태그 이름 뒤에 등호(=), 그 다음에 인수를 적어야 합니다. 인수에는 오른쪽 중괄호 문자(})를 적지 말아야 합니다. 인수의 의미는 텍스트 태그에 따라 달라집니다.

일반 텍스트 태그

아래에 적힌 텍스트 태그는 모든 텍스트에 적용되는 태그입니다.:

a

자신과 닫는 태그 사이에 적힌 글자에 하이퍼링크를 만들어내는 태그. 하이퍼링크의 동작방식은 hyperlink_functions 스타일 속성에 따르며, 기본 핸들러는 다음과 같이 작동한다.

  • 하이퍼링크는 style.hyperlink_text 스타일로 렌더링된다.
  • 인수가 "http:// 로 시작하면 해당 주소를 웹 브라우저로 연다. 그 외에는 인수가 레이블로 해석되어 새 상황에서 호출한다. 용어를 설명할 때 사용하면 좋다.
  • 스타일과 관계 없이 하이퍼링크에 마우스가 올라있을 때에는 아무런 작동을 하지 않는다.
label test:

    e "{a=http://renpy.org}렌파이 홈페이지{/a}에 한 번 들러봐"

    e "{a=define_trebuchet}투석기{/a}는 입구에 있어."

    return

label define_trebuchet:

    e "투석기라는 건 일종의 공성 무기라고 할 수 있지."
    e "레버가 당겨지면 목표 지점에 뭔가를 날리는 기기야."
    e "우리처럼!"

    return
b

자신과 닫는 태그 사이에 적힌 글자를 굵은 글씨로 렌더링한다.

"글자를 {b}굵게{/b}."
color

자신과 닫는 태그 사이에 적힌 글자를 지정한 색으로 변경한다. 색은 #rgb, #rgba, #rrggbb, #rrggbbaa 형식으로 표현해야 한다.

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

이 태그와 닫는 태그 사이에 적힌 글자의 초당 글자 표시 속도를 설정한다. 인수 맨 앞에 * 기호를 적고 숫자를 적으면 현재 텍스트 속도에 해당 숫자만큼 곱한 값을 표시 속도로 정한다. 그 외 경우에 인수는 초당 글자 표시 속도이다.:

"{cps=20}속도 고정{/cps} {cps=*2}두 배 빠른 글자 표시 속도{/cps}
font

자신과 닫는 태그 사이에 적힌 글자를 지정한 폰트로 렌더링한다. 인수는 폰트로 설정할 파일 이름이다.:

"{font=mikachan.ttf}미카짱 글씨체{/font}."
i

자신과 닫는 태그 사이에 적힌 글자를 기울인다.

"{i}피사의 사탑{/i}을 방문한다."
k

자신과 닫는 태그 사이에 적힌 글자의 간격을 조정한다. 인수는 부동소수점으로 자간에 넣을 픽셀 갯수이다. 음수를 적으면 자간을 좁힌다.

"{k=-5.0}음수{/k} 보통 {k=5.0}양수{/k}"
image

글자에 그림을 넣는 스스로 닫는 태그. 그림의 세로 길이는 텍스트 한 줄의 세로길이이어야 한다. 인수는 그림 파일 이름이거나 image 문으로 정의한 이미지 이름이어야 한다.

g "만나서 반가워{image=heart.png}"
s

자신과 닫는 태그 사이의 글자에 취소선을 긋는다.

g "만나서 {s}반가워{/s}."
rb

자신과 닫는 태그 사이에 적힌 글자를 아랫글자로 지정한다. 자세한 내용은 루비 텍스트 를 참고하라.

rt

자신과 닫는 태그 사이에 적힌 글자를 윗글자로 지정한다. 자세한 내용은 루비 텍스트 를 참조하라.

size

자신과 닫는 태그 사이에 적힌 글자의 크기를 바꾼다. 인수는 정수이며, 앞에 +, - 기호를 적을 수 있다. 인수가 정수일 때에는 글자의 높이를 픽셀로 지정한 것이다. 그 외에는 현재 크기에서 지정한 숫자만큼 크기가 커지거나 줄어든다.

"{size=+10}크게{/size} {size=-10}작게{/size} {size=24}24 픽셀{/size}."
space

글자 사이에 가로로 빈 공간을 넣는 스스로 닫는 태그. 빈 공간에 넣을 픽셀 수를 인수로 받는다.

"공백 이전.{space=30}공백 이후."
u

자신과 닫는 태그 사이에 적힌 글자에 밑줄을 긋는다.

g "{u}만나서{/u} 반가워."
vspace

텍스트 행 사이에 세로로 빈 공간을 넣는 스스로 닫는 태그이다. 빈 공간에 넣을 픽셀 수를 인수로 받는다.

"첫 번째 줄{vspace=30}두 번째 줄"
#

#로 시작하는 텍스트 태그. #로 시작하는 텍스트 태그는 무시되나, 번역할 때 문자열을 구별하기 위해 포함될 수 있다.

"새 {#플레이리스트}"

대사 텍스트 태그

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

fast

이 태그보다 앞에 적힌 모든 글자는 화면에 한 번에 나타난다. 슬로 텍스트 모드에서도 마찬가지이다. 이 태그는 스스로 닫는 태그이다.:

g "저 녀석들 또{nw}"
show trebuchet
g "저 녀석들 또{fast} 투석기를 가지고 노나 보네."
nw

이 태그는 현재 대사가 끝까지 표시되면 자동으로 대사를 넘기게 하는 스스로 닫는 태그이다.

g "저 녀석들 또{nw}"
show trebuchet
g "저 녀석들 또{fast} 투석기를 가지고 노나 보네."
p

문단 정지 태그는 현재 문단을 끝내고 마우스 클릭을 기다리는 스스로 닫는 태그이다. 인수를 받을 때에는 인수를 초 단위 숫자로 해석하여 해당 시간이 경과하면 대기 상태를 종료시킨다.

"첫째 줄{p}둘째 줄{p=1.0}셋째 줄"
w

대기 태그는 사용자가 마우스를 클릭하기를 기다리는 스스로 닫는 태그이다. 인수를 받을 때에는 인수를 초 단위 숫자로 해석하여 해당 시간이 경과하면 대기 상태가 종료된다.

"첫째 줄{w} 첫째 줄{w=1.0} 첫째 줄"

파이썬을 활용해 맞춤 텍스트 태그 를 정의할 수도 있습니다.

스타일 텍스트 태그

렌파이는 스타일 시스템에 접근하는 텍스트 태그를 지원합니다. 바로 태그 이름이 없는 텍스트 태그입니다. 이 때 입력하는 인수는 스타일 이름이 됩니다. 예를 들어 {=mystyle} 태그는 mystyle 스타일에 접근합니다.

이 태그와 닫는 태그 사이의 글자는 스타일에 정의된 아래의 속성을 적용 받습니다. :

  • antialias
  • font
  • size
  • bold
  • italic
  • underline
  • strikethrough
  • color
  • black_color
  • kerning

비영어권 언어

렌파이에 있는 기본 폰트로는 알파벳과 다른 언어도 나타낼 수 있습니다. 그러나 용량 문제로 한자, 가나, 한글을 포함한 다른 문자는 나타낼 수 없습니다. 이 문자들을 나타내려면 다음처럼 기본 폰트를 바꿔야 합니다.:

init python:
    style.default.font = "mikachan.ttf"

이렇게 하면 다른 설정 없이도 대부분의 언어를 지원할 수 있습니다. 그러나 한국어는 단어 사이에 띄어쓰기를 적을 수도, 적지 않을 수도 있습니다. 아래와 같이 적으면 렌파이에서 지원하는 한국어 지원 모드를 활성화할 수 있습니다.:

init python:
    style.default.language = "korean-with-spaces"

일본어는 줄바꿈 규칙이 여러 개 있습니다. 처음에는 "japanese-normal" 로 시작한 뒤에 원하는 줄바꿈 발생 빈도에 따라 "japanese-loose" 또는 "japanese-strict" 로 변경하세요.:

init python:
    style.default.language = "japanese-normal"

표의문자를 사용하는 언어는 줄바꿈의 경우의 수가 많습니다. 빠른 줄바꿈 알고리즘을 원한다면 다음 코드를 사용하세요.

init python:
    style.default.layout = "greedy"

빠른 줄바꿈 알고리즘은 대개 비주얼노벨 모드처럼 다량의 글자를 표시하는 게임에 적합합니다.

줄바꿈 알고리즘은 renpy.language_tailor() 함수를 사용해 수정할 수 있습니다.

세로쓰기

vertical 스타일 속성값이 설정되었다면 렌파이는 텍스트를 세로로 씁니다. 텍스트는 위에서 아래로, 오른쪽에서 왼쪽으로 적힙니다.

세로쓰기에 영향을 미치는 텍스트 태그에는 두 가지가 있습니다.

horiz

세로로 쓴 텍스트 안에 가로로 쓴 텍스트를 넣는다.

vert

가로로 쓴 텍스트 안에 세로로 쓴 텍스트를 넣는다. (글자를 세로 방향으로 회전시키지는 않는다.)

주석

폰트에 세로 쓰기 텍스트의 띄어쓰기 정보가 없다면 렌파이는 이 정보를 가로 쓰기 정보와 동일시하려고 합니다. 띄어쓰기는 렌파이 버전 별로 지속되지 않을 수 있습니다.

루비 텍스트

루비 텍스트(후리가나 혹은 행간 주석)를 적으면 글자나 문자 위에 작은 글자를 적을 수 있습니다. 몇 단계를 거치면 루비 텍스트를 쓸 수 있습니다.

우선 루비 텍스트에 적용할 스타일을 반드시 설정해야 합니다. 아래 적힌대로 스타일을 변경해야 합니다.:

  1. line_leading 속성을 변경해 루비 텍스트를 넣을 충분한 줄 간격을 지정해야 합니다.
  2. 새 스타일을 만들어야 합니다. 이 스타일의 속성, 즉 size 같은 속성에 어느 정도 값을 설정해야 합니다.
  3. 새 스타일에 yoffset 속성값을 지정해야 합니다. 기본선 위로 루비 텍스트를 놓아야 하기 때문입니다.
  4. 텍스트 스타일의 ruby_style 필드를 새로 만든 스타일에 설정해야 합니다.

다음은 예제입니다:

init python:
    style.default.line_leading = 12

    style.ruby_style = Style(style.default)
    style.ruby_style.size = 12
    style.ruby_style.yoffset = -20

    style.default.ruby_style = style.ruby_style

설정을 완료하면 rt, rb 텍스트 태그를 사용해 루비 텍스트를 입력할 수 있습니다. rt 태그는 루비 텍스트로 사용할 문자를 하나 이상 지정하는 태그입니다. rb 태그로 감싼 글자 뒤에 루비 텍스트를 적으면 루비 텍스트는 rb 태그로 감싼 글자 위에 적힙니다. 그 외에는 앞에 적힌 글자 위에 나타납니다.

다음은 예제입니다.

e "루비 텍스트로 후리가나를 쓸 수 있습니다(東{rt}とう{/rt} 京{rt}きょう{/rt})."

e "번역할 때도 사용할 수 있습니다({rb}東京{/rb}{rt}도쿄{/rt})."

글자 경계 밖으로 루비 텍스트가 삐져나가지 않도록 조심하시기 바랍니다. 이런 오류가 발생하지 않도록 글자 왼쪽 및 오른쪽에 공백을 미리 넣어야 할 것입니다.

폰트

렌파이는 트루타입 폰트와 이미지 기반 폰트를 지원합니다.

트루타입 폰트는 폰트 파일 이름을 적어 지정합니다. 파일은 반드시 게임 디렉토리 안이나 아카이브 파일에 있어야 합니다.

여러 폰트가 한 파일에 들어있는 트루타입 컬렉션도 사용 가능합니다. 컬렉션에 접근할 떄는 0번부터 폰트 번호를 매기고, 숫자 뒤에 @을 적은 다음에 파일 이름을 적으면 됩니다. 예를 들어 "0@font.ttc"는 컬렉션에 들어있는 첫 번째 폰트, "1@font.ttc" 가 두 번째 폰트가 됩니다.

폰트 대체하기

config.font_replacement_map 변수는 폰트를 매핑할 때 사용합니다. 폰트 파일 이름, 굵기, 기울임 여부를 적고 폰트를 매핑시키면 렌파이에서 자체적으로 기울인 폰트 대신에 원래부터 기울어진 모양으로 제작된 폰트를 사용할 수 있습니다.

아래 스크립트처럼 입력해 폰트 매핑을 하고 나면 Deja Vu Sans 폰트를 기울여서 쓸 때 DejaVu 폰트의 기울임 버전인 DejaVuSans-Oblique 폰트를 대신 사용하게 됩니다.(DejaVuSans-Oblique 폰트는 웹에서 다운로드해야 합니다)

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

이렇게 매핑하면 기울임체의 모양이 더 나아집니다.

이미지 기반 폰트

이미지 기반 폰트는 아래 적힌 함수를 호출하면 등록할 수 있습니다. 이미지 기반 폰트를 등록할 때에는 폰트 이름, 크기, 굵기, 기울임, 밑줄 여부를 정확히 적어야 합니다. 등록한 폰트에 대한 정보가 모두 맞으면 등록한 폰트를 사용합니다.

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

지정한 상세 정보를 통해 BMFont를 등록한다. 크기, 굵기 , 기울임, 밑줄은 모두 폰트 검색에 사용할 뿐이며 폰트의 모습을 바꾸지는 않는다.

BMFont를 만드려면 BMFont 홈페이지 를 방문할 것. filename 매개변수는 BMFont 텍스트 형식에 들어있는 32-비트 폰트 파일이어야 한다. 알파 채널에는 폰트 정보가 있어야 하며 R, G, B 채널은 각각 1로 설헝되어야 한다. 이미지 파일, 자간, 제어 정보는 BMFont 파일 외부에서 읽는다.

BMFont 에는 모든 렌파이 인터페이스를 렌더링할 수 있도록 라틴 문자와 일반 구두점 문자를 포함하는 것이 좋다.

name
등록할 폰트 이름. 문자열.
size
등록할 폰트의 크기. 정수.
bold
등록할 폰트의 굵기 여부. True/False.
italics
등록할 폰트의 기울임 여부. True/False.
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를 등록한다. 크기, 굵기, 기울임, 밑줄은 모두 폰트 검색에 사용할 뿐이며 폰트의 모습을 바꾸지는 않는다.

MudgeFont 제작 툴은 MudgeFont 홈페이지 에서 구할 수 있다. MudgeFont xml 파일에 있는 문자 코드는 유니코드 문자로 해석하며 음수 문자 코드는 무시한다.

name
등록할 폰트 이름. 문자열.
size
등록할 폰트의 크기. 정수.
bold
등록할 폰트의 굵기 여부. True/False.
italics
등록할 폰트의 기울임 여부. True/False.
underline
이 매개변수는 무시된다.
filename
MudgeFont 그림이 들어있는 파일. 문자열. 그림은 보통 TGA 파일이지만 PNG나 렌파이가 지원하는 다른 이미지 형식의 파일일 수도 있다.
xml
MudgeFont 제작툴이 만드는 xml 파일. 폰트 정보가 들어있다.
spacewidth
공백 문자의 가로 길이. 픽셀 단위의 정수.
default_kern
기본 자간. 픽셀 단위.
kerns
두 문자로 이루어진 문자열에서부터 그 사이에 들어가야할 간격에 대한 맵.
renpy.register_sfont(name=None, size=None, bold=False, italics=False, underline=False, filename=None, spacewidth=10, default_kern=0, kerns={}, charset=u'!"#$%&'()*+, -./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~')

지정한 상세 정보를 통해 SFont를 등록한다. 크기, 굵기, 기울임, 밑줄은 모두 폰트 검색에 사용할 뿐이며 폰트의 모습을 바꾸지는 않는다.

SFont 에 대한 자세한 정보는 홈페이지 를 참고하라.

name
등록할 폰트 이름. 문자열.
size
등록할 폰트의 크기. 정수.
bold
등록할 폰트의 굵기 여부. True/False.
italics
등록할 폰트의 기울임 여부. True/False.
underline
이 매개변수는 무시된다.
filename
SFont 그림이 들어있는 파일. 문자열.
spacewidth
공백 문자의 가로 길이. 픽셀 단위의 정수.
default_kern
기본 자간. 픽셀 단위.
kerns
두 문자로 이루어진 문자열에서부터 그 사이에 들어가야할 간격에 대한 맵.
charset - SFont의 문자모음. 문자열. 이미지에서 찾을 수 있는

순서대로 문자를 적어야 한다. 아래는 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를 완성도 높게 지원하므로, 새 프로젝트에서는 BMFont를 사용할 것을 추천합니다. 아래는 BMFont 사용 예제입니다.:

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

define ebf = Character('아이린', what_font="bmfont", what_size=22)

label demo_bmfont:

    ebf "드디어 렌파이에서 BMFont 를 지원하는구나."

폰트 그룹

여러 언어를 지원하는 게임을 제작할 때 제작자가 의도한 분위기를 잘 나타내면서도 모든 문자 체계를 표현할 수 있는 폰트 하나를 찾는 것은 아마 불가능할 것입니다. 이 문제를 해결하기 위해 렌파이에서는 둘 이상의 폰트에서 글씨를 선택하거나 둘 이상의 폰트를 하나로 합칠 수 있는 폰트 그룹 시스템을 지원합니다.

폰트 그룹을 생성하기 위해서는 FontGroup 객체를 생성해 그 객체에 한 번 이상 .add 메소드를 호출하세요. 폰트 이름을 사용할 수 있다면 언제나 FontGroup 객체를 사용할 수 있습니다. add 메소드는 유니코드 문자 포인트의 첫 부분과 끝부분, 그리고 사용되는 포인트가 포함된 첫 번째 범위를 받습니다.

다음은 예제입니다.

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

하나의 폰트처럼 사용할 수 있는 폰트 그룹.

add(font, start, end)

문자 범위를 font 와 결합시킨다.

start
범위의 첫 부분. 문자 하나로 이루어진 문자열이거나 유니코드 코드 포인트를 가리키는 정수이어야 한다.
end
범위의 끝 부분. 문자 하나로 이루어진 문자열이거나 유니코드 코드 포인트를 가리키는 정수이어야 한다.

같은 문자를 담고 있는 .add() 를 여러 번 호출할 경우에는, 첫 번째 호출이 우선한다.

이 메소드는 FontGroup를 반환해, 여러 번 호출한 .add()가 서로 결합할 수 있도록 한다.

텍스트 디스플레이어블

텍스트는 디스플레이어블 로 만들어 사용할 수 있습니다. 텍스트 디스플레이어블에는 트랜스폼을 적용해, 화면에 이미지처럼 표시하거나 움직이게 만들 수 있습니다.

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

문자열 매개변수를 추가로 받아 화면에 해당 문자열을 이미지처럼 나타나는 디스플레이어블. 일반적으로 사전정의된 text 이미지의 일부로서 사용된다.

다음은 예제이다.

show text "Hello, World" at truecenter
with dissolve
pause 1
hide text
with dissolve

비슷한 이미지에 서로 다른 속성을 지정하기 위해 ParameterizedText 를 직접 사용할 수도 있다. 다음과 같은 코드 작성이 가능하다.

image top_text = ParameterizedText(xalign=0.5, yalign=0.0)
Text(text, slow=None, scope=None, substitute=None, slow_done=None, **properties)

화면에 글자를 나타내는 디스플레이어블.

text
화면에 나타낼 디스플레이어블. 문자열이거나 문자열 리스트이거나 디스플레이어블이어야 한다.
slow
글자를 한 번에 한 글자씩 천천히 표시할지 결정한다. None이면 글자는 slow_cps 속성에 설정한 속도대로 나타난다. 그 외의 경우에는 여기 적은 값에 따라 글자 표시 속도가 달라진다.
scope
None이 아니라면 글자로 삽입할 변수의 영역을 제공하는 딕셔너리이어야 한다.
substitute
True면 텍스트 보간이 발생한다. False면 발생하지 않는다. None이면 보간은 config.new_substitutions 에서 제어한다.
renpy.ParameterizedText(style='default', **properties)

문자열 매개변수를 추가로 받아 화면에 해당 문자열을 이미지처럼 나타나는 디스플레이어블. 일반적으로 사전정의된 text 이미지의 일부로서 사용된다.

다음은 예제이다.

show text "Hello, World" at truecenter
with dissolve
pause 1
hide text
with dissolve

비슷한 이미지에 서로 다른 속성을 지정하기 위해 ParameterizedText 를 직접 사용할 수도 있다. 다음과 같은 코드 작성이 가능하다.

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

슬로 텍스트 관련 문제

렌파이에서 플레이어나 제작자는 텍스트가 한 글자씩 천천히 나타나도록 만들 수 있습니다. 이 경우에는 텍스트를 텍스처로 렌더링해, 텍스처에서 사각형을 받아 화면에 그립니다.

안타깝게도 이것은 글자가 겹칠 때에는 렌더링 오류로 화면 이상이 발생할 수도 있다는 의미입니다. 렌더링 오류를 최소화하려면 line_leadingline_spacing 속성에 충분한 값을 입력해 문장이 겹치는 것을 방지해야 합니다. 첫 번째 줄에 적힌 글자들의 밑부분이 잘린다면, 특히 line_spacing 이 음수라면, line_overlap_split 값을 증가시켜 보세요.

자간을 좁혔을 때에 가로 방향으로 찌꺼기 이미지가 나타날 수도 있지만 단일 프레임에서만 발생하므로 심각한 현상은 아닙니다.

이런 찌꺼기 이미지는 선택지나 UI 등 고정 텍스트에서는 발생하지 않습니다.

넘친 텍스트 기록

제한된 영역에서 텍스트를 표시할 때 텍스트가 넘치는 경우가 생긴다면 렌파이는 넘친 텍스트를 기록합니다. 다음 단계를 차례로 따라가면 넘친 텍스트를 기록으로 남길 수 있습니다.

  1. config.debug_text_overflow 변수를 True로 설정한다.
  2. xmaximumymaximum 스타일 속성을 텍스트 디스플레이어블이나 컨테이너에 설정한다.
  3. 게임을 시작한다.

정해진 영역 밖으로 텍스트가 나타나면 해당 텍스트는 text_overflow.txt 파일에 기록됩니다.