스크린과 스크린 언어

사용자가 렌파이 게임에서 보게 되는 것은 이미지와 유저 인터페이스, 이 두 가지로 크게 나눌 수 있습니다. 이미지는 scene, show, hide 문을 사용해 표시되는 그림을 가리키며, 보통 비주얼 노벨이나 텍스트 어드벤처 게임에서는 게임의 한 부분이라고 말할 수 있습니다. 이미지가 아닌 다른 모든 것들은 유저 인터페이스입니다. 유저 인터페이스, 즉 UI는 스크린 언어를 이용하면 수정할 수 있습니다.

스크린이 나타나는 방법에는 네 가지가 있습니다:

  • 내부적으로. 스크립트 명령문이 실행될 때 렌파이 내부에서 자동으로 나타난다. 예를 들어 say 문은 say 스크린을 표시한다.
  • 자동적으로. 렌파이가 실행되거나 플레이어가 메인 메뉴로 돌아가는 경우 렌파이는 자동으로 main_menu 스크린을 나타낸다.
  • 버튼, 마우스 버튼, 키보드 키와 관련된 동작이 수행될 때. save 스크린은 플레이어가 우클릭을 하거나 esc 버튼을 누른 경우 나타난다. save 화면을 나타내는 on-screen 버튼을 정의했을 때도 세이브 스크린을 나타낼 수 있다.
  • 명시하는 것으로. 스크린을을 나타나게 하는 명령문을 사용하면 스크린이 나타난다.

한 번에 하나 이상의 스크린을 나타내는 것도 가능합니다.

스크린에는 두 가지 주요 기능이 있습니다. 그 중 첫 번째는 플레이어에게 정보를 보여주는 것입니다. 텍스트, 바, 이미지를 이용해 정보를 화면에 나타낼 수 있습니다. 이렇게 표시된 정보 가운데 일부는 게임 플레이에 중요한 역할을 합니다. 예를 들어 say 스크린은 캐릭터의 이름과 그 캐릭터가 하는 대사 등을 플레이어에게 보여주기 위해 사용됩니다.

두 번째 기능은 플레이어가 게임과 상호작용을 할 수 있도록 만들어주는 것입니다. 플레이어는 버튼과 바를 이용해 액션을 호출하거나 값을 조정할 수 있습니다. 렌파이에는 미리 정해진 액션이 있어서, 이를 적절히 이용한다면 사용자는 이를 통해 게임을 진행하거나 옵션을 조정하거나 게임을 세이브/로드할 수 있습니다. 게임 제작자가 파이썬으로 새로운 액션을 작성할 수도 있습니다.

스크린은 각 인터렉션이 시작될 때 업데이트 되며 업데이트 된 후에는 인터렉션이 재시작 됩니다.

스크린 코드는 스크린 외부에서 확인할 수 있는 부작용을 일으키지 않아야 합니다. 렌파이는 필요하다면 스크린 코드를 여러 번 실행할 것입니다. 스크린 코드는 해당 스크린이 처음 나타나기 이전에, 이미지 예측 프로세스의 일부로 실행됩니다. 따라서 스크린 코드에 부작용이 있다면, 예상보다 더 많이 발생할 수 있습니다.

각 스크린에는 그 스크린에 해당하는 영역이 있으며, 스크린의 영역 포함되어있는 변수에 값을 주기도 합니다. 스크린을 이용해 변수에 접근하면, 먼저 해당 스크린의 영역에서 변수가 있는지 검색하고 그 후에 전역 변수를 검색합니다.

스크린 언어

스크린을 나타내내는 가장 확실한 방법은 스크린 언어를 사용하는 것입니다. 스크린 언어는 새 스크린을 선언하는 명령문, 디스플레이어블을 화면에 추가하는 명령문, 제어 명령문으로 이루어져있습니다.

아래는 스크린 예제입니다.

screen say(who, what):
    window id "window":

        vbox:
            spacing 10

            text who id "who"
            text what id "what"

첫 번째 행은 screen 문으로, 스크린을 선언할 때 사용하는 렌파이 명령문입니다. 이 예제에서 스크린의 이름은 say 인데, 이 이름은 대화창을 표시하기 위한 스크린입니다. whowhat 이라는 매개변수를 입력 받습니다.

이 스크린에는 "window" 라는 id를 지닌 윈도우가 있습니다. 이 윈도우에는 세로 정렬 박스가 있으며, 이 세로 정렬 박스의 간격은 10 픽셀입니다. 또 이 세로 정렬 박스에 있는 텍스트 UI에는 필드가 2개 있습니다. 첫 번째 필드에는 캐릭터의 이름을 표시하는 변수가 지정되어있고, 다른 필드에는 캐릭터의 id가 저장되어있습니다.

스크린 언어 문법

스크린 언어 명령문은 대부분 통상 문법을 따릅니다. (어떤 제어문은 다른 문법을 따르기도 합니다.) 명령문은 행의 첫 부분에서 명령문을 이끄는 키워드로 시작합니다.

매개변수를 받는 명령문은 키워드 뒤에 바로 매개 변수가 붙습니다. 매개변수는 대부분 공백으로 구분되는 단순 연산식입니다.

위치적 매개변수는 속성 목록 앞에 위치합니다. 속성은 속성 이름과 그 뒤에 따라오는 속성값으로 구성되어있습니다. 속성값은 대부분 단순 연산식입니다. 속성 리스트는 공백으로 분리된 속성의 리스트입니다.

명령문이 콜론(:)으로 끝나면, 블록을 취하는 것입니다. 블록 안의 각 행은 다음 두 가지 중 하나이어야 합니다:

  • 속성 목록
  • 스크린 언어 명령문

Screen 문

screen 문은 새 스크린을 선언하기 위해 사용되는 렌파이 스크립트 언어 명령문입니다. 이 명령문은 스크린 언어의 통상 문법을 사용합니다.

screen문은 스크린 이름이라는 하나의 매개변수를 받습니다. 스크린 이름은 이름이며, 표헌식이 아닙니다. 다음과 같은 속성을 받습니다.:

modal
참이라면 그 스크린은 모달modal 타입이 된다. 모달 타입의 스크린은 기본 단축키를 제외하고는 다른 스크린에서 발생할 수 있는 상호작용을 방지한다.
tag
식이 아니라 이름으로 해석된다. 해당 스크린에 태그를 지정한다. 화면에 이미 표시된 스크린이 새로 표시할 스크린과 같은 태그를 가지고 있다면 기존 스크린은 사라지고 새로 나타날 스크린으로 대체된다. 한 번에 하나의 메뉴 화면만 나타나도록 할 때 사용할 수 있다.
zorder
스크린이 사용자와 얼마나 가까운 위치에 표시되는지를 결정한다. 숫자가 클 수록 플레이어와 가까운 위치에 표시된다. 기본값은 0이다.
variant
값이 설정된 경우 이 값은 화면 종류를 나타내는 문자열이어야 한다. 자세한 내용은 스크린 종류 를 참조하라.
style_group
이 스크린의 하위 디스플레이어블의 스타일에 지정할 접두사로 사용하는 문자열. 사용되는 방식은 이 곳에 설명된 대로.
screen hello_world():
     tag example
     zorder 1
     modal False

     text "Hello, World."

