목차

이전 항목

렌파이 언어 기본 사항

다음 항목

대사와 내래이션

링크


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

레이블 및 제어 흐름

label문

label 문은 프로그램의 한 지점에 이름을 부여합니다. label문은 스크립트 코드나 렌파이 설정이 해당 지점을 호출하거나 또는 그 지점으로 이동할 수 있도록 단독으로 존재할 수 있습니다.

label sample1:
    "여기는 'sample1' 레이블입니다."

label sample2(a="default"):
    "여기는 'sample2' 레이블입니다."
    "a = [a]"

label문은 블록을 받을 수 있습니다. 이 경우, 제어 흐름은 label문에 도달할 때마다 해당 블럭으로 진입하며, 블럭의 끝에 도달할 때마다 label문 뒤에 나오는 명령문으로 진행을 계속합니다.

label문은 매개변수의 리스트를 추가로 받을 수 있습니다. 이 매개변수들은 두 가지 예외 사항을 제외하면 PEP 3102 에 기술된 대로 처리됩니다. 예외 사항은 다음과 같습니다.:

  • 기본 매개변수의 값들은 호출 시에 계산됩니다.
  • 변수는 동적으로 스코핑됩니다.

jump문

jump문은 제어 흐름을 특정한 레이블로 이동시킬 때 사용합니다.

expression 키워드가 있으면, 이 키워드 다음에 적힌 표현식을 계산해 나온 결과값인 문자열을 해당 jump문을 통해 이동하려는 레이블 이름으로 사용합니다. expression 키워드가 없다면 이동하려는 레이블의 이름을 정확히 명시해야 합니다.

call문과 다르게 jump문은 jump문 다음에 처리될 명령문을 스택에 밀어넣지 않습니다. 그렇기 때문에 jump문을 사용해 이동한 지점에서 이전 지점으로 돌아갈 방법은 없습니다.

label loop_start:

    e "아, 안돼! 아무래도 우리가 무한 루프에 빠진 거 같아!"

    jump loop_start

call문

call문은 제어 흐름을 특정한 레이블로 이동시킬 때 사용합니다. 이 명령문은 call문 다음에 처리될 명령문을 call 스택에 밀어넣어 return문으로 call문 다음줄에 적힌 곳으로 제어 흐름을 반환할 수 있도록 합니다.

expression 키워드가 있으면, 이 키워드 다음에 적힌 표현식을 계산해 나온 결과값인 문자열을 해당 call문을 통해 호출하려는 레이블 이름으로 사용합니다. expression 키워드가 없다면 호출하려는 레이블의 이름을 정확히 명시해야 합니다.

call문이 from 절을 추가로 받는다면, from 절에 적은 이름과 동일한 이름을 지닌 label문이 call문 아래줄에 따라오는 것과 같은 효과를 보입니다. 레이블 이름을 명확하게 나타내야 내용이 변경된 스크립트에 return 스택이 있는 저장된 게임이 불려올 때 알맞은 위치로 되돌아갈 수 있습니다.

e "우선 서브루틴을 호출해야 돼."

call subroutine

call subroutine(2)

call expression "subroutine" pass (count=3)

# ...

label subroutine(count=1):

    e "이 레이블에 [count]번 왔네."
    e "다음에는 호출됐던 곳으로 돌아갈 거야."

    return

call문은 인수를 받을 수 있으며 이 인수는 PEP3102에 기술된 대로 처리됩니다.

call expression을 인수 리스트와 함께 사용할 때에는 pass 키워드가 반드시 표현식과 인수 목록 사이에 적혀있어야 합니다. 그렇지 않으면 인수 리스트가 call문의 일부가 아닌 표현식으로 해석될 것입니다.

return문

return문은 call 스택에서 가장 위에 있는 명령문을 꺼내 제어 흐름으로 전달합니다. call 스택이 비어있다면, return문은 렌파이를 재시작하고 main menu 로 제어 흐름을 반환합니다.

return문에 표현식을 추가로 입력하면, 표현식을 계산한 결과값을 _return 변수에 저장합니다. 이 변수는 상황에 따라 동적으로 스코핑됩니다.

특별한 레이블

렌파이가 사용하는 레이블은 다음과 같습니다.:

