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 모드 메뉴

기본적으로 메뉴는 화면 전체를 사용하는 ADV 모드로 표시됩니다. 현재 페이지의 NVL 모드 텍스트 바로 뒤에 메뉴를 표시하는 NVL 모드 방식도 있습니다.

이 메뉴 표시 방식을 사용하려면 다음과 같이 작성합니다.

define menu = nvl_menu

선택한 뒤 메뉴가 사라지므로, 보통 메뉴 다음에 "nvl clear"를 쓰거나 선택 결과를 알려 주는 내용을 표시하는 것이 좋습니다.

메뉴 인수로 NVL 모드 메뉴를 사용할 수도 있습니다. nvl 인수에 True를 지정하면 됩니다. 한 게임에서 NVL 모드와 ADV 모드 메뉴를 섞어 쓸 때 유용합니다.

menu (nvl=True):
    "NVL 모드가 더 좋아요.":
        pass

    "저한테는 ADV 모드가 더 잘 맞아요.":
        pass

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 모드 캐릭터는 여러 표시 방식으로 꾸밀 수 있으므로 제작 중인 게임에 가장 적합한 모습을 선택할 수 있습니다.

  1. 기본 방식은 왼쪽에 캐릭터 이름을 표시하고 오른쪽에 대사를 들여씁니다. 이름 색상은 ''color'' 매개변수로 제어합니다.

    define s = Character('실비', kind=nvl, color="#c8ffc8")
    
  2. 두 번째 방식은 캐릭터 이름을 텍스트 안에 넣고 대사를 따옴표로 감쌉니다. 이때 이름은 여는 따옴표와 함께 ''what_prefix'' 매개변수에 넣습니다. 닫는 따옴표는 ''what_suffix''에 넣습니다.

    define s = Character(None, kind=nvl, what_prefix="실비: \"",
                         what_suffix="\"")
    
  3. 세 번째 방식은 이름을 완전히 생략하고 대사를 따옴표로 감쌉니다.

    define s = Character(None, kind=nvl, what_prefix="\"", what_suffix="\"")
    
  4. 세 번째 방식은 화자를 구분하기 어려울 수 있으므로 ''what_color''로 대사에 색을 입힐 수 있습니다.

    define s = Character(None, kind=nvl, what_prefix="\"", what_suffix="\"",
                         what_color="#c8ffc8")
    
  5. 물론 표시 내용을 완전히 직접 제어하려면 꾸미지 않은 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_menu(items)

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 모드 버전의 전체 스크립트는 여기에서 볼 수 있습니다.