스크린은 매개변수 목록을 입력받을 수 있습니다.

screen center_text(s, size=42):
     text s size size

유저 인터페이스 문

UI문을 이용하면 디스플레이어블을 생성하고, 스크린이나 다른 디스플레이어블에 디스플레이어블을 추가할 수 있습니다. UI를 통해 사용자에게 정보를 보여주거나, 사용자가 게임과 상호작용하거나 게임이 다양한 이벤트에 반응하게 됩니다.

모든 UI문은 아래의 속성을 공통으로 받습니다.:

at

해당 디스플레이어블을 래핑할 때 사용되는 트랜스폼, 혹은 트랜스폼의 리스트. show, hide, replace, replaced 같은 외부 이벤트는 스크린에 직접 추가된 트랜스폼에만 전달된다.

예를 들어 vbox가 트랜스폼 안에 래핑되어있고, 스크린에 직접 추가되었다면 이벤트는 vbox를 래핑하는 트랜스폼에 전달된다. 그러나 트랜스폼이 vbox에 들어있는 텍스트 버튼을 래핑하고 있다면 이 트랜스폼은 이벤트를 받지 못한다.

default
주어진 값이 참이라면 해당 디스플레이어블이 기본적으로 포커스를 얻은 상태가 된다. 한 디스플레이어블만 이 값을 가지고 있어야 한다.
id

UI 문 식별자. 스크린이 나타났을 때 해당 id를 가지고 있는 디스플레이어블에 속성값을 공급할 수도 있다. say스크린과 같은 일부 스크린에는 특정한 id가 주어진 디스플레이어블이 반드시 있어야 한다.

보통 id는 자동으로 생성된다.

style
디스플레이어블에 적용할 스타일 이름. 스타일 이름이 적힌 문자열이 될 수도 있고 스타일 객체가 될 수도 있다. 스타일은 스타일 속성에 기본값을 제공한다.
style_group

디스플레이어블과 이 디스플레이어블의 하위 디스플레이어블에에 적용할 스타일 이름에 공통으로 들어있는 접두사를 지정할 때 사용된다. (더 특정한 스타일 그룹 세트가 이미 지정된 경우에는 제외)

예를 들어 vbox가 "pref" 라는 그룹이 지정되었다면, vbox에 특정한 스타일이 지정되지 않은 경우에는 "pref_vbox" 의 스타일이 적용된다. vbox 내에 있는 버튼의 스타일은 "pref_button" 가 된다.

이 때 접두사가 붙은 스타일 이름, 위의 예에서 pref_vbox가 없다면 렌파이는 해당 스타일을 자동으로 만들어 오류를 방지한다.

None 그룹을 설정하면 디스플레이어블과 그 하위 위젯 전부에 스타일 그룹 설정 작용이 비활성화된다.

focus
문자열이나 정수값을 받는다. 다음에 추가될 디스플레이어블 중에 어떤 디스플레이어블이 포커스를 얻어야 하는지를 결정할 때 사용하기 위해 디스플레이어블에 이름을 정한다. 인터렉션이 시작될 때 포커스를 얻어야 할 디스플레이어블을 고를 때 포커스 이름들 사이에서 이름이나 구조의 유사성을 검색한다. 어떤 박스에 포커스 이름이 주어지고, 그 박스에 있는 세 번째 버튼이 인터렉션이 끝난 무렵에 포커스를 얻고 있었다면, 그 버튼은 다음 인터렉션이 시작했을 때에도 강조 표시가 될 것이다.

UI문은 대부분 스타일 속성 클래스나 트랜스폼 속성을 받습니다. 이 속성들에는 스타일이 적용되어야할 때를 나타내는 스타일 접두사를 사용할 수도 있습니다. 예를 들어 text 에 hover_size 속성이 적용되면 텍스트에 마우스가 올려졌을 때의 텍스트 크기를 설정할 수 있습니다.

Add

이미지나 다른 디스플레이어블을 화면에 추가합니다. 트랜스폼 속성 도 받을 수 있습니다. 최소 하나의 트랜스폼 속성이 주어지면 이미지를 래핑하기 위한 트랜스폼이 생성되고, 속성이 트랜스폼에 입력됩니다.

디스플레이어블이 None 이면 스크린에 아무 것도 추가되지 않는다.

하위 위젯을 받지 않습니다.

screen add_test():
    add "logo.png" xalign 1.0 yalign 0.0

Bar

데이터 확인이나 데이터 조절에 이용할 수 있는 가로방향 바를 생성합니다. 다음 속성을 받습니다.:

value
현재 바의 값. BarValue 객체나 숫자를 입력할 수 있다.
range
바의 최대값. value 가 숫자인 경우에 필요하다.
adjustment
이 바가 조절할 ui.adjustment() 객체.
changed
파이썬 함수를 값으로 주어야 한다. adjustment가 바뀌면 adjustment의 값과 이 함수가 호출된다.
hovered
바가 포커스를 얻었을 때 실행할 액션.
unhovered
바가 포커스를 잃었을 때 실행할 액션.

valueadjustment 중 하나에는 반드시 값을 주어야 합니다. 이 함수는 아래의 속성도 받습니다.:

하위 디스플레이어블은 받지 않습니다.

screen volume_controls():
    frame:
        has vbox

        bar value Preference("sound volume")
        bar value Preference("music volume")
        bar value Preference("voice volume")

Button

액션을 실행하기 위해 작동시킬 수 있는 스크린 영역을 생성합니다. 버튼은 매개 변수를 받지 않으며, 아래와 같은 속성을 받습니다.

action
버튼이 작동되었을 때 실행할 액션. 버튼은 클릭 당하거나 키보드로 선택이 되어 엔터 버튼이 눌렸을 때 작동한다. 액션으로 버튼이 작동할 수 있는 상태인지, 선택된 상태인지를 결정할 수도 있다.
alternate
버튼이 다른 방식으로 작동되었을 때 실행할 액션. 마우스 기반 플랫폼에서 플레이어가 버튼을 우클릭하거나, 터치 기반 플랫폼에서 버튼을 길게 터치한 경우에 alternate에 지정한 액션이 실행된다.
hovered
버튼이 포커스를 얻었을 때 실행할 액션.
unhovered
버튼이 포커스를 얻지 못했을 때 실행할 액션.

다음의 속성도 받습니다. :

하위 디스플레이어블을 하나 포함합니다. 하위가 없거나 둘 이상을 입력 받은 경우에는 그 버튼에 추가된 fixed이 하위 디스플레이어블을 받게 됩니다.

Fixed

하위 디스플레이어블이 추가될 수 있는 영역을 생성합니다. 일반적으로 Fixed는 사용할 수 있는 영역을 만들어내기 위해 확장되지만 xmaximumymaximum 속성으로 이를 변경할 수 있습니다.

Fixed의 하위 디스플레이어블은 저마다에 적용된 위치 스타일 속성에 따라 배치됩니다. 위치를 적절히 정해놓지 않았다면 서로 겹칠 수 있습니다.

Fixed 문은 매개변수를 받지 않으며 아래와 같은 속성 그룹을 받습니다. :

Fixed는 하위 디스플레이어블을 무한대로 받을 수 있습니다.

