레이블 및 제어 흐름
레이블 문
레이블 문은 주어진 이름이 프로그램 지점에 할당되도록 허용합니다. 이들은 Ren'Py 스크립트, Python 함수 또는 화면에서 호출하거나 점프하는 용도로만 존재합니다.
label sample1:
"여기는 'sample1' 레이블입니다."
label sample2(a="default"):
"여기는 'sample2' 레이블입니다."
"a = [a]"
레이블 문에는 연결된 블록이 있을 수 있습니다. 이 경우 레이블 문에 도달하면 블록에 진입하고 블록의 끝에 도달하면 레이블 문 다음의 문으로 계속 진행합니다.
레이블에는 전역 레이블과 지역 레이블 두 가지 종류가 있습니다. 전역 레이블은 모든 프로젝트 파일에서 공유하는 전역 스코프에 존재하며 각 게임에 고유한 이름을 가져야 합니다. 반면에 지역 레이블은 전역 레이블을 참조하므로 게임의 여러 지역 레이블은 동일한 이름을 가질 수 있습니다. 지역 레이블을 선언하려면 이름에 점 (.)을 접두어로 붙이고 해당 레이블에 속할 전역 레이블 아래에 두면 됩니다.
label global_label:
"전역 레이블 내부에 있습니다."
label .local_label:
"로컬 레이블이 존재합니다."
"jump .another_local"
label .another_local:
"그리고 또 다른 것도 있습니다."
"jump .local_label"
로컬 레이블은 직접 선언된 전역 레이블 내에서 참조할 수 있거나 전역 및 로컬 이름 부분이 포함된 전체 이름으로 참조할 수 있습니다.
label another_global:
"이제 어디선가 뒤쪽의 로컬 레이블로 이동합니다."
"jump global_label.local_name"
레이블 문은 선택적인 매개변수 목록을 가질 수 있습니다. 이 매개변수는 PEP 570에서 설명된대로 처리되며 두 가지 예외가 있습니다.
- 기본 매개변수의 값은 호출 시간에 평가됩니다.
- 변수는 정적 대신 동적으로 스코프가 지정됩니다.
점프 문
점프 문은 주어진 레이블로 제어를 전달하는 데 사용됩니다.
label loop_start:
e "앗! 우리는 무한 루프에 갇혔나봐요."
jump loop_start
만약 expression 키워드가 존재하면 그 뒤의 표현식이 평가되어 계산된 문자열이 문의 레이블 이름으로 사용됩니다. expression 키워드가 존재하지 않으면 명시적으로 주어진 레이블 문의 이름을 사용해야 합니다.
label loop_start:
e "무한 루프에 갇혔다는 것 같아요."
jump loop_start
call과는 달리 jump는 다음 문을 스택에 푸시하지 않습니다. 결과적으로 이동한 위치로 돌아갈 방법이 없습니다.
콜 문
콜 문은 주어진 레이블로 제어를 전달합니다. 또한 콜 스택에 다음 문을 푸시하여 return 문이 호출된 경우 호출 위치로 제어를 반환할 수 있습니다.
label start:
e "먼저 서브루틴을 호출합니다."
call subroutine
call subroutine(2)
call expression "sub" + "routine" pass (count=3)
return
# ...
label subroutine(count=1):
e "[count] 번 여기에 왔어요."
e "다음에는 서브루틴에서 반환할 거에요."
return
주의: call 문에 대한 각각의 return 문이 스택에 푸시된다는 것을 명심하세요. 게임을 업데이트하려는 경우 call 문에 대한 각각의 return 문에 대한 from 절이 있어야 합니다. 이러한 절이 추가되지 않으면 call 명령을 포함하는 파일을 편집하면 호출된 레이블 내에서 작성된 저장된 게임이 손상될 가능성이 있습니다. "Add from clauses to calls" 옵션을 사용하면 이 문제를 해결할 수 있습니다.
리턴 문
리턴 문은 콜 스택에서 맨 위의 문을 팝하고 제어를 해당 문으로 전달합니다. 콜 스택이 비어 있으면 리턴 문이 호출되면 Ren'Py는 다시 시작되어 메인 메뉴로 제어가 반환됩니다.
label subroutine(count=1):
e "[count] 번 왔어요."
e "이제는 서브루틴에서 반환할 거에요."
return
선택적으로 expression이 주어지면 평가되어 그 결과가 _return 변수에 저장됩니다. 이 변수는 동적으로 각 문에 대해 스코프가 지정됩니다.
특별한 레이블
Ren'Py에서는 몇 가지 특별한 레이블이 사용됩니다:
- start: 기본적으로 Ren'Py는 게임이 시작될 때 이 레이블로 이동합니다.
- quit: 만약 이 레이블이 존재한다면, 사용자가 게임을 종료할 때 새로운 컨텍스트에서 호출됩니다.
- after_load: 이 레이블이 존재하면 게임이 로드될 때 호출됩니다. 게임이 업데이트될 때 데이터를 수정하는 데 사용될 수 있습니다.
- splashscreen: 이 레이블이 존재하면 게임이 처음 실행될 때 메인 메뉴를 표시하기 전에 호출됩니다.
- before_main_menu: 이 레이블이 존재하면 메인 메뉴를 표시하기 전에 호출됩니다. 메인 메뉴를 설정하기 위해 사용될 수 있습니다.
- main_menu: 이 레이블이 존재하면 메인 메뉴 대신 호출됩니다. 예를 들어 아래의 코드는 즉시 게임을 시작하고 메인 메뉴를 표시하지 않습니다.
label main_menu: return
- after_warp: 이 레이블이 존재하면 워프 후 워프된 문이 실행되기 전에 호출됩니다.
- hide_windows: 이 레이블이 존재하면 플레이어가 오른쪽 마우스 버튼이나 H 키로 창을 숨길 때 호출됩니다. 이 레이블이 true를 반환하면 숨기기가 취소됩니다.
레이블 및 제어 흐름 함수
Ren'Py에서는 몇 가지 레이블 및 제어 흐름 함수가 제공됩니다:
- renpy.call_stack_depth(): 현재 컨텍스트의 콜 스택 깊이를 반환합니다. 스택에서 반환되지 않거나 스택에서 팝되지 않은 호출 수입니다.
- renpy.dynamic(variables, *kwargs): 하나 이상의 변수 이름을 인수로 사용할 수 있습니다. 이렇게 하면 변수가 현재 호출에 동적으로 지정됩니다. 호출이 반환되면 변수는 호출될 때의 값으로 재설정됩니다.
$ renpy.dynamic("x", "y", "z")
- renpy.get_all_labels(): 프로그램에 정의된 모든 레이블 세트를 반환합니다. 라이브러리 내부에서 사용되는 레이블에 대한 정의도 포함됩니다.
- renpy.get_return_stack(): 현재 리턴 스택을 나타내는 목록을 반환합니다. 리턴 스택은 문의 이름 목록입니다. 레이블에 대한 문자열 또는 비 레이블 문에 대한 불투명한 튜플일 수 있습니다.
- renpy.has_label(name): name이 프로그램에서 유효한 레이블이면 true를 반환하고, 그렇지 않으면 false를 반환합니다.
- renpy.mark_label_seen(label): 지정된 이름의 레이블을 현재 사용자 시스템에서 이미 실행된 것처럼 표시합니다.
- renpy.mark_label_unseen(label): 지정된 이름의 레이블을 현재 사용자 시스템에서 아직 실행되지 않은 것으로 표시합니다.
- renpy.pop_call(): 호출을 현재 스택에서 팝하고 위치로 돌아가지 않고 값을 복원합니다.
- renpy.seen_label(label): 현재 사용자 시스템에서 지정된 이름의 레이블이 적어도 한 번 실행된 경우 true를 반환하고, 그렇지 않으면 false를 반환합니다.
- renpy.set_return_stack(stack): 현재 리턴 스택을 설정합니다. 리턴 스택은 문의 이름 목록입니다. 대부분의 경우 다음을 사용하여 스택을 지울 수 있습니다.
renpy.set_return_stack([])
컨텍스트
컨텍스트는 Ren'Py에서 게임의 변경 가능하고 저장 가능한 상태를 관리하기 위해 내부적으로 사용됩니다. 컨텍스트에는 현재 실행 중인 Ren'Py 문, 콜 스택, renpy.dynamic()에 의해 생성된 동적 변수의 이름 및 이전 값, 현재 표시되고 있는 이미지 및 해당 속성, 화면 및 그 내부 변수, 재생되거나 대기 중인 오디오가 포함됩니다.
대부분의 경우 하나의 컨텍스트만 활성화되어 있고 각 요소의 인스턴스가 하나만 존재합니다. 이는 메인 또는 게임 메뉴에 진입할 때만 변경되며 메뉴 컨텍스트를 떠날 때 복원됩니다. 일부 변경 사항은 자동으로 이루어지며 메뉴 컨텍스트에 진입할 때 스크린 레이어가 지워집니다.
Rollback은 기본 컨텍스트에서만 활성화되어 있으며 기본 컨텍스트만 저장됩니다. 따라서 게임 메뉴는 컨텍스트를 사용합니다.
- renpy.call_in_new_context(label, args, *kwargs): 새로운 컨텍스트를 생성하고 해당 컨텍스트에서 지정된 레이블에서 Ren'Py 스크립트 실행을 시작합니다. 새 컨텍스트에서 롤백이 비활성화되
며 상위 수준 컨텍스트에서 저장/로드가 수행됩니다.
- renpy.context(): 현재 컨텍스트에 고유한 객체를 반환합니다. 이 객체는 새 컨텍스트로 이동할 때 복사되지만 복사본에 대한 변경은 원본에 영향을 미치지 않습니다.
- renpy.context_dynamic(*variables): 하나 이상의 변수 이름을 인수로 사용할 수 있습니다. 이렇게 하면 변수가 현재 컨텍스트에 동적으로 지정됩니다. 호출이 반환되면 변수는 호출될 때의 값으로 재설정됩니다.
$ renpy.context_dynamic("x", "y", "z")
- renpy.context_nesting_level(): 현재 컨텍스트의 중첩 레벨을 반환합니다. 이 값은 외부 컨텍스트에서 0이며 메뉴 및 리플레이 컨텍스트에서는 0이 아닐 수 있습니다.
- renpy.invoke_in_new_context(callable, args, *kwargs): 이 함수는 새로운 컨텍스트를 생성하고 해당 컨텍스트에서 지정된 Python callable(함수)을 호출합니다. 함수가 반환되거나 예외가 발생하면 제어는 원래 컨텍스트로 돌아갑니다. 이것은 주로 이벤트 핸들러에서 플레이어에게 정보를 표시해야 하는 Python 함수를 호출하는 데 사용됩니다.
- renpy.jump_out_of_context(label): 제어를 현재 컨텍스트를 떠나 부모 컨텍스트로 이동한 다음 지정된 레이블로 전달합니다.
'Programming > Renpy' 카테고리의 다른 글
렌파이 이미지 갤러리 (1) | 2024.01.25 |
---|---|
렌파이 메뉴 : renpy docs 한국어 번역 (1) | 2024.01.24 |
렌파이 대화 - renpy 한국어 번역 (1) | 2024.01.24 |
렌파이 언어기초 - renpy 한국어 번역 (1) | 2024.01.22 |