목차

이전 항목

대사와 내래이션

다음 항목

선택지

링크


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

그림 표시하기

비주얼 노벨의 때깔은 비주얼, 즉 외관이 결정합니다. 렌파이에는 그림과 관련된 명령문과 그림 표시 순서를 결정하는 양식이 있습니다. 이를 이용하면 비주얼 노벨이나 기타 스토리텔링 게임에 사용하기 적합한 방식으로 그림를 나타낼 수 있습니다.

그림과 관련이 있는 명령문은 네 가지가 있습니다:

  • image - 새 그림을 정의합니다.
  • show - 레이어에 그림을 나타냅니다.
  • scene - 레이어를 비우고 비운 레이어에 또다른 그림을 나타냅니다.
  • hide - 레이어에서 그림을 지운다.

그림이 갑자기 나타나고 사라지면 게이머는 당황스러워할 수도 있습니다. 그러니 with 문을 이용해서 화면이 전환될 때 특별한 효과를 적용합시다.

개념

이미지

이미지는 show 문을 사용해 화면에 나타나는 무언가를 가리킵니다. 이미지는 이름과 디스플레이어블로 이루어져있습니다. 이미지가 레이어에 나타나면 그 이미지와 관련된 디스플레이어블이 레이어에 나타납니다.

이미지 이름 은 공백으로 구분된 하나 이상의 이름으로 구성되어 있습니다. 이미지 이름에서 가장 처음에 나와있는 것은 이미지 태그 입니다. 그 다음에 나타나는 요소들은 이미지 속성 입니다.

mary beach night happy 라는 이미지 이름을 예로 들면, 여기서 이미지 태그는 mary 이며, 이미지 속성은 beach, night, happy 입니다.

디스플레이어블은 화면에 나타날 수 있는 전부를 가리킵니다. 디스플레이어블을 사용하는 가장 대표적인 방법은 정적 이미지 이름에 그림 파일 이름을 문자열 형태로 지정해 이미지를 표시하는 것입니다. 예를 들면 위 예제에서 mary_beach_night_happy.png 라는 파일 이름을 사용하는 것도 한 방법일 것입니다. 하지만 이미지는 정적 이미지에만 사용할 수 있는 것이 아니라 렌파이에서 지원하는 모든 디스플레이어블 에서 사용할 수 있습니다. 그러니 같은 이미지를 나타내는 명령문이라 할지라도 움직이는 이미지나 단색, 기타 디스플레이어블에서도 사용할 수 있습니다.

레이어

레이어란 화면에 나타나는 디스플레이어블 목록을 뜻합니다. 렌파이에서는 여러 개의 레이어를 사용할 수 있으며, 사용자가 레이어를 새로 정의할 수도 있습니다. 레이어의 순서는 (config.layers 변수를 설정한) 게임 내에서는 고정이지만, 레이어에 있는 디스플레이어블의 순서는 scene 과 show 문이 호출된 순서에 따라 정해지며, 각 명령문에 지정된 속성에 따라 순서가 정해지기도 합니다.

다음은 렌파이에서 기본적으로 지정된 레이어입니다. :

master
scene, show, hide 문을 사용하여 이미지를 표시했을 때 이미지가 나타나는 기본 레이어. 배경그림이나 캐릭터 그림을 나타낼 때 사용됩니다.
transient
ui 함수를 사용하여 디스플레이어블을 표시했을 때 사용되는 기본 레이어. 이 레이어는 인터렉션이 끝나는 시점에 비워집니다.
screens
스크린 시스템을 이용했을 때 사용되는 레이어.
overlay
ui 함수가 오버레이 함수를 통해 호출되었을 때 사용되는 기본 레이어. 인터렉션이 재시작될 때 비워집니다.

config.layers 값을 바꾸거나 다른 config 변수를 이용하면 새로운 레이어를 추가할 수 있습니다. 레이어에 하나 이상의 트랜스폼을 적용하고 싶다면 renpy.layer_at_list() 이용하면 됩니다.

이미지 정의하기

이미지를 정의하는 방법으로는 두 가지가 있습니다. 이미지를 이미지 디렉토리에 넣어나, image 문으로 이미지를 정의하는 것입니다. 첫 번째 방법은 이름을 적절하게 지은 이미지 파일을 폴더에 넣기만 하면 되므로 간단하며, 두 번째 방법은 이미지를 정의하는 방식을 제어하며, 이미지 파일이 아닌 이미지도 정의할 수 있습니다.