Fixed 디스플레이어블을 일부러 만들 필요는 거의 없습니다. 각 스크린은 Fixed 디스플레이어블에 포함되어 있으며, 디스플레이어블 하나에 하위 디스플레이어블이 두 개 이상 만들어질 때에는 Fixed 디스플레이어블이 자동으로 만들어지기 때문입니다.

screen ask_are_you_sure:
    fixed:
         text "확실합니까?" xalign 0.5 yalign 0.3
         textbutton "네" xalign 0.33 yalign 0.5 action Return(True)
         textbutton "아니오" xalign 0.66 yalign 0.5 action Return(False)

Frame

Frame은 버튼, 바, 텍스트 등의 UI 요소를 표시하는 배경을 포함하는 창입니다. 다음과 같은 속성 그룹을 받습니다:

하위 디스플레이어블을 하나 받습니다. 하위 위젯이 없거나 둘 이상이 만들어질 때에는 자동으로 Fixed가 만들어집니다.

screen test_frame():
    frame:
        xpadding 10
        ypadding 10
        xalign 0.5
        yalign 0.5

        vbox:
            text "화면"
            null height 10
            textbutton "전체 화면 모드" action Preference("display", "fullscreen")
            textbutton "창 모드" action Preference("display", "window")

Grid

하위 디스플레이어블을 표와 같은 형태로 표시합니다. 하위 디스플레이어블들이 표시되는 각 영역의 크기는 가장 큰 하위 디스플레이어블이 표시되는 영역의 크기와 같습니다.

매개변수를 두 개 받습니다. 첫 번째는 표의 세로줄 개수, 두 번째는 가로줄 개수입니다. 아래와 같은 속성을 받습니다:

transpose
기본값인 거짓일 경우, 가로줄이 먼저 채워진다. 참이면 세로줄 먼저 채워진다.
spacing
표의 가로 및 세로 간격.

다음 속성도 받습니다.:

가로줄과 세로줄 수를 곱한 것과 같은 수의 하위 디스플레이어블을 받아야 합니다. 그렇지 않으면 오류가 발생합니다.

screen grid_test:
     grid 2 3:
         text "왼쪽 위"
         text "오른쪽 위"

         text "왼쪽 가운데"
         text "오른쪽 가운데"

         text "왼쪽 아래"
         text "오른쪽 아래"

Hbox

하위 디스플레이어블을 보이지 않는 박스에 가로방향으로 정렬해 나란히 표시합니다. 매개 변수를 받지 않으며 다음과 같은 속성 그룹을 받습니다.:

Hbox에 추가된 디스플레이어블의 하위 디스플레이어블 역시 Hbox에 추가됩니다.

screen hbox_text():
    hbox:
         text "왼쪽"
         text "오른쪽"

Imagebutton

이미지를 사용해 버튼을 생성합니다. 이 버튼에 사용되는 이미지는 사용자가 마우스 커서를 올려놓았을 때 바뀔 수도 있습니다. 매개 변수를 받지 않으며 다음과 같은 속성을 받습니다:

auto

이 버튼이 사용하는 이미지를 자동으로 정의할 때 사용된다. %s를 포함하는 문자열이어야 한다. 버튼에 필요한 이미지 속성 중에서 값이 주어지지 않은 속성이 있다면 %s 가 그 속성의 이름으로 대체되고, 그 때 만들어진 값이 해당 속성의 기본값으로 사용된다.

예를 들어 auto 에 "button_%s.png"라는 값을 주고, idle 속성에 이미지를 입력하지 않았다면 idle 속성의 기본값은 "button_idle.png"가 된다. 이와 비슷하게, auto 가 "button %s" 이라면 button idle 이미지가 사용된다.

auto 가 작동하는 방식은 config.imagemap_auto_function 으로 바꿀 수 있다.

insensitive
버튼에 액션이 주어지지 않았을 때 사용되는 이미지.
idle
버튼이 포커스를 얻지 못했을 때 사용되는 이미지.
hover
버튼이 포커스를 얻었을 때 사용되는 이미지.
selected_idle
버튼이 선택되었으나 포커스를 얻지 못했을 때 사용되는 이미지.
selected_hover
버튼이 선택되었고 포커스를 얻었을 때 사용되는 이미지.
action
버튼이 작동한 경우에 실행할 액션. 액션으로 버튼이 작동할 수 있는 상태인지, 선택된 상태인지를 결정할 수도 있다.
alternate
버튼이 다른 방식으로 작동되었을 때 실행할 액션. 마우스 기반 플랫폼에서 플레이어가 버튼을 우클릭하거나, 터치 기반 플랫폼에서 버튼을 길게 터치한 경우에 alternate에 지정한 액션이 실행된다.
hovered
버튼이 포커스를 얻었을 때 실행할 액션.
unhovered
버튼이 포커스를 잃었을 때 실행할 액션.

다음 속성도 받습니다.:

하위 디스플레이어블을 받지 않습니다.

screen gui_game_menu():
     vbox xalign 1.0 yalign 1.0:
          imagebutton auto "save_%s.png" action ShowMenu('save')
          imagebutton auto "prefs_%s.png" action ShowMenu('preferences')
          imagebutton auto "skip_%s.png" action Skip()
          imagebutton auto "afm_%s.png" action Preference("auto-forward mode", "toggle")

Input

사용자에게서 텍스트를 입력 받을 텍스트 입력 영역을 생성합니다. 사용자가 엔터 등의 반환키를 누르기 전까지 인터렉션으로 입력 받은 텍스트가 반환됩니다. (input 이 포함된 스크린이 call screen 문으로 작동했을 때, 그 결과값은 _return 변수에 저장됩니다. )

매개 변수는 받지 않으며 아래와 같은 속성을 받습니다.:

default
input에 적힐 기본 텍스트.
length
입력받을 텍스트의 최대 길이.
pixel_width
Input의 최대 픽셀 길이. 이 길이를 초과할 만큼 문자를 입력하면 키입력을 무시한다.
allow
input 에 입력될 수 있는 문자를 포함하는 문자열. 기본적으로는 모든 문자의 입력을 허용한다.
exclude
input 에 입력할 수 없는 문자를 포함하는 문자열. 기본값은 "{}".
prefix
사용자가 입력한 텍스트 앞에 붙는 고정 문자열.
suffix
사용자가 입력한 텍스트 뒤에 붙는 고정 문자열.
changed
입력받은 문자열이 바뀔 때, 사용자가 입력한 텍스트와 함께 호출되는 파이썬 함수.

다음 속성도 받습니다:

하위 디스플레이어블을 받지 않습니다.

screen input_screen():
    window:
        has vbox

        text "이름을 입력하세요."
        input default "Joseph P. Blow, ESQ."

Key

특정 키가 눌렸을 경우 그에 할당된 액션을 실행하는 단축키를 만듭니다. 여기에서 Key는 조이스틱이나 마우스 이벤트까지도 포함하는 넓은 의미로 사용했습니다.

Key는 단축키로 만들 키 이름이 적힌 문자열을 위치매개변수로 입력 받습니다. 사용할 수 있는 키 이름에 대한 설명은 단축키 설정하기 항목을 참조하세요. Key는 속성을 하나만 받습니다.:

