イメージギャラリー、ミュージックルーム、リプレイアクション link
イメージギャラリー link
イメージギャラリーはプレイヤーが画像をアンロックしたらそれらの画像を閲覧可能にするスクリーンです。スクリーンには関連付けられた1つ以上のボタンがあり、各ボタンには1つ以上の関連付けられた画像があります。ボタンと画像には、アンロックされたかどうかを決定する条件があります。
イメージギャラリーは Gallery クラスのインスタンスによって管理されます。 Gallery クラスの1つのインスタンスを複数のイメージギャラリースクリーンで共有も可能です。
ギャラリーには、それに関連付けられた1つ以上のボタンが、ボタンにはそれに関連づけられた1つ以上の画像が、各画像にはそれに関連づけられた1つ以上の displayable があります。条件はボタンと画像に代入できます。ボタンは関連づけられたすべての条件が満たされた上で、そのボタンに関連づけられた少なくとも1つの画像がアンロックされるとアンロックされます。画像は関連づけられたすべての条件が満たされるとアンロックされます。
イメージギャラリーの作成は以下の4ステップで構成されます。
Gallery のインスタンスを作成します。
ボタンや画像とともに、ボタンや画像がアンロックされるかどうかを決定する条件をギャラリーに追加します。これには数ステップが必要です。
Gallery.button()
を呼び出して、新しいボタンを宣言します。任意で
Gallery.unlock()
またはGallery.condition()
を呼び出して1つ以上のアンロック用の条件をボタンに追加します。1つまたは複数の displayable を引数にして
Gallery.image()
を呼び出して画像を宣言します。 あるいは便利なメソッドのGallery.unlock_image()
を代わりに呼び出します。任意で
Gallery.transform()
を呼び出して displayable に transform を関連づけます。任意で
Gallery.unlock()
、Gallery.condition()
、Gallery.allprior()
のいずれかを呼び出して、1つ以上のアンロック用の条件を画像に追加します。
追加の画像はステップ3-5を繰り返すことでボタンに追加でき、一方で追加のボタンは5つすべてのステップを繰り返してギャラリーに追加できます。
イメージギャラリースクリーンを作成します。スクリーンには背景を表示し、ユーザーがほかのイメージギャラリーを開いたり、メインメニューやその他のメニューに戻れるようにナビゲーションを含めるべきです。
イメージギャラリースクリーンを表示するためのコードをメインまたはその他のメニューに追加します。
例
init python:
# Step 1. Create the gallery object.
g = Gallery()
# Step 2. Add buttons and images to the gallery.
# A button with an image that is always unlocked.
g.button("title")
g.image("title")
# A button that contains an image that automatically unlocks.
g.button("dawn")
g.image("dawn1")
g.unlock("dawn1")
# This button has multiple images assocated with it. We use unlock_image
# so we don't have to call both .image and .unlock. We also apply a
# transform to the first image.
g.button("dark")
g.unlock_image("bigbeach1")
g.transform(slowpan)
g.unlock_image("beach1 mary")
g.unlock_image("beach2")
g.unlock_image("beach3")
# This button has a condition associated with it, allowing the game
# to choose which images unlock.
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")
# The last image in this button has an condition associated with it,
# so it will only unlock if the user gets both endings.
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")
# The final two buttons contain images that show multiple pictures
# at the same time. This can be used to compose character art onto
# a background.
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")
# The transition used when switching images.
g.transition = dissolve
# Step 3. The gallery screen we use.
screen gallery:
# Ensure this replaces the main menu.
tag menu
# The background.
add "beach2"
# A grid of buttons.
grid 3 3:
xfill True
yfill True
# Call make_button to show a particular 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)
add g.make_button("title", "title.png", xalign=0.5, yalign=0.5)
# The screen is responsible for returning to the main menu. It could also
# navigate to other gallery screens.
textbutton "Return" action Return() xalign 0.5 yalign 0.5
ステップ4はゲームがどのように構成されているかで変化しますが、方法の一つは
textbutton "Gallery" action ShowMenu("gallery")
メインメニューのスクリーンへの上記の行の追加です。
- class Gallery link
このクラスは画像のロックと一つ以上の画像を表示するアクションと、そのアクションを使用するためのボタンを作成するメソッドを提供してイメージギャラリーの作成をサポートします。
- transition link
画像を変更するときに使用されるトランジション
- locked_button link
ロックされたボタンに対する make_button で使用されるデフォルトの displayable
- hover_border link
make_button で使用されるデフォルトの hover border
- idle_border link
make_button で使用されるデフォルトの idle border
- unlocked_advance link
True なら gallery はアンロックされた画像にのみ進みます。
True なら gallery はナビゲーションとスライドショーボタンを画像の手前に表示します。
ナビゲーションの外観をカスタマイズするためには gallery_navigation スクリーンを上書きしてください。デフォルトスクリーンは renpy/common/00gallery.rpy で定義されています。
- span_buttons link
True なら gallery はボタン間を移動します。
- slideshow_delay link
スライドショーモードで gallery が画像を進行する時間です。
- image_screen = "_gallery"
このギャラリーの個々の画像を表示するためのスクリーンです。このスクリーンには次のキーワード引数が渡されます。 :
- locked
その画像がロックされていれば True です。
- displayables
ユーザーに表示される transform が適用された Displayable のリストです。
- index
1 から始まる表示される画像のインデックスです。
- count
現在のボタンに紐付けられた画像の数です。
- gallery
image gallery オブジェクト
show_ を Gallery.image と Gallery.unlock_image の呼び出し時の追加引数の接頭辞にすれば、それらの引数も渡せます。
デフォルトは renpy/common/00gallery.rpy の末尾で定義されています。
- Action(name) link
与えられたボタン名に関連づけられる画像を表示するアクション
- Next(unlocked=False) link
gallery 中の次の画像に進みます。
- unlocked
True ならアンロックされた画像のみ対象とします。
- Previous(unlocked=False) link
gallery 中の以前の画像に戻ります。
- unlocked
True ならアンロックされた画像のみ対象とします。
- Return() link
gallery の画像表示を停止します。
- ToggleSlideshow() link
スライドショーモードをトグルします。
- allprior() link
現在のボタンに関連づけられているすべての前の画像がアンロックされていたら条件が満されるアンロック用の条件を追加します。
- button(name) link
name と名付けられた新しいボタンを作成します。
- name
その名前のボタンが作成されます。
- condition(expression) link
式の評価が True なら条件が満たされるアンロック用の条件を追加します。
- expression
python 式の文字列
- get_fraction(name, format='{seen}/{total}') link
name の名前のボタンに関連づけられたすべての画像とアンロックされた画像の数の割合の文字列を返します。
- format
python の数字の体裁を整えるためのフォーマット文字列です。これには置換される三つの値を持たせられます。 :
- {seen}
見たことのある画像の数
- {total}
そのボタンのすべての画像の数
- {locked}
まだロックされている画像の数
- image(*displayables, **properties) link
新しい画像を現在のボタンに追加します。ここでは画像は一つ以上の displayable で構成されます。
show_ で始まるプロパティーはその接頭辞をとったものが gallery.image_screen スクリーンに追加のキーワード引数として渡されます。
- make_button(name, unlocked, locked=None, hover_border=None, idle_border=None, style=None, **properties) link
これは与えられたボタン名に関連づけられた画像を表示するボタンを作成します。
- name
その名前のボタンが作成されます。
- unlocked
アンロックされた時にこのボタンに表示される displayable
- locked
ロックされているときにこのボタンに表示される displayable. None なら gallery オブジェクトの locked_button フィールドが代わりに使われます。
- hover_border
このボタンがアンロックされ、フォーカスされている時にオーバーレイされる displayable 。None なら gallery オブジェクトの hover_border フィールドが代わりに使われます。
- idle_border
このボタンがアンロックされ、フォーカスされていない時にオーバーレイされる displayable 。None なら gallery オブジェクトの idle_border フィールドが代わりに使われます。
- style
ボタンが継承するスタイルです。None なら、 border などが継承されないようデフォルトの "empty" スタイルが使用されます。
追加のキーワード引数は作成されたボタンオブジェクトのスタイルプロパティーになります。
- transform(*transforms) link
登録された最後の画像に transform を適用します。これは画像が持つ displayable と同じ数の transform を引数にして呼び出されるべきです。
transform が None なら、デフォルトの transform が使用されます。
- unlock(*images) link
引数として一つ以上の画像名を受け取り、すべてのその名前の画像がプレイヤーに閲覧されると条件が満されるアンロック用の条件を追加します。画像名は文字列として指定されるべきです。
- unlock_image(*images, **properties) link
image と unlock を同じパラメーター (
show_
で始まるキーワード引数は image にのみ渡されます) で呼び出すのと等しい便利なメソッドです。これは画像が一度でも閲覧されれば表示されるようにします。画像は画像名の文字列として指定されるべきです。
ミュージックルーム link
ミュージックルームは ユーザーがゲームからミュージックトラックを選択して再生できるようにするスクリーンです。これらのトラックはユーザーがあるゲームを最初にプレイし始めるときには多分ロックされていて、ユーザーがゲーム中にその曲を聴くとアンロックされるでしょう。
ミュージックルームは MusicRoom クラスのインスタンスによって管理されます。複数のミュージックルームスクリーンを持つために、1つのゲームに1つ以上の MusicRoom インスタンスが存在できます。ミュージックルームの作成は以下の4ステップから構成されます。
MusicRoom のインスタンスを作成します。 MusicRoom は曲を再生するチャンネルや曲のフェードアウトやフェードインにかかる時間を制御するためのパラメーターを受け取ります。
インスタンスにミュージックファイルを追加します。
button や imagebutton, hotspot 用のアクションを作成するために、MusicRoom のインスタンスを使用してスクリーンを作成します。
使用されるアクションは MusicRoom のインスタンスのメンバ関数なので、 MusicRoom のインスタンスが
mr
ならmr.Play("track1.ogg")
が play アクションの使用法となります。ミュージックルームのスクリーンをメインメニューやエクストラメニューに追加します。
例
init python:
# Step 1. Create a MusicRoom instance.
mr = MusicRoom(fadeout=1.0)
# Step 2. Add music files.
mr.add("track1.ogg", always_unlocked=True)
mr.add("track2.ogg")
mr.add("track3.ogg")
# Step 3. Create the music room screen.
screen music_room:
tag menu
frame:
has vbox
# The buttons that play each track.
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
# Buttons that let us advance tracks.
textbutton "Next" action mr.Next()
textbutton "Previous" action mr.Previous()
null height 20
# The button that lets the user exit the music room.
textbutton "Main Menu" action ShowMenu("main_menu")
# Start the music playing on entry to the music room.
on "replace" action mr.Play()
# Restore the main menu music upon leaving.
on "replaced" action Play("music", "track1.ogg")
ステップ4はゲームがどのように構成されているかで変化しますが、方法の一つは
textbutton "Music Room" action ShowMenu("music_room")
メインメニューのスクリーンへの上記の行の追加です。
Preferences()
関数、 特に Preferences("music volume")
を使用すると、ボリュームスライダーをミュージックルームに含めることが可能です。
- class MusicRoom(channel='music', fadeout=0.0, fadein=0.0, loop=True, single_track=False, shuffle=False, stop_action=None) link
ミュージックルームはユーザーによってアンロックされる一連の曲と、そのリストから順番に登録された曲を再生するアクションを含みます。
- channel
このミュージックルームが処理されるチャンネル
- fadeout
トラックを変更するときに古い曲をフェードアウトするのにかける秒数
- fadein
トラックを変更するときに新しい曲をフェードインするのにかける秒数
- loop
プライリストの終端にたどり着いたときにループするか停止するかを決定します。
- single_track
True なら一つのトラックのみが再生されます。 loop が True ならそのトラックがループします。そうでなければそのトラックが終了すると再生が停止します。
- shuffle
True ならトラックはシャッフルされ、シャッフルされた順に再生されます。 False ならトラックは MusicRoom に追加された順に再生されます。
- stop_action
曲が停止したときに実行されるアクションです。
Single_track と shuffle は互いに矛盾します。いちどに片方のみ True にしてください ( siingle_track と shuffle を設定するアクションではこれを実施しています )。
- Next() link
ミュージックルームにプレイリストの次のアンロックされたファイルを再生させるアクションです。
- Play(filename=None) link
ミュージックルームに音楽を再生させるアクションです。 filename が与えられた場合、そのファイルが再生されます。それ以外の場合は再生中の音楽を再生し直すか(アンロックされている場合)、あるいは最初のファイルが再生されます。
filename が与えられている場合、このアクションのボタンは filename がロックされている間は選択不能となり、 filename が再生中なら選択された状態となります。
- Previous() link
プレイリストの前のアンロックされたファイルをミュージックルームに再生させるアクション。
- RandomPlay() link
このアクションはアンロックされたトラックからランダムに選択してミュージックルームに再生を開始させます。
- SetLoop(value) link
このアクションは loop の値を設定します。
- SetShuffle(value) link
このアクションは shuffle の値を設定します。
- SetSingleTrack(value) link
このアクションは single_track の値を設定します。
- Stop() link
このアクションは曲を停止します。
- ToggleLoop() link
このアクションは loop の値をトグルします。
- TogglePause() link
音楽再生中ならそれをポーズまたはポーズ解除します。
このボタンは曲がポーズされているとき選択状態になります。
- TogglePlay() link
曲が再生中でなければこのアクションは最初のアンロックされたトラックを再生します。そうでなければ現在再生中の曲を停止します。
このボタンはどの曲が再生されているときでも選択状態にあります。
- ToggleShuffle() link
このアクションは shuffle の値をトグルします。
- ToggleSingleTrack() link
このアクションは single_track の値をトグルします。
- add(filename, always_unlocked=False, action=None) link
ミュージックルームにミュージックファイル filename を追加します。ミュージックルームは追加された順にアンロックされたファイルを再生します。
- always_unlocked
True ならそのミュージックファイルは常にアンロックされた状態です。これはそれがゲーム内で再生される前にもファイルがミュージックルームに表示されるようにします。
- action
アクションか、アクションのリストです。このファイルが再生される時に呼び出されます。
例えばこれらのアクションは、ファイルの再生によってスクリーンや背景、説明文を変更するときに使われます。
- is_unlocked(filename) link
filename
がアンロック ( または always unlocked ) されていれば True を返し、まだロックされていれば False を返します。
リプレイ link
Ren'Py にはメインメニューやゲームメニューからシークエンス(訳注 物語の1シーンをシークエンスと呼ぶ) を再生する機能もあります。これはプレイヤーが重要なシークエンスを繰り返せるようにするシークエンスギャラリーを作成するのに使えます。シークエンスが終わると、 Ren'Py はリプレイを実行した場所に戻ります。
シークエンスリプレイは Start()
アクションを使用しても可能です。2つのモードの違いは :
リプレイはどんなスクリーンからでも実行可能な一方、 Start はメインメニューかメインメニューから表示されたスクリーン内でしか使用できません。
リプレイが終わると、リプレイが実行された場所に制御が返されます。その場所はメインメニューかゲームメニュー内があり得ます。例えばゲーム進行中にリプレイが呼び出された場合、ゲームの状態は保存されます。
リプレイモードではセーブは無効化されます。リロードもセーブを必要とするため無効となります。
リプレイモードで
renpy.end_replay()
を呼び出すとリプレイは終了します。ノーマルモードでは end_replay は何もしません。
リプレイモードを利用するためには、シークエンスがラベルで始まり、 renpy.end_replay()
で終わるべきです。シークエンスはレイヤーと変数が同じであることを当然としてはいけません。それらはノーマルモードとリプレイモードでは全く違うこともあり得ます ( リプレイでは一旦画面をブラックアウトしてからラベルが実行されます )。
例
"And finally, I met the wizard himself."
label meaning_of_life:
scene revelation
"Mage" "What is the meaning of life, you say?"
"Mage" "I've thought about it long and hard. A long time, I've
spent pondering that very thing."
"Mage" "And I'll say - the answer - the meaning of life
itself..."
"Mage" "Is forty-three."
$ renpy.end_replay()
"Mage" "Something like that, anyway."
シークエンスがこのように定義されると、リプレイは Replay アクションで実行できます
textbutton "The meaning of life" action Replay("meaning_of_life")
リプレイモードで使われる store 変数が一つあります :
- _in_replay link
リプレイモードではこれはリプレイが開始されたラベル(呼び出されたラベルであって呼び出し元のラベルではありません)を返し、そうでなければこれは None です。
さらに config.enter_replay_transition
と config.exit_replay_transition
はリプレイ開始時と終了時にそれぞれ使用されます。 config.replay_scope
はリプレイ開始時にリセットされる store に変数を追加します。リプレイ中の右クリックではpreferences スクリーンを表示するように、デフォルトでは _game_menu_screen
を設定します。
以下の変数とアクションはリプレイモードで実行されます。
- EndReplay(confirm=True) link
現在のリプレイを終了します。
- confirm
True ならリプレイを終了する前にユーザーに確認を促します。
- Replay(label, scope={}, locked=None) link
リプレイとして label を開始するアクション
- scope
変数名を値に対応付ける辞書です。これらの値はリプレイに入るときに設定されます。
- locked
True の場合、このアクションは無効となり、呼び出されても何もしません。 False なら通常どおり振る舞います。 None の場合はそのラベルがこれまでのプレイで未読ならばロックします。
- renpy.call_replay(label, scope={}) link
リプレイモードでラベルを呼び出します。
scope 引数を使用して、リプレイ用のコンテキストでの変数の値を初期化できます。
- renpy.end_replay() link
リプレイ中ならリプレイを即座に中止し、そうでなければ何もしません。