image 문으로 정의한 이미지들은 이미지 디렉토리를 통해 정의된 이미지를 우선합니다.

이미지 디렉토리

이미지 디렉토리는 game 디렉토리 하위에 있는 "images" 라는 폴더입니다. 확장자가 .jpg 또는 .png 로 끝나는 파일이 이 디렉토리에 있다면 파일 이름에서 확장자는 제거하고, 나머지 부분을 소문자로 바꿔 만들어진 이름이 이전에 정의된 이름이 아니라면 파일 이름을 이미지 이름으로 사용할 수 있게 됩니다.

이 과정은 이미지 디렉토리 하위에 있는 모든 디렉토리에 적용됩니다. 예를 들어 다음 경로에 있는 모든 파일은 ``eileen happy``라는 이미지 이름으로 정의될 것입니다.

game/images/eileen happy.png
game/images/Eileen Happy.jpg
game/images/eileen/eileen happy.png

image 문

image 문을 이용하면 이미지를 정의할 수 있습니다. image 문은 image 키워드로 시작해, 이미지 이름, 등호(=), 디스플레이어블로 구성된 논리행 한 줄로 이루어져있습니다. 아래는 예제입니다.

image eileen happy = "eileen_happy.png"
image black = "#000"
image bg tiled = LiveTile("tile.jpg")

image eileen happy question = VBox(
    "question.png",
    "eileen_happy.png",
    )

image 문은 반드시 게임 코드가 실행되기 전 초기화 단계에서 실행되어야 합니다. image 문이 init 블록 안에 없다면 image 문은 init 0 블럭에 배치된 것으로 간주하고 초기화 상태 때 자동으로 구동됩니다.

ATL을 이용하는 image 문 항목도 살펴보세요.

show 문

show 문을 사용하면 이미지를 레이어에 나타낼 수 있습니다. show 문은 show 키워드, 이미지 이름, 0개 이상의 속성으로 구성된 논리행 한 줄로 이루어져있습니다.

show 문에 디렉토리에 존재하는 그림 파일 이름이 정확히 입력되었다면 해당 이미지가 나타날 것입니다. 그림 파일 이름을 입력하지 않았다면:

  • show 문에 적은 것과 같은 이미지 태그를 가진 고유한 이미지를 찾으려고 하거나,
  • show 문에 주어진 이미지 속성을 전부 가지고 있는 고유한 이미지를 찾거나,
  • 같은 태그를 가진 이미지가 이미 화면에 나타나있다면 그 이미지에 있는 이미지 속성에서 가장 큰 숫자를 따서 사용합니다.

고유 이미지를 찾지 못한 때에는 예외가 발생합니다.

같은 이미지 태그가 지정된 이미지가 이미 레이어에 나타나 있다면 그 이미지는 새로 표시할 이미지로 교체됩니다. 그 외의 경우에는 이미지가 레이어에 있는 이미지보다 앞에(즉, 사용자와 가까운 위치에) 나타납니다. 이미지 표시 순서는 zorder나 behind 속성을 이용하면 바꿀 수 있습니다.

show 문은 인터렉션을 발생시키지 않습니다. 그러므로 이미지를 실제로 사용자에게 보여주려면 인터렉션을 발생시키는 (say, menu, pause, with 같은) 명령문을 함께 실행해야 합니다.

show 문은 다음 속성을 받습니다:

as
이름을 받습니다. 이때 이름은 이미지가 나타날 때 이미지 태그의 자리를 대신하게 됩니다. 따라서 같은 이미지를 동시에 두 장 나타낼 때 사용할 수 있습니다.
at

쉼표로 구분된 하나 이상의 단순 표현식을 받습니다. 각 표현식은 트랜스폼으로 해석됩니다. 단순 표현식을 여럿 적었을 때에는 트랜스폼을 왼쪽에서 오른쪽에 적힌 순서대로 적용합니다.

at 절이 없다면 이미지에 적용된 적이 있는 트랜스폼을 받아 이미지에 적용시킵니다. 트랜스폼이 존재하지 않는다면 이미지는 default 변수에 저장된 트랜스폼을 사용해 이미지를 나타낸다.