action
매개변수로 입력된 키가 눌릴 경우 실행할 액션. 이 속성은 필수 속성이다.

하위 디스플레이어블을 받지 않습니다.

screen keymap_screen():
    key "game_menu" action ShowMenu('save')
    key "p" action ShowMenu('preferences')
    key "s" action Screenshot()

Label

레이블 스타일을 사용하는 창을 만들어 텍스트를 창 안에 배치합니다. Frame 안에 있는 무언가에 이름표를 붙일 때 사용됩니다.

이름표로 사용할 텍스트를 위치 인수로 입력 받으며 다음 속성을 받습니다.:

text_style
버튼 텍스트에 사용할 스타일의 이름. 스타일 이름을 입력하지 않거나 style 속성이 문자열인 경우에는 주어진 문자열 뒤에 "_text" 를 추가하여 기본 텍스트 스타일을 적용하도록 한다.
text_
text 라는 접두사가 붙은 속성들은 모두 text 접두사를 제거한 뒤, 텍스트 디스플레이어블에 전달한다.

다음 속성도 받습니다.:

하위 디스플레이어블은 받지 않습니다.

screen display_preference():
    frame:
        has vbox

        label "디스플레이"
        textbutton "전체 화면" action Preference("display", "fullscreen")
        textbutton "창 모드" action Preference("display", "window")

Null

Null 문은 스크린에 빈 영역을 삽입합니다. 디스플레이어블 사이에 빈 공간을 넣을 때 사용됩니다. 매개 변수를 받지 않으며 다음 속성을 받습니다.:

width
빈 영역의 가로길이. 픽셀단위.
height
빈 영역의 세로길이. 픽셀단위.

다음 속성도 받습니다:

하위 디스플레이어블은 받지 않습니다.

screen text_box():
    vbox:
         text "제목."
         null height 20
         text "이것은 본문입니다."

Mousearea

마우스 영역이란 마우스가 접근하거나 멀어질 때 반응하는 영역입니다. 버튼과 다르게 마우스 영역은 포커스를 얻지 않으므로 버튼 안에 마우스 영역을 만들 수도 있습니다. mousearea문은 매개변수를 받지 않고 아래 속성을 받습니다. :

hovered
마우스 영역에 마우스가 진입했을 때 실행할 액션.
unhovered
마우스가 마우스 영역에서 멀어질 때 실행할 액션.
focus_mask
focus_mask 스타일 속성으로, 디스플레이어블 또는 None 이어야 한다. 디스플레이어블로 설정했다면 마우스영역은 해당 디스플레이어블의 불투명한 영역에 마우스가 있을 때에만 hovered 상태가 될 것이다. (여기에 설정한 디스플레이어블은 유저에게 보이지 않는다.)

다음과 같은 속성을 받습니다:

하위 위젯은 받지 않습니다.

평소에는 mousearea문에 마우스 영역의 크기와 위치를 제어하는 area 스타일 속성이 설정됩니다. 크기를 지정하지 않으면 마우스 영역이 화면 전체를 차지해 쓸모 없는 동작을 하므로 주의해야 합니다.

주석

렌파이 게임은 키보드와 조이스틱으로도 플레이할 수 있기 때문에 mousearea 를 이용하는 기능은 다른 방법으로 다시 한 번 더 만들어야 할 수도 있습니다.

screen button_overlay():
    mousearea:
        area (0, 0, 1.0, 100)
        hovered Show("buttons", transition=dissolve)
        unhovered Hide("buttons", transition=dissolve)

screen buttons():
    hbox:
        textbutton "저장" action ShowMenu("save")
        textbutton "옵션" action ShowMenu("preferences")
        textbutton "스킵" action Skip()
        textbutton "자동진행" action Preference("auto-forward", "toggle")

label start:
    show screen button_overlay

Side

디스플레이어블을 표의 중심이나 구석에 배치합니다. 매개 변수로는 하위 디스플레이어블을 놓을 위치 목록이 공백으로 구분된 문자열 하나를 받습니다. 문자열을 구성하는 요소는 다음 중 하나이어야 합니다.:

'c', 't', 'b', 'l', 'r', 'tl', 'tr', 'bl', 'br'

'c' 는 가운데(center), 't' 는 위(top), 'tl' 위 왼쪽 (top left), 'br' 는 아래 오른쪽(bottom right)를 뜻합니다.

Side 는 다음과 같은 속성을 받습니다.:

spacing
표의 행과 열 사이를 차지하는 공간의 크기.

아래와 같은 속성 그룹을 받습니다.:

Side를 렌더링할 때에는 제일 먼저 모서리, 그 다음에는 측면, 마지막에는 중앙의 크기를 정합니다. 모서리와 측면은 사용 가능한 영역의 크기가 0부터 시작하기 때문에 xminimumyminimum 로 최소 사이즈를 정해, 전부 렌더링될 수 있도록 해야 하는 경우도 있습니다.

하위 디스플레이어블의 위치 목록과 일대일 대응을 해서 표시되기 때문에, 위치 목록에 적힌 위치 갯수와 Side에 추가될 하위 디스플레이어블의 수는 같아야 합니다.

screen side_test():
     side "c tl br":
          text "가운데"
          text "왼쪽 위"
          text "오른쪽 아래"

Text

글자를 표시합니다. 화면에 표시할 텍스트를 하나의 매개 변수로 받습니다. 다음의 속성 그룹을 받습니다.:

하위 위젯은 받지 않습니다.

screen hello_world():
    text "Hello, World." size 40

Textbutton

텍스트 레이블을 포함하는 버튼을 생성합니다. 버튼의 일부가 될 텍스트를 하나의 매개변수로 받습니다. 다음과 같은 속성도 받습니다:

action
버튼이 작동한 경우에 실행할 액션. 액션으로 버튼이 작동할 수 있는 상태인지, 선택된 상태인지를 결정할 수도 있다.
alternate
버튼이 다른 방식으로 작동되었을 때 실행할 액션. 마우스 기반 플랫폼에서 플레이어가 버튼을 우클릭하거나, 터치 기반 플랫폼에서 버튼을 길게 터치한 경우에 alternate에 지정한 액션이 실행된다.
hovered
버튼이 포커스를 얻었을 때 실행할 액션.
unhovered
버튼이 포커스를 잃었을 때 실행할 액션.
text_style
버튼 텍스트에 사용할 스타일의 이름.

스타일 이름을 입력하지 않거나 style 속성이 문자열인 경우에는 주어진 문자열 뒤에 "_text" 를 추가하여 기본 텍스트 스타일을 적용하도록 한다.

text_
text 라는 접두사가 붙은 속성들은 모두 text 접두사를 제거한 뒤, 텍스트 디스플레이어블에 전달된다.

다음 속성도 받습니다.:

하위 디스플레이어블은 받지 않습니다.

screen textbutton_screen():
    vbox:
        textbutton "음주" action Jump("wine")
        textbutton "여자" action Jump("women")
        textbutton "가무" action Jump("song")

Timer

시간이 지날 때마다 액션을 실행하는 timer를 생성합니다. 초 단위의 제한시간을 매개 변수로 받습니다. 다음과 같은 속성을 받는다:

action
타이머가 만료될 때 실행할 액션. 이 속성은 필수이다.
repeat
True면 제한시간이 다 되어도 타이머를 반복한다.

하위 디스플레이어블은 받지 않습니다.

screen timer_test():
    vbox:
         textbutton "네." action Jump("yes")
         textbutton "아니오." action Jump("no")

    timer 3.0 action Jump("too_slow")

Transform

하위 디스플레이어블에 트랜스폼을 적용합니다. 매개 변수는 없으며 아래의 속성 그룹을 받습니다.:

하위 디스플레이어블을 하나 받아야 합니다.

Vbar

세로 방향으로 만들어지는 bar 입니다. 받는 속성도 bar 와 같습니다.

screen volume_controls():
     frame:
         has hbox

         vbar value Preference("sound volume")
         vbar value Preference("music volume")
         vbar value Preference("voice volume")

Vbox

하위 디스플레이어블을 보이지 않는 박스에 세로방향으로 정렬해 나란히 표시합니다. 매개 변수를 받지 않으며 다음과 같은 속성 그룹을 받습니다.:

Vbox에 추가된 디스플레이어블의 하위 디스플레이어블 역시 Vbox에 추가됩니다.

screen vbox_test():
    vbox:
         text "위."
         text "아래."

Viewport

뷰포트는 스크롤바나 마우스 휠 혹은 드래그로 스크롤할 수 있는 화면 영역입니다. 화면 해상도보다 큰 것을 표시할 때 사용할 수 있습니다. 다음 속성을 받습니다.:

child_size
하위 디스플레이어블에 설정되는 렌더링 크기. (xsize, ysize) 튜플. 하위 디스플레이어블의 사이즈를 계산할 수 있다면 보통은 생략할 수 있다. 이 값이 None이라면 하위 디스플레이어블의 크기가 대신 사용된다.
mousewheel
True면 마우스 휠을 이용해 뷰포트를 스크롤할 수 있다.
draggable
True면 마우스를 드래그해서 뷰포트를 스크롤할 수 있다.
edgescroll

마우스가 뷰포트 가장자리에 닿을 때의 스크롤을 제어한다. None 이 아니라면 이 값은 두 개나 세 개의 요소로 이루어진 튜플이어야 한다.:

  • 첫 번째 요소는 뷰포트 가장자리에서부터

시작되는 간격으로 가장자리스크롤링이 시작되는 폭이다. 픽셀 단위이다.

  • 두 번째 요소는 최대 스크롤 속도이다.

초당 표시할 픽셀이다.

  • 세 번째 요소가 존재하는 경우, 이 요소는 마우스 포인터가

가장자리에 가까운 정도에 따라 스크롤 속도를 조정하는 함수이어야 한다. 이 함수는 -1.0 이상 1.0 미만의 숫자를 받아야 하며, 같은 범위에 있는 값을 반환해야 한다. 기본 함수는 입력받은 값을 반환하고 이에 비례하는 스크롤 속도를 구현한다. -1.0 또는 1.0을 반환하는 함수는 입력 받는 값이 음수인지 양수인지에 따라 일정한 스크롤 속도를 구현한다.

xadjustment
뷰포트의 x축에 사용되는 ui.adjustment(). 생략된 때에는 새 adjustment가 생성된다.
yadjustment
뷰포트의 y축에 사용되는 ui.adjustment(). 생략된 때에는 새 adjustment가 생성된다.
xinitial
가로방향 오프셋의 초기값. 픽셀 수를 나타내는 정수이거나 오프셋의 비율을 나타내는 부동소수점이어야 한다.
yinitial
세로방향 오프셋의 초기값. 픽셀 수를 나타내는 정수이거나 오프셋의 비율을 나타내는 부동소수점이어야 한다.
scrollbars

None이 아니라면 이 뷰포트에 추가할 스크롤바이어야 한다. Side 레이아웃을 만든 후 뷰포트를 Side 의 가운데에 두는 방식으로 작동한다. scrollbars 가 "horizontal" 이라면, 가로 스크롤바를 뷰포트 아래에 배치한다. scrollbars 가 "vertical" 이라면 세로 스크롤바를 오른쪽에 둔다. scrollbars 가 "both" 라면 가로 및 세로 스크롤바를 만든다.

scrollbars 가 None이 아니라면 뷰포트는 접두사 "side" 가 붙은 속성을 받는다. 이 속성은 만들어진 Side 레이아웃에 전달된다.

추가로, 아래의 스타일 속성 그룹도 받습니다. :

하위 디스플레이어블은 하나를 받습니다. 없거나 둘 이상이 만들어질 때에는 자동으로 Fixed가 생성됩니다.

스크롤할 수 있는 뷰포트를 만드려면 뷰포트에 id를 할당하고 그 id에 XScrollValue()YScrollValue() 를 사용하는 것이 대부분의 경우에 가장 좋은 방법입니다.

screen viewport_example():
    side "c b r":
         area (100, 100, 600, 400)

         viewport id "vp":
             draggable True

             add "washington.jpg"

         bar value XScrollValue("vp")
         vbar value YScrollValue("vp")

Window

Window 디스플레이어블은 게임에서 대사를 표시하는 배경이 포함된 창입니다. 다음과 같은 속성 그룹을 받습니다.:

하위 디스플레이어블을 하나 받습니다. 하위 디스플레이어블이 없거나 둘 이상이 만들어질 때에는 자동으로 Fixed가 생성됩니다.

screen say(who, what):
    window id "window"
        vbox:
            spacing 10

            text who id "who"
            text what id "what"

Imagemap 문

시각적 효과가 뛰어난 스크린을 만드는 가장 간편한 방법은 이미지맵을 만드는 것입니다. imagemap 문을 이용하여 이미지맵을 만들 때는 이미지를 6개 지정해야합니다. 핫스팟과 핫바를 이용하면 이미지 내에 사각형을 지정하고 그 영역에 값과 액션을 지정할 수 있습니다.

다음은 이미지맵을 사용한 환경설정 스크린의 예제입니다.

screen preferences():

    tag menu
    use navigation

    imagemap:
        auto "gui_set/gui_prefs_%s.png"

        hotspot (740, 232, 75, 73) action Preference("display", "fullscreen") alt _("Display Fullscreen")
        hotspot (832, 232, 75, 73) action Preference("display", "window") alt _("Display Window")
        hotspot (1074, 232, 75, 73) action Preference("transitions", "all") alt _("Transitions All")
        hotspot (1166, 232, 75, 73) action  Preference("transitions", "none") alt _("Transitions None")

        hotbar (736, 415, 161, 20) value Preference("music volume") alt _("Music Volume")
        hotbar (1070, 415, 161, 20) value Preference("sound volume") alt _("Sound Volume")
        hotbar (667, 535, 161, 20) value Preference("voice volume") alt _("Voice Volume")
        hotbar (1001, 535, 161, 20) value Preference("text speed") alt _("Text Speed")

Imagemap

imagemap문은 이미지맵을 지정하기 위해 사용됩니다. 매개 변수는 받지 않으며 다음 속성을 받습니다:

auto

