CG 갤러리는 플레이어가 게임에서 본 그림을 잠금 해제하고 감상할 수 있게 만드는 스크린입니다. CG 갤러리에는 그림이 들어간 하나 이상의 버튼이 있어야 합니다. 물론 버튼에는 이미지 잠금 여부를 결정할 조건을 붙일 수도 있습니다.
CG 갤러리는 Gallery 클래스의 인스턴스로 관리합니다. 인스턴스 하나만으로도 여러 CG 갤러리 화면을 관리할 수 있습니다.
갤러리에는 하나 이상의 이미지 버튼이 있어야 하고 각 이미지에는 하나 이상의 디스플레이어블이 있어야 합니다. 조건은 버튼과 이미지에 배정할 수 있습니다. 버튼은 버튼에 배정된 모든 조건을 만족해야 잠금 해제됩니다. 적어도 해당 버튼에서 사용하는 이미지가 잠금 해제됩니다. 이미지는 배정된 조건을 모두 만족해야 잠금 해제됩니다.
CG 갤러리는 다음 네 단계를 거쳐 만들어집니다.
그림을 잠금 해제할 조건을 지정합니다. 이 단계에서는 다음과 같은 세부 단계를 거쳐야 합니다.
Gallery.button()
을 호출해서 새 버튼을 만듭니다.2.
Gallery.unlock()
이나Gallery.condition()
를 호출해서 하나 이상의 잠금 해제 조건을 버튼에 지정합니다. 이 단계는 선택사항입니다.3. 하나 이상의 디스플레이어블을
Gallery.image()
의 인수로 지정해 이미지를 만듭니다. 혹은 간단히Gallery.unlock_image()
를 호출합니다.4.
Gallery.transform()
를 호출해서 디스플레이어블에 적용할 트랜스폼을 정합니다. 이 단계는 선택사항입니다.
Gallery.unlock()
,Gallery.condition()
,
Gallery.allprior()
. 를 호출해서 이미지에 잠금 해제 조건을 지정합니다. 이 단계 역시 선택사항입니다버튼을 더 만드려면 이 다섯 단계를 전부 반복하면 되고, 버튼에 이미지를 더 넣으려면 3-5번 단계를 반복하면 됩니다.
다른 CG 갤러리를 볼 수 있는 추가 버튼이나, 메인 메뉴, 덤 메뉴로 되돌아 갈 수 있는 버튼도 있어야 할 것입니다.
아래는 1~3 단계에 해당하는 예제입니다:
init python:
# 1. Gallery 객체 만들기.
g = Gallery()
# 2. 갤러리에 버튼과 이미지를 더한다.
# 알아서 잠금 해제되는 이미지를 표시하는 버튼.
g.button("dawn")
g.image("dawn1")
g.unlock("dawn1")
# 이 버튼은 비슷비슷한 그림을 여럿 표시한다.
# unlock_image를 써서 .image 와 unlock 을 번거롭게 쓸 필요는 없다.
# 첫 번째 이미지에는 트랜스폼을 적용했다.
g.button("dark")
g.unlock_image("bigbeach1")
g.transform(slowpan)
g.unlock_image("beach1 mary")
g.unlock_image("beach2")
g.unlock_image("beach3")
# 이 버튼을 누르면 조건에 따라 나타날 이미지가
# 바뀌도록 조건을 더한다.
g.button("end1")
g.condition("persistent.unlock_1")
g.image("transfer")
g.image("moonpic")
g.image("girlpic")
g.image("nogirlpic")
g.image("bad_ending")
g.button("end2")
g.condition("persistent.unlock_2")
g.image("library")
g.image("beach1 nomoon")
g.image("bad_ending")
# 이 버튼이 나타내는 마지막 이미지는
# 플레이어가 엔딩을 모두 봤을 때만 열리도록 조건을 더한다.
g.button("end3")
g.condition("persistent.unlock_3")
g.image("littlemary2")
g.image("littlemary")
g.image("good_ending")
g.condition("persistent.unlock_3 and persistent.unlock_4")
g.button("end4")
g.condition("persistent.unlock_4")
g.image("hospital1")
g.image("hospital2")
g.image("hospital3")
g.image("heaven")
g.image("white")
g.image("good_ending")
g.condition("persistent.unlock_3 and persistent.unlock_4")
# 아래 두 버튼에는 그림 여러 장을 동시에 나타내는 이미지가 있다.
# 캐릭터 그림과 배경화면을 합쳐 보여줄 때
# 사용하면 좋음.
g.button("dawn mary")
g.unlock_image("dawn1", "mary dawn wistful")
g.unlock_image("dawn1", "mary dawn smiling")
g.unlock_image("dawn1", "mary dawn vhappy")
g.button("dark mary")
g.unlock_image("beach2", "mary dark wistful")
g.unlock_image("beach2", "mary dark smiling")
g.unlock_image("beach2", "mary dark vhappy")
# 이미지 전환할 때 사용하는 트랜지션.
g.transition = dissolve
# 3. CG 갤러리 스크린.
screen gallery:
# 메인 메뉴를 대체하도록 태그를 추가.
tag menu
# 배경화면
add "beach2"
# 버튼 격자판.
grid 3 3:
xfill True
yfill True
# 특정 버튼을 나타내도록 make_button 을 호출한다.
add g.make_button("dark", "gal-dark.png", xalign=0.5, yalign=0.5)
add g.make_button("dawn", "gal-dawn.png", xalign=0.5, yalign=0.5)
add g.make_button("end1", "gal-end1.png", xalign=0.5, yalign=0.5)
add g.make_button("end2", "gal-end2.png", xalign=0.5, yalign=0.5)
add g.make_button("end3", "gal-end3.png", xalign=0.5, yalign=0.5)
add g.make_button("end4", "gal-end4.png", xalign=0.5, yalign=0.5)
add g.make_button("dark mary", "gal-dark_mary.png", xalign=0.5, yalign=0.5)
add g.make_button("dawn mary", "gal-dawn_mary.png", xalign=0.5, yalign=0.5)
# 이 스크린에은 메인 메뉴로 돌아갈 수 있도록 버튼을 넣었다.
# 다른 갤러리 스크린으로 돌아갈 때 사용할 수도 있음.
textbutton "Return" action Return() xalign 0.5 yalign 0.5
4 단계 예제는 게임 구조에 따라 달라집니다만, 일단 다음과 같은 코드를:
textbutton "Gallery" action ShowMenu("gallery")
메인 메뉴 스크린 스크립트에 적는 것도 한 방법입니다.
Gallery
(self)¶CG 갤러리를 만드는 클래스. 이미지 잠금 여부를 관리하고, 하나 이상의 이미지를 표시하는 액션과 액션으로 만든 버튼에 사용할 메소드를 이용할 수 있다.
transition
¶이미지를 바꿀 때 사용할 트랜지션.
make_button 이 잠긴 버튼에 사용할 기본 디스플레이어블.
hover_border
¶make_button 이 사용할 기본 마우스 오버 경계.
idle_border
¶make_button 이 사용할 기본 상태의 경계.
참이라면 이미지 위에 슬라이드쇼 및 메뉴 버튼을 표시한다.
메뉴 버튼의 모양을 수정하고 싶다면, gallery_navigation 스크린을 재작성할 것. 기본 스크린은 common/00gallery.rpy 에 정의되어 있다.
참이라면 버튼을 눌러 이미지를 슬라이드쇼로 본다.
locked
¶참이라면 잠긴 이미지를 슬라이드쇼로 본다.
slideshow_delay
¶슬라이드쇼 모드에서 다음 이미지를 표시하기 전까지 대기할 시간.
Action
(name)¶지정한 버튼 이름과 관련있는 이미지를 표시하는 액션.
Next
(unlocked=False)¶갤러리에서 다음 이미지를 보여준다.
Previous
(unlocked=False)¶갤러리에서 이전 이미지를 보여준다.
Return
(self)¶이미지 표시를 멈춘다.
ToggleSlideshow
(self)¶슬라이드쇼 모드를 토글한다.
allprior
(self)¶현재 버튼과 관련있는 모든 이미지가 잠금 해제되었을 때 참이 되는 조건.
name 이라는 이름의 버튼을 만든다.
condition
(expression)¶표현식을 계산했을 때 결과가 참이 되면 만족되는 조건.
display
(*displayables)¶현재 버튼에 새 이미지를 더한다. 이미지는 하나 이상의 디스플레이어블로 이루어진다.
get_fraction
(name, format='{seen}/{total}')¶name 버튼에 지정된 모든 이미지의 수와 잠금 해제된 이미지의 수를 문자열로 반환한다.
숫자 형식을 만들 때 사용하는 파이썬 포맷 문자열 다음과 같이 대체될 수 있는 세 가지 값을 가지고 있다.:
image
(*displayables)¶현재 버튼에 새 이미지를 더한다. 이미지는 하나 이상의 디스플레이어블로 이루어진다.
지정한 버튼 이름과 관련된 이미지를 표시하는 버튼을 만든다.
추가 키워드 인수는 버튼 객체의 스타일 속성이 된다.
transform
(*transforms)¶이 메소드 이전에 등록한 이미지에 적용할 디스플레이어블. 이미지에 사용한 디스플레이어블 수만큼 등록해야 한다. 트랜스폼은 등록한 디스플레이어블마다 적용된다.
transform이 None이면 기본 트랜스폼을 사용한다.
unlock
(*images)¶하나 이상의 이미지 이름을 인수로 받아 해당 이미지를 플레이어가 보면 충족되는 조건. 이미지 이름은 반드시 문자열이어야 한다.
unlock_image
(*images)¶image 와 unlock 을 같은 매개변수로 호출한 것과 같은 메소드. 게임에서 본 적이 있는 이미지를 표시하도록 한다.
이미지는 반드시 이미지 이름이 적힌 문자열로 지정해야 한다.
음악 감상실은 플레이어가 게임에서 사용된 음악을 감상할 수 있는 스크린입니다. 게임 음악은 게임을 시작하기 전에는 잠긴 상태로 있다가 플레이어가 게임을 하면서 음악을 들으면 잠금 해제 됩니다.
음악 감상실은 MusicRoom 클래스의 객체가 관리합니다. MusicRoom 객체는 한 게임에 여러 개를 만들 수 있어서 음악 감상실도 여러 개 만들 수 있습니다. 다음 네 단계를 거치면 음악 감상실을 만들 수 있습니다.:
음악을 재생할 채널과 음악의 페이드 인, 아웃 관리에 필요한 매개변수를 받습니다.
버튼, 이미지버튼, 핫스팟에 쓸 액션을 만듭니다. 이렇게 만들어진 액션을 이용하면 재생할 음악을 선택하거나, 이전, 다음 음악을 재생하거나 음악을 멈추거나 시작하게 만들 수 있습니다.
이 때 액션은 MusicRoom 객체의 일부이므로 예를 들어 MusicRoom 객체의 이름이mr
이라면mr.Play("track1.ogg")
처럼 적어야 Play 액션을 사용할 수 있습니다.
아래는 1~3단계에 대한 예제입니다.
init python:
# 1. MusicRoom 객체를 만든다.
mr = MusicRoom(fadeout=1.0)
# 2. 음악 파일을 더한다.
mr.add("track1.ogg", always_unlocked=True)
mr.add("track2.ogg")
mr.add("track3.ogg")
# 3. 음악 감상실 스크린을 만든다.
screen music_room:
tag menu
frame:
has vbox
# 각 음악을 재생하는 버튼.
textbutton "Track 1" action mr.Play("track1.ogg")
textbutton "Track 2" action mr.Play("track2.ogg")
textbutton "Track 3" action mr.Play("track3.ogg")
null height 20
# 이전, 다음 음악을 재생하는 버튼.
textbutton "Next" action mr.Next()
textbutton "Previous" action mr.Previous()
null height 20
# 나가기 버튼.
textbutton "Main Menu" action ShowMenu("main_menu")
# 음악 감상실에 들어서면 음악을 자동 재생한다.
on "replace" action mr.Play()
# 음악 감상실에서 나가면 원래 재생하던 메인 메뉴 배경음악을 재생한다.
on "replaced" action Play("music", "track1.ogg")
4 단계 예제는 게임 구조에 따라 달라집니다만 일단 다음과 같은 코드를:
textbutton "Music Room" action ShowMenu("music_room")
메인 메뉴 스크린 스크립트에 적는 것도 한 방법입니다.
Preferences()
함수, 특히
Preferences("music volume")
로 음악 감상실 스크린에
음량 조절 슬라이더를 추가할 수도 있습니다.
MusicRoom
(channel='music', fadeout=0.0, fadein=0.0, loop=True, single_track=False, shuffle=False, stop_action=None)¶사용자가 잠금 해제할 수 있는 노래 여러가지와 리스트에 있는 순서대로 음악을 재생하는 액션을 사용할 수 있는 음악감상실.
single_track 과 shuffle 은 서로 충돌합니다. 둘 중 하나만 참이어야 합니다. (set single_track 과 shuffle 을 설정하는 액션들이 이것을 강제합니다.)
Next
(self)¶재생 목록에 있는 파일 중에서 잠금 해제된 다음 음악을 재생하는 액션.
Play
(filename=None)¶음악 감상실에서 음악을 재생한다. filename 을 받아서 해당 파일을 재생한다. 그 외에는 재생하려는 파일이 잠금해제된 상태라면 그 파일을 재생하거나 목록에 있는 첫 번째 음악 파일을 재생한다.
`filename`을 받았다면 이 액션을 사용하는 버튼은 `filename`이 잠긴 상태일 때는 비활성화 상태가 되고, `filename`이 재생 중일 때는 선택된 상태가 된다.
Previous
(self)¶재생 목록에 있는 파일 중에서 잠금 해제된 이전 음악을 재생하는 액션.
RandomPlay
(self)¶이 액션은 잠금해제된 음악 중에서 임의로 선택한 음악을 재생한다.
SetLoop
(value)¶loop 속성의 값을 설정한다.
SetShuffle
(value)¶shuffle 속성의 값을 설정한다.
SetSingleTrack
(value)¶single_track 속성의 값을 설정한다.
Stop
(self)¶음악을 멈춘다.
ToggleLoop
(self)¶loop 속성의 값을 토글한다.
TogglePlay
(self)¶현재 재생하고 있는 음악이 없다면 잠금해제된 첫 번째 곡을 재생한다. 그 외에는 재생하고 있는 음악을 멈춘다.
이 액션을 사용하는 버튼은 음악이 재생되고 있다면 선택된 상태가 된다.
ToggleShuffle
(self)¶shuffle 속성 값을 토글한다.
ToggleSingleTrack
(self)¶single_track 속성 값을 토글한다.
add
(filename, always_unlocked=False, action=None)¶filename 음악을 음악 감상실에 더한다. 음악 감상실은 음악 감상실에 추가된 순서대로 잠금 해제된 음악을 재생한다.
액션이나 액션 리스트이다. 이 메소드로 추가한 음악 파일이 재생될 때 호출된다.
예를 들면 음악이 재생될 때 스크린이나 배경, 재생하고 있는 음악에 대한 설명을 교체할 때 사용할 수 있다.
is_unlocked
(filename)¶filename 이 (언제나 잠금 해제 상태이거나) 잠금 해제되었다면 True를 반환. 잠긴 상태라면 False를 반환한다.
렌파이에는 메인 메뉴나 게임 메뉴에서 장면을 다시보기하는 기능이 있습니다. 이 기능은 중요한 장면을 플레이어가 다시 볼 수 있도록 "이벤트 갤러리"나 메모리 갤러리를 만들 때 사용할 수 있습니다. 다시 본 장면이 끝나면 렌파이는 다시보기를 실행했던 메뉴 스크린으로 돌아갑니다.
이벤트 다시보기 기능은 Start()
액션으로도
사용할 수 있습니다. 다시보기 모드와 Start()
로 만든 모드의 차이점은 다음과 같습니다.:
renpy.end_replay()
를 호출하면
다시보기가 종료됩니다. 일반 모드에서 end_replay는 아무런 작동을 하지 않습니다.다시보기 모드를 활용하려면 새로운 레이블에 장면을 만들어 마지막에 renpy.end_replay 를 호출해야합니다. 해당 장면에서는 레이어 상태나 변수를 건드리지 말아야 합니다. 일반 모드와 다시보기 모드에서는 작동이 달라질 수 있기 때문입니다. (다시보기 코드에서 레이블은 검은 화면으로 시작됩니다.)
다음은 예제입니다.:
"마침내, 나는 마법사를 만났다."
label meaning_of_life:
scene
"마법사" "삶의 의미는 무엇이라 생각해?"
"마법사" "나는 줄곧 열심히 그 생각만 해왔지. 줄곧,
바로 그것만을 생각하며 시간을 보냈어."
"마법사" "그리고 내 대답, 삶의 의미란
바로..."
"마법사" "43이다."
$ renpy.end_replay()
"마법사" "어쨌든 뭐 그런 거지."
위에서처럼 정의된 장면은 Replay 액션으로 다시보기 할 수 있습니다.:
textbutton "삶의 의미" action Replay("meaning_of_life")
아래의 저장 변수는 다시보기 모드에서 사용됩니다.:
_in_replay
¶다시보기 모드에서 이 변수는 다시보기 모드가 시작된 지점인 해당 레이블로 전달된다. 다시보기 모드 외부에서 이 값은 None이다.
그리고 config.enter_replay_transition
와
config.exit_replay_transition
가 각각 다시보기 모드로 진입하거나 빠져나올 때
사용됩니다.
아래의 변수와 액션은 다시보기 모드에서 사용됩니다.
EndReplay
()¶현재의 다시보기를 종료하는 액션.
Replay
(label, scope={}, locked=None)¶label 을 다시보기로 실행시키는 액션.
renpy.
call_replay
(label, scope={})¶label 을 다시보기로서 호출한다.
키워드 인수는 다시보기 상황에서 변수에 초기값을 설정할 때 사용된다.
renpy.
end_replay
()¶다시보기 중이라면 다시보기를 즉시 종료한다. 아니라면 작동하지 않는다.