behind
쉼표로 구분된 하나 이상의 이름 목록을 받습니다. 각 이름은 이미지 태그로 해석됩니다. 이미지는 behind 가 받은 태그를 가진 모든 이미지 뒤에 나타납니다.
onlayer
이름을 받습니다. 이미지를 지정된 레이어에 나타냅니다.
zorder
정수를 받습니다. 정수에 따라 레이어에 있는 이미지들의 우선도가 결정됩니다. 숫자가 클수록 사용자와 가까운 쪽에 나타납니다. 보통 렌파이 코드에서는 사용할 필요가 없으나 다른 엔진에서 코드를 옮겨올 때 유용하게 사용할 수 있습니다.

아래처럼 이미지를 지정했다고 가정합시다.

image mary night happy = "mary_night_happy.png"
image mary night sad = "mary_night_sad.png"
image moon = "moon.png"

다음은 show 문의 예제입니다:

# show 문의 기본 사용
show mary night sad

# 'mary night sad' 이미지가 나타있으므로
# 다음 명령문은
# show mary night happy 와 같은 동작을 한다.
show mary happy

# 이미지를 화면 오른쪽에 표시한다.
show mary night happy at right

# 같은 이미지를 한 번에 두 장 표시한다.
show mary night sad as mary2 at left

# 이미지를 다른 이미지 뒤에 나타낸다.
show moon behind mary, mary2

# 이미지를 사용자가 정의한 레이어에 나타낸다.
show moon on user_layer

show expression 문 show 문의 변형된 형태로, 이미지 이름 대신 expression 키워드와 단순 표현식을 사용합니다. 표현식은 반드시 디스플레이어블이어야 하며 이 디스플레이어블은 레이어세 나타나야 합니다. 디스플레이어블을 숨기고 싶다면 as 문으로 태그를 지정해주어야 합니다.

아래는 예제입니다.

show expression "moon.png" as moon

show layer 문 show layer문으로는 ("master" 같은) 전체 레이어에 트랜스폼이나 ATL 트랜스폼을 적용할 수 있습니다. 적용법은 다음과 같습니다.

show layer master at flip

또는 다음처럼 적용할 수도 있습니다.

show layer master:
    xalign 0.5 yalign 0.5 rotate 180

레이어에 트랜스폼을 적용한 것을 중단하고 싶다면 다음과 같은 코드를 입력하세요.

show layer master

show문과 함께 사용된 트랜스폼은 트랜스폼을 시작한 상태를 전혀 인수하지 않습니다. 현재 show layer 에 사용된 트랜스폼은 이전 레이어 트랜스폼에서 상태를 받지 않고 있으나, 차후에 이런 작동 방식을 변경할 계획하고 있습니다.

scene 문

scene 문은 레이어에서 모든 디스플레이어블을 지우고 새로운 이미지를 지정한 레이어에 나타냅니다. 이 명령문은 scene 키워드 다음에 이미지 이름, 0개 이상의 속성으로 이루어져있습니다. show 문과 마찬가지 방식으로 이미지를 나타내며, show 문과 같은 종류의 속성을 받습니다.

scene 문은 보통 배경 레이어에 이미지를 나타낼 때 사용됩니다.

scene bg beach

scene expression show 문과 마찬가지로 scene 문도 이미지 이름 대신 표현식을 받을 수 있습니다.

레이어 비우기 scene 문을 사용할 때 이미지 이름을 적지 않았다면 scene 문은 다른 디스플레이어블을 표시하지 않고 레이어에서 모든 디스플레이어블을 지웁니다.

hide 문

hide 문을 이용하면 레이어에서 이미지 하나를 지울 수 있습니다. hide 키워드 , 이미지 이름, 추가 속성으로 구성되어 있습니다. hide문은 이미지 이름에서 이미지 태그를 골라 받고, 레이어에 같은 태그를 가진 이미지를 숨깁니다.

hide 문을 사용할 일은 거의 없을 것입니다. 캐릭터를 대표하는 이미지가 있다면 어떤 장면에서 사라지게 할 때나 쓸모가 있습니다. 캐릭터의 표정을 바꿀 때는 hide 문 대신 show 문을 사용하면 같은 태그를 가진 이미지로 자동으로 교체할 수 있기 때문입니다.

hide 문은 다음의 속성을 받습니다.:

onlayer
이름을 받습니다. 지정된 레이어에서 이미지를 지웁니다.

다음은 hide문 사용 예제입니다

e "난 여기서 나가야겠어."

hide eileen

이렇게는 쓰지 마세요.

hide eileen
show eileen happy

대신 이렇게 쓰면 됩니다.

show eileen happy

with 문

with 문을 이용하면 장면이 바뀔 때 트랜지션 효과를 적용해, 이미지가 역동적으로 나타나고 사라지게 할 수 있습니다. 이 명령문은 with 키워드, 단순 표현식으로 구성되어있습니다. 이 때 단순 표현식은 트랜지션 객체이거나 None 값이어야 합니다.

트랜지션 효과는 이전 인터렉션의 마지막 지점에 스크린의 내용물(임시 스크린과 숨겨진 디스플레이어블)과 show 및 hide문이 실행된 이후에 현재 장면의 내용물이 나타나는 동안 적용됩니다.

with 문은 인터렉션을 발생시킵니다. 이 인터렉션의 기간은 사용자가 제어할 수 있기 때문에 사용자는 트랜지션을 미리 종료시킬 수 있습니다.

사용할 수 있는 트랜지션을 알고싶다면 트랜지션 항목을 참조하세요.

다음은 with문의 예제입니다:

show bg washington
with dissolve

show eileen happy at left
show lucy mad at right
with dissolve

위 예제에서는 트랜지션이 두 번 발생합니다. 첫 번째 with 문은 dissolve 를 사용해 이전 장면을 워싱턴 배경화면으로 교체합니다. (참고로 dissolve 트랜지션은 기본적으로 .5 초 동안 디졸브효과를 발생시킵니다.)

두 번째 트랜지션은 에일린과 루시의 이미지가 나타날 때 적용됩니다. 그러므로 이 예제에서는 배경화면 혼자서 디졸브 트랜지션의 적용을 받아 먼저 나타난 후에, 두 캐릭터의 이미지가 동시에 나타나게 되어 화면에 총 세 장의 이미지가 존재하게 됩니다.

with None

위 예제에서는 디졸브 효과가 두 번 적용되었습니다. 그런데 배경그림은 즉시 나타나고, 그 다음에 두 캐릭터 이미지는 디졸브 효과를 받아 나타나도록 하려면 어떻게 해야 할까요? 첫 번째에 사용된 with 문을 지우면 세 이미지가 동시에 디졸브되며 나타나게 됩니다. 배경그림은 즉시 나타나도록 지정할 방법이 필요합니다.

이 때 with 문에 None 값을 적으면 됩니다. with None 문을 이용하면 화면 전환할 때 효과를 적용하지 않고도 즉시 인터렉션을 발생시킬 수 있습니다. 다음 트랜지션이 발생할 때, with None 문을 사용한 이미지는 인터렉션이 종료한 시점에 나타난 것처럼 표시됩니다.

다음은 예제 코드입니다.

show bg washington
with None

show eileen happy at left
show lucy mad at right
with dissolve

이 예제에서는 워싱턴 배경 그림에서 이미지가 세 장 있는 장면으로 바뀌게 될 때만 트랜지션이 일어납니다.

scene, show, hide 문의 with 절

show, scene, hide 문에는 with 절을 추가할 수 있습니다. with 절을 이용하면 이미지를 추가하거나 숨길 때 트랜지션을 적용할 수 있습니다. with 절은 각 명령문의 끝에 적으면 됩니다. with 키워드, 단순 표현식으로 이루어져있습니다.

with 절은 앞 줄에 with None 문을 적고 다음 줄에는 with 문 만 적은 것과 같습니다. 예를 들어 다음의 코드는:

show eileen happy at left with dissolve
show lucy mad at right with dissolve

아래 코드와 동일합니다:

with None
show eileen happy at left
with dissolve

with None
show lucy mad at right
with dissolve

대사창 숨기기 및 띄우기

window문은 캐릭터가 대사를 말하지 않는 동안에 대사창 표시 여부를 제어하는 명령문입니다. (트랜지션 중이거나 일시 정지 상태일 때) window show문은 대사창을 띄우고, window hide문은 대사창을 숨깁니다.

트랜지션을 추가로 입력하면 대사창을 숨기거나 띄울 때 트랜지션을 적용합니다. 입력하지 않으면 config.window_show_transitionconfig.window_hide_transition 에서 값을 받습니다. None을 입력하면 트랜지션을 방지합니다.