이미지맵이 사용하는 이미지를 자동으로 정의할 떄 사용된다. %s를 포함하는 문자열이어야 한다. 이미지맵에 필요한 이미지 속성 중에서 값이 주어지지 않은 속성이 있다면 %s가 그 속성의 이름으로 대체되고, 그 때 만들어진 값이 해당 속성의 기본값으로 사용된다.

예를 들어 auto 에 "imagemap_%s.png"라는 값을 주고, idle 속성에 이미지를 입력하지 않았다면 idle의 기본값은 "imagemap_idle.png"가 된다.

auto 의 작동 방식은 config.imagemap_auto_function 으로 바꿀 수 있다.

ground
핫스팟이나 핫바를 포함하는 영역이 아닌 이미지맵의 일부분에 사용되는 이미지.
insensitive
작동하지 않는 핫스팟이나 핫바에 사용되는 이미지.
idle
핫스팟이 선택되지도, 포커스를 얻지도 못했을 때, 그리고 포커스를 얻지 못한 핫바의 빈 부분에 사용되는 이미지.
hover
핫스팟이 선택되지 않지만 포커스를 얻었을 때, 그리고 포커스를 얻은 핫바의 빈 공간에 사용되는 이미지.
selected_idle
핫스팟이 선택되지 않았으나 포커스를 얻었을 때, 그리고 포커스를 얻지 못한 핫바의 전체 영역에 사용되는 이미지.
selected_hover
핫스팟도 선택되고 포커스도 얻었을 때, 그리고 포커스를 얻은 핫바의 전체 영역에 사용되는 이미지.
alpha
이 값이 참이면 핫스팟은 불투명한 hover 이미지의 영역에 마우스가 올려져있을 때에만 포커스를 얻게 된다. 거짓이면 핫스팟은 사각형 영역 안에 마우스가 올려져만 있으면 언제라도 포커스를 얻는다.
cache
이 값이 참이면 핫스팟 데이터를 캐싱하여 디스크 공간을 추가로 사용하여 성능을 향상시킨다. 기본값은 참이다.

이미지맵은 다음과 같은 속성 그룹을 받습니다.:

이미지맵은 자동으로 Fixed를 생성해 핫스팟이나 핫바 외에 여러가지 UI를 하위 디스플레이어블로 추가합니다.

Hotspot

핫스팟은 이미지맵의 일부로 이루어진 버튼입니다. 매개 변수로는 이미지맵에 버튼을 생성할 영역을 지정하는 (x, y, width, height) 튜플을 받습니다. 아래와 같은 속성들도 받습니다.:

action
버튼이 작동한 경우에 실행할 액션. 액션으로 버튼이 작동할 수 있는 상태인지, 선택된 상태인지를 결정할 수도 있다.
alternate
버튼이 다른 방식으로 작동되었을 때 실행할 액션. 마우스 기반 플랫폼에서 플레이어가 버튼을 우클릭하거나, 터치 기반 플랫폼에서 버튼을 길게 터치한 경우에 alternate에 지정한 액션이 실행된다.
hovered
버튼이 포커스를 얻었을 때 실행할 액션.
unhovered
버튼이 포커스를 잃었을 때 실행할 액션.

다음 속성도 받습니다.:

핫스팟은 자동으로 Fixed를 생성하여 그 안에 하위 디스플레이어블을 추가합니다. Fixed는 핫스팟과 같은 크기의 영역을 가지며, 하위 디스플레이어블은 핫스팟 영역에 대응하는 위치에 배치됩니다.

핫스팟에는 읽어주기 기능이 작동할 수 있도록 alt 스타일 속성을 입력해야 합니다.

Hotbar

Hotbar는 이미지맵의 일부로 이루어진 바입니다. 매개 변수로는 바를 생성할 영역을 지정하는 (x, y, width, height) 튜플을 받습니다. 다음 속성을 받습니다.:

value
현재 바의 값. Value 객체나 숫자를 입력할 수 있다.
range
바의 최대값. value 가 숫자인 경우 필요하다.
adjustment
이 바가 조절하는 ui.adjustment() 객체.

value 나 adjustment 중 하나는 값이 반드시 입력해야 합니다. 이 함수는 다음과 같은 속성도 받습니다.:

하위 디스플레이어블을 받지 않습니다.

핫스팟에는 읽어주기 기능이 작동할 수 있도록 alt 스타일 속성을 입력해야 합니다.

고급 디스플레이어블

보통 사용되는 명령문 외에도 스크린 언어에서는 고급 디스플레이어블과 동일한 기능을 하는 명령문을 사용할 수 있습니다. 디스플레이어블의 위치 매개 변수는 명령문의 위치 매개변수가 됩니다. 키워드 인수와 스타일 속성들은 스크린 언어의 속성이 됩니다.

고급 디스플레이어블 명령문으로는 다음과 같은 것이 있습니다. :

drag
Drag 를 생성한다. 드래그는 하위 디스플레이어블을 하나 받거나 child 스타일 속성을 이용해 드래그의 하위 디스플레이어블과 드래그의 상태에 따라 표시될 디스플레이어블을 받을 수도 있다. 드래그는 또한 focus_mask 속성도 받을 수 있다.
draggroup
DragGroup. 을 생성한다. 드래그그룹에는 0개 이상의 드래그를 하위 디스플레이어블로 추가할 수 있다.

Has 문

has 문을 이용하면 Fixed 대신에 사용하려는 컨테이너를 지정해 has문의 상위 명령문이 하위 디스플레이어블을 하나만 받도록 지정할 수 있습니다. has 문은 하위 디스플레이어블을 하나만 가지는 명령문 안에서만 사용될 수 있습니다. has 키워드 다음에는 하나 이상의 하위 디스플레이어블을 받을 수 있는 컨테이너 디스플레이어블을 생성하는 명령문을 적어야 합니다.

has문을 작성하면 그 구문이 포함된 블록이 작동하는 방식이 바뀝니다. 블록 안에서 만들어진 하위 디스플레이어블은 상위 디스플레이어블이 아닌 컨테이너에 추가됩니다. 상위 디스플레이어블의 키워드 인수는 has 문 다음에 적을 수 없습니다. has 문은 같은 블럭 안에서 여러 개 사용할 수 있습니다.

has문은 다음과 같은 하위 디스플레이어블을 받을 수 있습니다.:

  • button
  • frame
  • window

has문은 다음과 같은 디스플레이어블 명령문을 컨테이너로 받을 수 있습니다.

  • fixed
  • grid
  • hbox
  • side
  • vbox
screen volume_controls():
     frame:
         has vbox

         bar value Preference("sound volume")
         bar value Preference("music volume")
         bar value Preference("voice volume")

제어문

스크린 언어에서는 조건부로 실행을 하거나, 반복하거나, 다른 스크린 포함하거나, 이벤트가 발생했을 때 실행할 액션을 지정하거나, 임의의 파이썬 코드를 실행할 때 필요한 제어문을 사용할 수 있습니다.

Default

default 문은 스크린이 처음 나타났을 때 특정 변수에 기본값을 설정합니다. SetScreenVariable()

default 문은 스크린에 인수로 전달되지 않은 변수나 use문으로 호출한 스크린에 상속되지 않은 변수의 기본값을 설정합니다.

