NVL 모드 튜토리얼
비주얼 노벨에는 크게 두 가지 표시 방식이 있습니다. ADV 방식은 대사와 서술을 한 번에 하나씩 표시하며 대개 화면 아래쪽의 창을 사용합니다. NVL 방식은 화면 전체를 차지하는 창에 여러 줄을 한꺼번에 표시합니다.
이 튜토리얼에서는 Ren'Py로 NVL 모드 게임을 만드는 방법을 설명합니다. 빠른 시작 설명서에서 다룬 Ren'Py의 기본 사항을 이미 알고 있다고 가정합니다.
시작하기
두 단계로 Ren'Py 스크립트에 NVL 모드를 추가할 수 있습니다. 먼저 캐릭터를 NVL 모드로 선언하고 각 페이지 끝에 nvl
clear 문을 추가합니다.
각 Character 선언에 kind=nvl 매개변수를 추가하면 NVL 모드 캐릭터가 됩니다. 예를 들어 빠른 시작 설명서의 캐릭터 선언이 다음과 같다면:
define s = Character('실비', color="#c8ffc8")
define m = Character('나', color="#c8c8ff")
NVL 모드로 바꾸면 다음과 같습니다.
define s = Character('실비', kind=nvl, color="#c8ffc8")
define m = Character('나', kind=nvl, color="#c8c8ff")
다음 정의를 추가하여 NVL 모드 서술자를 사용할 수도 있습니다.
define narrator = nvl_narrator
여기에는 narrator의 NVL 모드 선언도 추가했습니다. narrator는 다른 캐릭터 이름이 지정되지 않은 문장을 말할 때 사용하는 캐릭터입니다.
이대로 실행하면 처음 몇 줄은 정상적으로 표시되지만 시간이 지나면 텍스트가 화면 아래쪽을 벗어납니다. 스크립트를 페이지로 나누려면 각 페이지 뒤에 nvl
clear 문을 추가합니다.
페이지를 나눈 스크립트 예제는 다음과 같습니다.
label start:
"물어보자..."
m "저기... 혹시..."
m "내 비주얼 노벨의 그림을 그려 줄래?"
nvl clear
"정적이 흐른다."
"그녀는 놀란 표정을 짓더니..."
s "좋아. 그런데 \"비주얼 노벨\"이 뭐야?"
nvl clear
일반적으로 NVL 모드 게임은 문단마다 텍스트가 더 많지만, 이 예제는 기본적인 NVL 모드 스크립트를 보여 줍니다. 화면 전환이 없는 키네틱 노벨에 적합합니다.
독백 모드도 NVL 모드에서 사용할 수 있습니다. {clear} 텍스트 태그를 한 줄에 단독으로 넣으면 독백 모드를 벗어나지 않고 nvl clear 문과 같은 동작을 수행합니다. 예를 들면 다음과 같습니다.
label start:
s """
이것은 독백 모드의 첫 번째 텍스트 블록입니다.
이것은 두 번째 블록으로, 첫 번째 블록과 같은 페이지에 있습니다.
{clear}
방금 페이지가 지워졌습니다!
"""
NVL 모드 창 표시와 숨기기
NVL 모드 창은 일반적인 window show 및 window hide 문으로 제어할 수 있습니다. 표시와 숨김에 사용할 기본 화면 전환을 선택하려면 게임에 다음을 추가합니다.
init python:
config.window_hide_transition = dissolve
config.window_show_transition = dissolve
기본 config.empty_window가 적절한 창을 자동으로 선택하지만, config.empty_window를 nvl_show_core로 설정하면 화면 전환 중 NVL 모드 창이 반드시 표시됩니다.
init python:
config.empty_window = nvl_show_core
window 명령으로 창을 표시하고 숨기는 예제는 다음과 같습니다.
label meadow:
nvl clear
window hide
scene bg meadow
with fade
window show
"우리는 고향 마을 외곽의 초원에 도착했다. 이곳의 가을은
무척 아름다웠다."
"어릴 때 우리는 여기에서 자주 놀았다."
m "저기... 음..."
window hide
show sylvie smile
with dissolve
window show
"그녀가 나를 돌아보며 미소 지었다."
"물어보자..."
m "음... 혹시..."
m "내 비주얼 노벨의 그림을 그려 줄래?"
NVL 모드 창을 명시적으로 표시하거나 숨기는 nvl show와 nvl hide 명령도 있습니다. 선택적으로 화면 전환을 받으며 NVL 모드와 ADV 모드 창을 함께 쓰는 게임에서 사용할 수 있습니다.
캐릭터 꾸미기
NVL 모드 캐릭터는 여러 표시 방식으로 꾸밀 수 있으므로 제작 중인 게임에 가장 적합한 모습을 선택할 수 있습니다.
기본 방식은 왼쪽에 캐릭터 이름을 표시하고 오른쪽에 대사를 들여씁니다. 이름 색상은 ''color'' 매개변수로 제어합니다.
define s = Character('실비', kind=nvl, color="#c8ffc8")
두 번째 방식은 캐릭터 이름을 텍스트 안에 넣고 대사를 따옴표로 감쌉니다. 이때 이름은 여는 따옴표와 함께 ''what_prefix'' 매개변수에 넣습니다. 닫는 따옴표는 ''what_suffix''에 넣습니다.
define s = Character(None, kind=nvl, what_prefix="실비: \"", what_suffix="\"")
세 번째 방식은 이름을 완전히 생략하고 대사를 따옴표로 감쌉니다.
define s = Character(None, kind=nvl, what_prefix="\"", what_suffix="\"")
세 번째 방식은 화자를 구분하기 어려울 수 있으므로 ''what_color''로 대사에 색을 입힐 수 있습니다.
define s = Character(None, kind=nvl, what_prefix="\"", what_suffix="\"", what_color="#c8ffc8")
물론 표시 내용을 완전히 직접 제어하려면 꾸미지 않은 NVL 모드 캐릭터를 사용할 수도 있습니다. 서술자에 자주 사용하는 방식입니다.
define s = Character(None, kind=nvl)
설정 변수
다음 설정 변수는 NVL 관련 기능을 제어합니다.
- define config.nvl_layer = "screens"
NVL 스크린을 표시할 레이어입니다.
- define config.nvl_list_length = None
None이 아니면 NVL 대사 리스트의 최대 길이입니다. 대사 높이를 고정하는 설정과 함께 사용하는 경우가 많으며, 무한 스크롤 NVL 창을 재현할 수 있습니다.
- define config.nvl_page_ctc = None
None이 아니면 페이지 끝의 NVL 모드 캐릭터에 사용할 클릭하여 계속 표시기입니다. 즉, 바로 뒤에 nvl clear 문이 있는 경우입니다.
Character()의 ctc 매개변수를 대체합니다.
- define config.nvl_page_ctc_position = "nestled"
None이 아니면 페이지 끝의 NVL 모드 캐릭터에 사용할 클릭하여 계속 표시기의 위치입니다. 즉, 바로 뒤에 nvl clear 문이 있는 경우입니다.
Character()의 ctc_position 매개변수를 대체합니다.
- define config.nvl_paged_rollback = False
참이면 NVL 모드에서 한 페이지씩 롤백합니다.
Python 함수
- nvl_clear()
nvl clear문에 대응하는 Python 함수입니다.
- nvl_hide(with_)
nvl hide문에 대응하는 Python 함수입니다.- with_
NVL 모드 창을 숨길 때 사용할 화면 전환입니다.
NVL 방식으로 메뉴를 표시하는 Python 함수입니다. 직접 사용하는 일은 드뭅니다. 대신 다음과 같이
menu변수에 할당합니다.define menu = nvl_menu
- nvl_show(with_)
nvl show문에 대응하는 Python 함수입니다.- with_
NVL 모드 창을 표시할 때 사용할 화면 전환입니다.
페이지 단위 롤백
페이지 단위 롤백은 Ren'Py가 텍스트 블록 하나씩 대신 NVL 모드 페이지 하나씩 롤백하도록 합니다. 스크립트에 다음을 추가하여 켤 수 있습니다.
init python:
config.nvl_paged_rollback = True
The Question 스크립트(NVL 모드 버전)
''The Question'' NVL 모드 버전의 전체 스크립트는 여기에서 볼 수 있습니다.