대사창 자체는 config.empty_window 를 호출해 나타납니다. 기본적으로 대사가 없는 내래이터 캐릭터의 say문을 표시하는 것으로 설정되어 있습니다.

    show bg washington
    show eileen happy
    with dissolve

    window show dissolve

    "나는 대사를 말할 수 있어..."

    show eileen happy at right
    with move

    "... 그리고 대사창이 떠 있는 상태에서 움직일 수 있지."

    window hide dissolve

이미지 관련 함수

renpy.copy_images(old, new)

특정 접두사가 붙은 이미지를 다른 접두사가 붙은 이미지로 복사한다. 예를 들어:

renpy.copy_images("eileen", "eileen2")

위 코드는 "eileen"으로 시작하는 모든 이미지를 복사해 "eileen2" 로 시작하는 이름의 이미지로 신규 생성시킨다. "eileen happy" 가 존재한다면, "eileen2 happy"가 생성될 것이다.

old
복사될 이미지 이름의 구성 요소가 적힌 공백으로 구분된 문자열.
new
생성될 이미지 이름의 구성 요소가 적힌 공백으로 구분된 문자열.
renpy.get_image_bounds(tag, width=None, height=None, layer='master')

layer 에 이미지 태그가 tag 로 지정된 이미지가 있다면, 해당 이미지를 둘러싼 경계사각형을 반환한다. 이미지를 찾지 못하면 None을 반환한다.

경계사각형은 (x, y, 가로, 세로) 튜플 형태로 반환된다. 튜플의 구성 요소들은 픽셀 단위로 표현되며, 부동소수점 숫자일 수도 있다.

width, height
이미지를 포함하고 있는 영역의 가로 길이와 세로 길이. None이라면 화면의 가로 및 세로 길이가 기본적으로 지정된다.
renpy.get_placement(d)

디스플레이어블 d의 위치를 얻는다. 이 때 얻는 위치 정보는 디스플레이어블이 그려질 때 변경되거나, 디스플레이어블이 처음 그려지기 전까지는 정보가 없을 수도 있기 때문에 신뢰도가 낮다.

이 함수는 아래에 나열된 필드와 함께 객체를 반환하며, 이 때 각 필드는 스타일 속성과 일치한다.:

  • xpos
  • xanchor
  • xoffset
  • ypos
  • yanchor
  • yoffset
  • subpixel
renpy.get_showing_tags(layer='master')

현재 `layer`에서 표시되고 있는 이미지들의 태그를 셋 형태로 반환한다.

renpy.has_image(name, exact=False)

name 이라는 이미지가 있다면 참을, 없으면 거짓을 반환한다.

name
이미지 이름이 적힌 스트링이거나 이름 요소들이 적힌 튜플이어야 한다.
exact
name 에 지정한 이름과 동일한 이미지가 존재하는 경우에 참을 반환한다. 매개화되어 일치하는 이름은 포함하지 않는다.
renpy.seen_image(name)

지정한 이미지가 사용자의 시스템에서 한 번이라도 표시된 경우 True를 반환한다. show, scene, renpy.show() 함수를 사용하여 표시되어야 이미지가 표시된 것이다. (show 를 사용하고 바로 뒤에 hide를 사용한 경우처럼 유저가 실제로는 이미지를 보지 못한 경우에도 True를 반환한다는 점을 유의해야 한다.)

renpy.showing(name, layer='master')

name 과 동일한 태그가 붙은 이미지가 layer 에서 나타난 상태라면 참을 반환한다.

image
이미지 이름이 적힌 문자열이거나 이미지 이름을 구성하는 각 요소가 적힌 튜플이어야 한다. 이미지 태그만 적힌 문자열도 적을 수 있다.
renpy.start_predict(*args)

이 함수는 하나 이상의 디스플레이어블을 인수로 받는다. 렌파이는 이 함수로 지정한 디스플레이어블이 renpy.stop_predict() 로 제거되기 전까지 매 인터렉션마다 디스플레이어블을 예측한다.

renpy.stop_predict(*args)

이 함수는 하나 이상의 디스플레이어블을 인수로 받는다. 매 인터렉션마다 지정한 디스플레이어블이 예측되는 것을 중단한다.