screen scheduler():
    default club = None
    vbox:
         text "뭐하고 싶어?"
         textbutton "미술 동아리" action SetScreenVariable("club", "art")
         textbutton "글짓기 동아리" action SetScreenVariable("club", "writing")

         if club:
             textbutton "선택하기" action Return(club)

For

else 절을 지원하지 않는다는 점을 제외하면 파이썬의 for문과 비슷합니다. 변수뿐만 아니라 튜플 패턴을 배정하는 기능도 지원합니다.

$ numerals = [ 'I', 'II', 'III', 'IV', 'V' ]

screen five_buttons():
    vbox:
        for i, numeral in enumerate(numerals):
            textbutton numeral action Return(i + 1)

If

스크린 언어에서의 if문도 파이썬/렌파이의 if문과 동일합니다. if, elif, else절을 지원합니다.

screen skipping_indicator():
    if config.skipping:
         text "스킵하는 중."
    else:
         text "스킵 중지."

On

on문은 이벤트가 발생했을 때 스크린이 액션이 실행되도록 하는 명령문입니다. 문자열 형태의 이벤트 이름을 매개변수로 받습니다. 이벤트는 다음 중 하나이어야 합니다.:

  • "show"
  • "hide"
  • "replace"
  • "replaced"

이벤트 이름을 매개 변수로 받으면 on 문은 action 속성을 받게 되며, 해당 이벤트가 발생했을 때 실행할 액션을 지정할 수 있습니다.

screen preferences():
    frame:
        has hbox

        text "표시"
        textbutton "전체 화면" action Preferences("display", "fullscreen")
        textbutton "창 모드" action Preferences("display", "window")

    on "show" action Show("navigation")
    on "hide" action Hide("navigation")

Use

use문은 스크린이 다른 무언가를 포함할 수 있도록 하는 명령문입니다. 포함하려는 스크린의 이름을 받습니다. 그 뒤 괄호 안에 키워드 인수 리스트를 배치할 수도 있습니다.

use문을 사용해 포함한 스크린에 매개 변수가 있다면, 이 스크린의 영역는 매개 변수에 배정한 인수의 결과값으로 초기화됩니다. 그 외에는 현재 스크린에 전달된 인수 가운데 하나의 키워드 인수로 갱신된 스크린의 영역을 전달받습니다.

screen file_slot(slot):
    button:
        action FileAction(slot)

        has hbox

        add FileScreenshot(slot)
        vbox:
            text FileTime(slot, empty="빈 슬롯.")
            text FileSaveName(slot)


 screen save():
     grid 2 5:
         for i in range(1, 11):
              use file_slot(i)

use문은 id 라는 속성 하나를 받을 수 있습니다. 이 속성은 매개변수 목록이 있다면 다음에 입력해야 합니다. id 를 입력해 사용한 스크린은 같은 태그로 지정된 두 개의 스크린이 서로 동일한 하나의 스크린을 use문으로 사용할 때에만 유용할 것입니다. 이 경우, 한 스크린이 다른 스크린으로 교체될 때, use문으로 사용된 스크린의 상태가 이전 스크린에서 이후에 나타날 스크린으로 양도될 것입니다.

transform t1():
    xpos 150
    linear 1.0 xpos 0

screen common():
    text "테스트" at t1

screen s1():
    tag s
    use common id "common"
    text "s1" ypos 100

screen s2():
    tag s
    use common id "common"
    text "s2" ypos 100

label start:
    show screen s1
    pause
    show screen s2
    pause
    return

Use와 Transclude

use문은 스크린 언어 명령문이 포함된 블럭을 받을 수도 있습니다. 이런 블럭 하나를 받았을 때에, use문에서 사용하는 스크린은 transclude 문을 포함해야 할 것입니다. transclude 문은 use 명령문의 블럭에 내포되어 있는 명령문들로 교체됩니다.

이를 이용해 스크린으로 재사용할 수 있는 레이아웃을 정의할 수 있습니다. 다음은 예제입니다.

screen movable_frame(pos):
    drag:
        pos pos

        frame:
            background Frame("movable_frame.png", 10, 10)
            top_padding 20

            transclude

위와 같은 스크린은 다른 구성요소를 감싸고 있는 구성요소를 재사용할 수 있음을 의미합니다. 이 스크린이 어떻게 사용될 수 있는지는 아래 예제를 참고하세요.:

screen test:
    use movable_frame((0, 0)):
        text "나는 드래그할 수 있는 프레임이야."

    use movable_frame((0, 100)):
        vbox:
            text "나도 드래그할 수 있어."
            textbutton "이해했어!" action Return(True)

use와 transclude 는 제작자 정의 스크린 언어 명령문 의 기반을 형성하는 명령문입니다.

Python

스크린 언어에는 파이썬 코드를 실행할 수 있는 한 줄 이상의 파이썬 명령문도 있습니다. 이 코드는 스크린 영역 안에서 실행됩니다.

파이썬 코드는 스크린 외부에서 확인할 수 있는 부작용을 일으키지 않아야 합니다. 렌파이는 필요하다면 스크린 코드를 여러 번 실행할 것입니다. 스크린 코드는 해당 스크린이 처음 나타나기 이전에, 이미지 예측 프로세스의 일부로써 실행됩니다. 따라서 스크린 코드에 부작용이 있다면, 예상보다 더 많이 발생할 수 있습니다.

screen python_screen:
    python:
        test_name = "Test %d" % test_number

    text test_name

    $ test_label = "test_%d" % test_label

    textbutton "테스트 실행하기" action Jump(test_label)

Showif 문

showif 문은 하나의 조건을 받습니다. 이 조건이 참일 때에는 하위 디스플레이어블을 표시하고, 거짓일 때에는 하위 디스플레이어블을 숨깁니다. showif 의 하위 디스플레이어블들에 트랜스폼이 적용되어 있다면, showif는 show 와 hide 과정을 관리하기 위해 그 하위 디스플레이어블에 ATL 이벤트를 전달해, 디스플레이어블이 나타나고 사라지는 과정에 렌파이가 움직임을 표현할 수 있도록 합니다.

여러 showif문은 하나의 showif/elif/else 구조로써 그룹 형태로 표현할 수 있습니다. if문과 다르게 showif문은 조건이 거짓이더라도 파이썬 코드를 포함한 모든 블럭을 실행합니다. showif문은 사라지는 하위 디스플레이어블도 생성해야 하기 때문입니다.

showif문은 3가지 이벤트를 하위 디스플레이어블에 전달합니다.:

appear
스크린이 처음 등장했을 때 조건이 참인 경우 즉시 하위 디스플레이어블을 표시하기 위해 전달되는 이벤트.
show
조건이 거짓에서 참으로 바뀔 때 전달되는 이벤트.
hide
조건이 참에서 거짓으로 바뀔 때 전달되는 이벤트.

이를 위해 elif 절의 조건은 선행하는 조건이 참인 경우에 언제나 거짓이 됩니다. 반면 else 절은 선행 조건들이 모두 거짓인 경우에만 참이 됩니다.

다음은 예제입니다.