start
기본적으로 렌파이는 게임이 시작하면 이 레이블로 이동합니다.
quit
이 레이블이 있다면 사용자가 게임을 종료했을 때 이 레이블이 새로운 상황에서 호출됩니다.
after_load
이 레이블이 있다면 게임을 불러왔을 때 이 레이블이 호출됩니다. 게임이 업데이트되었을 때 데이터를 수정하는 용도로 사용할 수 있습니다.
splashscreen
이 레이블이 있다면, 게임이 처음 실행되고 메인 메뉴를 표시하기 전에 이 레이블이 호출됩니다.
before_main_menu
이 레이블이 있다면 메인 메뉴가 나타나기 이전에 이 레이블이 호출됩니다. 이 레이블은 메인 메뉴 배경화면으로 동영상을 재생하는 등 메인 메뉴 표시를 준비하는 희귀한 경우에 사용됩니다.
main_menu

이 레이블이 있다면 메인 메뉴 대신에 이 레이블이 호출됩니다. 이 레이블이 종료되어 값을 반환하면, 렌파이는 start 레이블에서 게임을 시작합니다. 예를 들어 아래와 같은 스크립트를 적었을 때에는 메인 메뉴를 표시하지 않고 곧바로 게임을 시작할 것입니다.

label main_menu:
    return
after_warp
이 레이블이 있다면, 워프하려는 명령문이 있는 곳으로 워프하기 바로 전에 이 레이블을 호출합니다. 더 자세한 정보는 임의 라인으로 워프하기 를 참고하세요.

레이블 및 제어 흐름 관련 함수

renpy.call_in_new_context(label, *args, **kwargs)

이 코드는 새 상황을 생성하고, 생성된 상황에서 이 함수로 지정한 레이블의 코드를 실행한다. 롤백은 새 상황에서 비활성화된다. (실제로 롤백은 존재하는 상황으로 되돌아갈 것이다.)

인터렉션 내에 있는 동안 사용자와 두 번째 인터렉션을 시작하고자 한다면 이 함수를 사용하라.

renpy.get_all_labels()

라이브러리에 정의된 내부에서 사용하는 레이블을 포함해 프로그램에 정의된 모든 레이블을 셋 데이터 형식으로 반환한다.

renpy.get_return_stack()

현재 return 스택의 목록을 반환한다. return 스택은 명령어 이름의 리스트이다.

명령어 이름은 레이블을 뜻하는 문자열이거나 레이블이 아닌 명령문을 뜻하는 불투명 튜플일 것이다.

renpy.has_label(name)

`name`이 프로그램에서 유효한 레이블이라면 참을, 아니면 거짓을 반환한다.

name
레이블의 존재 여부를 확인하기 위한 문자열이어야 한다. 레이블이 아닌 명령문의 이름을 지정하는 불투명 튜플일 수도 있다.
renpy.invoke_in_new_context(callable, *args, **kwargs)

이 함수는 현재 상황을 밀어내고 새 상황에서 지정한 파이썬 함수를 발생시킨다. 함수가 예외를 발생시키거나 아니면 값을 반환하고 종료한다면, 새 상황을 제거하고 현재 상황을 복원한다.

추가 인수와 키워드 인수는 콜러블에 전달시킨다.

이렇게 생성된 상황에서는 렌파이 코드를 실행시킬 수 없다는 점을 기억해야 한다. 그러므로 renpy.jump처럼 렌파이 코드의 흐름을 변경하는 예외들은 이 상황을 종료시키며 차상위 상황에 의해 관리된다.

함수에서 렌파이 코드를 실행시키고자 한다면, renpy.call_in_new_context 를 호출하라.

인터렉션 내에 있는 동안 사용자와 두 번째 인터렉션을 시작하고자 한다면 이 함수를 사용하라.

renpy.jump_out_of_context(label)

제어 흐름이 현재 상황에서 떠나도록 하고, 상위 상황에서 지정한 레이블로 제어 흐름을 전송한다.

renpy.seen_label(label)

지정한 레이블이 현재 사용자 시스템에서 한 번이라도 실행된 적이 있다면 참을, 아니면 거짓을 반환한다. 예를 들어, 잠금 해제할 수 있는 장면 다시보기 메뉴 등을 만들 때 사용할 수 있다.

renpy.set_return_stack(stack)

현재 return 스택을 설정한다. return 스택은 명령어 이름의 리스트이다.

명령어 이름은 레이블을 뜻하는 문자열이거나 레이블이 아닌 명령문을 뜻하는 불투명 튜플일 것이다.