transform cd_transform:
    # 이 행은 appear, show, hide 이벤트 전에 실행됩니다.
    xalign 0.5 yalign 0.5 alpha 0.0

    on appear:
        alpha 1.0
    on show:
        zoom .75
        linear .25 zoom 1.0 alpha 1.0
    on hide:
        linear .25 zoom 1.25 alpha 0.0

screen countdown():
    default n = 3

    vbox:
        textbutton "3" action SetScreenVariable("n", 3)
        textbutton "2" action SetScreenVariable("n", 2)
        textbutton "1" action SetScreenVariable("n", 1)
        textbutton "0" action SetScreenVariable("n", 0)

    showif n == 3:
        text "3" size 100 at cd_transform
    elif n == 2:
        text "2" size 100 at cd_transform
    elif n == 1:
        text "1" size 100 at cd_transform
    else:
        text "발사!" size 100 at cd_transform

label start:
    call screen countdown

스크린 명령문

스크린 언어 외에도, 스크린과 관련된 렌파이 스크립트 언어 명령문이 3개 있습니다.

이 가운데 두 명령문은 키워드 인수 목록을 받습니다. 이것은 파이썬 인수 목록으로, 괄호로 감싸인 키워드 인수로만 이루어져있습니다. 위치 인수, 추가 위치 인수(*), 추가 키워드 인수(**)는 허용하지 않습니다.

Show Screen

show 스크린은 화면에 스크린을 나타나도록 합니다. 스크린의 이름과 추가 인수 목록을 받습니다. 인수 목록이 있으면 스크린 범위 초기화에 사용됩니다.

show screen문은 스크린 예측이 발생하는 것을 방지하는 nopredict 키워드를 받을 수 있습니다. 스크린 예측을 하는 중에는 스크린에 사용된 인수들이 계산됩니다. 스크린 인수를 계산하는 것이 예상하지 못한 부작용을 발생시키지 않도록 하기 바랍니다.

경고

스크린 인수를 계산하는 것이 부작용을 일으킨다면 제작한 게임이 예상하지 못한 동작을 할 수도 있습니다.

show screen문을 사용해 나타난 스크린은 명령문을 사용해서 숨길 때 까지 화면에 계속 남아있습니다. 이를 이용해 화면에 무언가를 덧붙여 표시하는 용도로 활용할 수 있습니다.

show screen overlay_screen
show screen clock_screen(hour=11, minute=30)

if rare_case:
    show rare_screen nopredict

Hide Screen

hide문은 현재 나타나있는 스크린을 숨길 때 사용합니다. 숨기려는 스크린이 화면에 나타나지 않았다면 아무 일도 일어나지 않습니다.

hide screen overlay_screen
hide screen clock

Call Screen

call screen 문은 스크린을 표시하고, 현재 인터렉션이 끝나면 스크린을 숨깁니다. 스크린이 값을 반환한다면 그 값은 _return 변수에 저장됩니다.

그러므로 call screen 명령문은 이미지맵을 표시할 때 사용할 수 있습니다. 이미지맵을 이용할 때 Return() 액션을 사용해서 _return 변수에 값을 배정하거나 Jump() 액션을 이용하여 특정 레이블로 점프할 수 있습니다.

call screen문은 스크린 예측이 발생하는 것을 방지하는 nopredict 키워드를 받을 수 있습니다. 스크린 예측을 하는 중에는 스크린에 사용된 인수들이 계산됩니다. 스크린 인수를 계산하는 것이 예상하지 못한 부작용을 발생시키지 않도록 하기 바랍니다.

경고

스크린 인수를 계산하는 것이 부작용을 일으킨다면 제작한 게임이 예상하지 못한 동작을 할 수도 있습니다.

call screen my_imagemap

call screen my_screen(side_effect_function()) nopredict

스크린 종류

렌파이는 마우스를 사용하는 윈도우, 맥, 리눅스 PC 등과 안드로이드 기반의 터치 스마트폰 및 태블릿에서도 작동합니다. 스크린 종류를 이용하면 게임에 다양한 버전의 스크린을 제공해, 게임이 작동하고 있는 하드웨어에 가장 적합한 버전의 스크린을 사용할 수 있습니다.

렌파이는 config.variants 변수에 나열된 순서대로 스크린 종류를 검색해서 사용할 스크린을 결정합니다. 검색을 통해 첫 번째로 발견한 스크린 종류를 사용합니다.

RENPY_VARIANT 환경설정 변수가 있다면, config.variants 에 배정된 변수 값이 공백을 기준으로 나뉘고 맨 마지막에 None 을 추가하는 방식으로 초기화됩니다. RENPY_VARIANT 에 "medium tablet touch" 또는 "small phone touch" 를 값으로 설정하면 Android 기기용으로 제작된 스크린을 PC에서 테스트할 수 있습니다.

환경변수가 없으면 다음 목록에 적힌 순서대로 스크린 종류를 조사한 다음 현재 게임이 작동 중인 플랫폼에 적합한 항목을 선택해 스크린 종류 목록을 자동으로 만듭니다.

"large"
상대적으로 작은 텍스트를 편하게 읽을 수 있으며 버튼을 쉽게 클릭할 수 있을 만큼 커다란 화면. 컴퓨터 화면에서 사용된다.
"medium"
자그마한 텍스트는 읽을 수 있으나 버튼을 쉽게 누르기 위해서는 버튼 크기가 커져야 하는 화면. 태블릿에서 사용된다.
"small"
텍스트가 읽을 수 있을 만큼 커져야 하는 화면. 휴대폰과 텔레비전에서 사용된다. (텔레비전의 경우 대개 물리 화면은 크나, 일반적으로 사용자가 먼 거리에서 화면을 보기 때문에 텍스트 읽기가 불편해진다.)
"tablet"
화면의 대각선 길이가 6인치 이상인 터치 스크린 기기에서 정의된다. (일반적으로 "tablet" 대신에 "medium" 이 사용될 것이다.)
"phone"
화면의 대각선 길이가 6인치보다 작은 터치스크린 기기에서 정의된다. 이렇게 작은 기기에서는 사용자가 버튼을 쉽게 선택할 수 있도록 버튼을 크게 만드는 것이 중요하다. (일반적으로 "phone" 대신 "small" 이 사용될 것이다.)
"touch"
터치스크린 기기에서 정의된다.
"tv"
TV 기반 기기에서 정의된다.
"ouya"
OUYA 콘솔에서 정의된다. ("tv""small" 도 함께 정의된다.)
"firetv"
Amazon Fire TV 콘솔에서 정의된다. ("tv""small" 도 함께 정의된다.)
"android"
안드로이드 기기에서 정의된다.
"ios"
iPad("tablet""medium" 도 함께 정의되는 환경) 및 iPhone ("phone""small" 도 함께 정의되는 환경) 과 같은 iOS 기기에서 정의된다.
"pc"
윈도우, 맥 OS X, 리눅스에서 정의된다. PC는 버튼에 마우스를 올리거나 어떤 지점을 정확히 가리킬 수 있는 마우스와 키보드가 있는 환경으로 간주한다.
None
항상 정의된다.

다음은 스크린 종류를 활용한 예제입니다.

# 작은 터치 전용 기기에서 사용할
# hello_world 스크린.
screen hello_world():
     tag example
     zorder 1
     modal False
     variant "small"

     text "Hello, World." size 30