Ren'Py のゲームを見ると、ゲームを画像とユーザーインターフェイスの2つの部分に分割できることに気づくでしょう。画像は scene、show、hide ステートメントを使ってユーザーに表示し、一般には進行中のストーリーの一部となっています。それ以外の部分はユーザーインターフェイスの一部で、スクリーンを使ってカスタマイズします。
スクリーンは4つの方法で表示できます:
スクリプトのステートメントが実行されるときに暗黙的に表示する。例えば、say ステートメントが実行されると、 say スクリーンが表示されます。
自動的に表示する。例えば Ren'Py はゲーム開始時やユーザーがメインメニューに戻るとき、 main_menu スクリーンを表示します。
ボタン、マウスのボタン、キーボードのキーによるアクションで表示する。デフォルトでは、ユーザーが右クリックするか、エスケープキーが押された時に save スクリーンが表示されます。他にも、スクリーン上にボタンを定義して save スクリーンを表示も可能です。
明示的に、ステートメントを使ってスクリーンを表示する。
一度に複数のスクリーンを表示できます。
スクリーンには主に2つの機能があります。1つはユーザーへの情報掲示です。情報はテキスト、バー、画像を使って示せます。ゲームのプレイにおいて、一部の情報のこのような形での掲示は重要です。 say スクリーンで例を挙げると、これを使用してキャラクター名と彼女が話している内容を含んだダイアログをユーザーに表示します。
他にスクリーンはユーザーからの入力を受け付けてゲームに反映できます。ボタンやバーを使ってアクションを起こしたり値を調整したりできます。Ren'Py には事前に定義されているアクションのプールがあり、ゲームを進められるようにしたり、設定を調整したり、ゲームをロード・セーブしたり、その他多数のアクションを発生させたりできます。ゲーム製作者も新しいアクションを Python で書けます。
スクリーンはゲームがインタラクションを開始した時、及びインタラクションが再開されるたびに更新されます。with None
ステートメントはインタラクションを発生させず、スクリーンを更新させないので注意してください。
スクリーンはそれに関連付けられたスコープを持ち、変数に値を与えます。スクリーンから変数にアクセスされると最初にそのスコープ内を参照し、次にグローバルスコープを参照します。
スクリーンのコードはスクリーン外への副作用を起こしてはいけません Ren'Py はスクリーンが最初に表示される前に画像予測処理の一部として必要なら何度もスクリーンのコードを実行します。結果としてスクリーンのコードが副作用を持つなら、それが何回実行されるかはわかりません。
スクリーン内でのPython のジェネレーターの使用は予想外な結果になるかもしれません これは Python インタプリタがスクリーンコンテンツ内で使用される python コードをコンパイルする方法による問題に由来します。スクリーンから呼び出される Python 関数ではジェネレーターは使用可能ですが、スクリーン自体ではできません。
スクリーン言語はほとんどが表示するスクリーンを宣言する方法であり、新しい displayable の宣言、スクリーンへの displayable の追加、ステートメントを制御するステートメントで構成されます。
ここにスクリーンの例があります。
screen say(who, what):
window id "window":
vbox:
spacing 10
text who id "who"
text what id "what"
この最初の行は screen ステートメントで、スクリーンを宣言するために使用される Ren'Py ステートメントです。スクリーンの名前は say なので、これは台詞を表示するために使用されるスクリーンです。 2 つのパラメーター who, what を受け取ります。
このスクリーンには「 window 」の id を持つウィンドウがあります。このウィンドウは縦長の箱を持ち、その中に 10 ピクセルの空白を含みます。さらにその箱には二つのテキスト用の領域があり、一つは話し手の名前、もう一つは話している内容を表示するものです。
ほとんどのスクリーン言語は共通の構文を持ちます ( 制御用ステートメントのいくつかは違う構文を持ちますが )。 ステートメントはステートメントを導入するキーワードで行の最初から始まります。
ステートメントがパラメーターを受け取るなら、キーワードの直後に続きます。パラメーターはスペースで区切られた単純式で、そうでないなら記載します。
位置パラメーターの後にはプロパティーリストが続きます。プロパティーはプロパティーの名前とそれに続くそのプロパティーの値で構成されます。プロパティーの値は特に記載がなければ単純式です。プロパティーリストはスペースで区切られた一連のプロパティーです。
ステートメントがコロン :
で終るとその後にブロックが続きます。ブロックの各行は以下の二つのどちらかです。 :
プロパティーリスト
スクリーン言語のステートメント
screen ステートメントは新しいスクリーンを宣言するための Ren'Py のスクリプト言語の一つで、スクリーン言語共通の文法で解釈されます。
パラメーターを一つ受け取り、それはスクリーンの名前です。これは名前であって、式ではありません。以下のプロパティーも受け取ります。 :
True ならそのスクリーンはモーダルです。モーダルなスクリーンはデフォルトのキーマップを除いて、ユーザーがその下にある displayable に作用できないようにします。これはゲーム開始時に一度評価されます。
ボタンが有効かどうかを決定する式です。この式はインテラクション毎に少なくとも一回評価されます。
式ではなく名前として解釈されます。これはこのスクリーンと関連づけられるタグを指定します。スクリーンの表示は同じタグの他のスクリーンを置き換えます。これを使用して一つのコンテキストには同時に一つのメニューのスクリーンのみが表示されるようにできます。
これはスクリーンがどれぐらいユーザーに近いかを制御します。数字が大きいほどスクリーンはユーザーの近くに表示されます。デフォルトでは 0 です。
与えられるならこれは定義されるスクリーン variant 名の文字列または文字列のリストです。 スクリーン variant を参照してください。
後述のように このスクリーンの子のスタイルに接頭辞を与える文字列です。
そのスクリーンが表示されるデフォルトのレイヤー名の文字列です。
True なら、そのスクリーンが call screen
ステートメントで呼び出されたときロールフォワードが有効化されます。 False なら無効、 None または未指定ならば config.call_screen_roll_forward
の値が使用されます。
call screen
ステートメントからロールフォワードする場合、戻り値やターミナルジャンプは保持されますが、その他の副作用は発生しません。つまり、スクリーンが Jump()
と Return()
アクションのみで構成されている場合には、 roll_forward を有効しても安全です。その他のアクションは副作用を持つかもしれませんが、 roll_forward 中は発生しません。
screen hello_world():
tag example
zorder 1
modal False
text "Hello, World."
スクリーンはパラメーターリストも受け取れます。
screen center_text(s, size=42):
text s size size
もしスクリーンにパラメータがなくても空の括弧を与えるべきです。他のスクリーンが括弧のないスクリーンを use
で使用したときの動作の違いは use ステートメント に関するセクションで説明されています。他のスクリーンが use
で使用しなくても、そのスクリーンに括弧を与えないと、 Ren'Pyの内部で動作する方法において、純粋に非効率になります。パラメータに関する スクリーン言語の最適化 セクションを参照してください。
ユーザーインターフェイスステートメントは displayable を作成してそれをスクリーンか、これを含めるdisplayable に追加します。ユーザーに情報を表示してゲームに作用したり、ゲームが様々なイベントに反応できるようにします。
すべてのユーザーインターフェイスステートメントは以下の共通のプロパティーを受け取ります。 :
これは transform または transform のリスト、無名の transform ( at 節で直接定義された transform )です。
transform hello_t:
align (0.7, 0.5) alpha 0.0
linear 0.5 alpha 1.0
screen hello_title():
text "Hello." at hello_t
text "Hello.":
at transform:
align (0.2, 0.5) alpha 0.0
linear 0.5 alpha 1.0
この transform を使用してこの displayable をラップします。show や hide, replace, replaced の外部イベントは直接スクリーンに加えられた場合のみ がtransform に送られます。
例えば vbox に transform が適用されて、直接スクリーンに追加されているとイベントはその transform に送られます。しかしある transform が vbox に追加されているテキストボタンに適用されていると、この第二の transform にはイベントが送られません。
True を与えるとその displayable はデフォルトでフォーカスを持つようになります。複数の displayable がこれを持つときは、その値が比較されて最大のものをもつ displayable がデフォルトフォーカスを持ちます。
デフォルトフォーカスは最後のインタラクションがマウスクリックやマウスの動き、タッチでないときのみ使用されます。
ユーザーインターフェイスステートメント用の識別子です。スクリーンが表示されるときに指定された id を持つ displayable に適切な値が提供されます。いくつかのスクリーンでは指定された id を持つ displayable 作成が必要とされます。
デフォルトでは id
は自動的に生成されます。
この displayable に適用されるスタイルの名前です。そのスタイルはスタイルプロパティーにデフォルトの値を与えます。
より限定的なスタイルやスタイル接頭辞がこの displayable とその子になければ、そのすべての子のスタイルに接頭辞を与えます
スタイル名はスタイル接頭辞とアンダースコア、スタイル接尾辞を繋げて作られます。スタイル接尾辞は style_suffix から指定されるか、 displayable によって決定されます。
例えば vbox がスタイル接頭辞「 pref 」を持っていると、 vbox にはスタイル「 pref_vbox 」が指定されます。より限定的なスタイルやスタイル接頭辞が指定されていなければ、その vbox 内のボタンはスタイル「 pref_button 」を持ちます。
このようにアクセスされるスタイルは、もしなければ作成されます。接頭辞を None
に設定するとこの displayable とその子から接頭辞がなくなります。
style_prefix のエイリアスで、古いバージョンの Ren'Py で使用されます。
style_prefix と結合してスタイル名になる接尾辞を指定します。これが "small_button"
でスタイル接頭辞が "pref"
なら、スタイルは "pref_small_button"
が使用されます。
スタイル接頭辞がなければ、これはスタイル名が直接使用されます。スタイル接尾辞は単独の displayable のみに適用され、 displayable の子には適用されません。
文字列か整数を受け取って displayable にフォーカス用の名前を与えます。Ren'Py はインタラクションの開始時にフォーカスを与える displayable を決定するとき、フォーカスの名前の間に構造的な類似点を探します。例えばある box にフォーカス名が与えられていてその box の三つ目のボタンがインタラクションの最後にフォーカスを所得していれば、同じフォーカス名を持つ box の三つ目のボタンが次のインタラクションの開始時にハイライトされるます。
tooltip をこの dispalyable に代入します。displayable がフォーカスを得ると、このプロパティーの値が GetTooltip()
関数から利用可能になります。詳細は Tooltip を参照してください。
tooltip に渡されるオブジェクトは等号をサポートしなければなりません。そうでなければ、無限ループが発生します。
displayable に与えられる追加の位置引数のタプルやリストです。
displayable に与えられる追加のプロパティーを含む辞書です。
多くのユーザーインターフェイスステートメントはスタイルプロパティーや transform プロパティーの類いを受け取ります。これらのプロパティーには対応するスタイル接頭辞を持たせて、いつそれらが適用されるか決められます。例えばテキストに hover_size
プロパティーが与えられるとそれはテキストの上にマウスがあるときのテキストの大きさを設定します
ユーザーインターフェースステートメントは as
節を受け取り、それは引用符なしで変数名を受け取ります。ステートメントが作成する displayable がその変数に代入されます(the drag and drop documentation で例が見られます)。
データを閲覧したり調整するための水平方向のバーを作成します。以下のプロパティーを受け取ります。
バーの現在の値です。これは bar value オブジェクトか数字になります。
バーの最大値です。これは value が数字なら必要です。
このバーを調整する ui.adjustment()
オブジェクトです。
与えるならこれは python 関数であるべきです。関数は adjustment が変更されるとその adjustment の value を引数に呼び出されます。
バーがフォーカスを所得したときのアクションです。
バーがフォーカスを失うときのアクションです。
バーが離されると実行されるアクションです。これはバーが変化していなくても実行されます。
value か adjustment のどちらかは与えられなければなりません。さらにこの機能は以下を受け取ります。 :
これは子は受け取りません。
screen volume_controls():
frame:
has vbox
bar value Preference("sound volume") released Play("sound", "audio/sample_sound.ogg")
bar value Preference("music volume")
bar value Preference("voice volume")
スクリーンのあるエリアを、アクティベートしてアクションを実行できるようにします。ボタンはパラメーターを受け取らず以下のプロパティーを受け取ります。
ボタンがアクティベートされると実行するアクションです。ボタンはクリックされるか、プレイヤーが選択してキーボードのエンターを押すかするとアクティベートされます。これは sensitive がなければボタンが有効かどうかの、 selected がなければ選択されているかどうかの制御もします。
ボタンが代替方法でアクティベートされると実行される代替アクションです。代替方法はプレイヤーがマウスベースのプラットフォームでボタン上で右クリックするか、タッチベースのプラットフォームで長押しすると発生します。
ボタンがフォーカスを所得するときのアクションです。
ボタンがフォーカスを失うときのアクションです。
ボタンが選択されているかどうかを決定する式です。この式はインテラクション毎に少なくとも一回評価されます。 指定されなければ、アクションが選択状態決定に使用されます。
ボタンが有効かどうかを決定する式です。この式はインテラクション毎に少なくとも一回評価されます。 指定されなければ、アクションが有効無効決定に使用されます。
押すとこのボタンのアクションを実行するキーボードのキーを表わす キーシンボル の文字列です。
押すとこのボタンの代替アクションを実行するキーボードのキーを表わす keysym の文字列です。
以下も受け取ります。 :
これは子を一つ受け取ります。 ゼロまたは二つ以上の子が指定されるとそれらは暗黙のうちに fixed に追加され、それがボタンに追加されます。
dismiss ステートメントは、非常に特殊な dismiss displayable を作成します。これは他の displayable にフォーカスがないときにフォーカスを獲得し、それがアクティベートされたときにアクションを実行します。この点では、say ステートメントの動作と非常によく似ています。
これはめったに使用されず、主にポップアップ ウィンドウのように、プレイヤーがモーダルフレームの外側をクリックすると、モーダルフレームが解除されるようにするために使用されます。
これは以下のプロパティーを受け取ります。 :
dismiss がアクティベートされたときに処理されるアクションです。このプロパティーは必ず必要です。
dimiss はデフォルトではモーダルであり、その「後ろ」の displayable によってイベントが処理されるのを防ぎます。
以下も受け取ります。 :
hover_sound
と activate_sound
スタイルプロパティー
ここに dismiss の使用例があります。
screen dismiss_test():
dismiss action Return()
frame:
modal True
align (.5, .3)
padding (20, 20)
has vbox
text "This is a very important message.":
xalign 0.5
text_align 0.5
# Dismiss can be confusing on its own, so we'll add a button as well.
textbutton "Dismiss":
xalign 0.5
action Return()
dismiss と nearrect の組み合わせの使用方法も参照してください。
これは子を追加可能な領域を作成します。デフォルトでは fixed は利用可能な領域をすべて使用しますが、 xmaximum
や ymaximum
プロパティーを使用すればこれを変更できます。
子はそれぞれの位置スタイルプロパティーに従って配置されます。適切に位置が指定されていないと、これらは重なり合ってしまうかもしれません。
fixed ステートメントはパラメーターは受け取らず、以下のプロパティーを受け取ります。 :
これは fixed に追加されるすべての子を受け取ります。
fixed displayable を明示的に作成する必要はほとんどありません。各スクリーンは fixed displayable に含まれており、多くのスクリーン言語は二つ以上の子を持つと自動的に fixed を生成します。
screen ask_are_you_sure:
fixed:
text "Are you sure?" xalign 0.5 yalign 0.3
textbutton "Yes" xalign 0.33 yalign 0.5 action Return(True)
textbutton "No" xalign 0.66 yalign 0.5 action Return(False)
frame はユーザーインターフェイスを表示するための背景を含むウィンドウで、以下のプロパティーを受け取ります。 :
これは一つの子を受け取ります。 0 か 2 以上の子が指定されると、それらを含めるために fixed が作成されます。
screen test_frame():
frame:
xpadding 10
ypadding 10
xalign 0.5
yalign 0.5
vbox:
text "Display"
null height 10
textbutton "Fullscreen" action Preference("display", "fullscreen")
textbutton "Window" action Preference("display", "window")
これはその子をグリッドに表示します。各子には最大のサイズの子と同じサイズの領域が与えられます。
二つのパラメーターを受け取ります。最初の要素はグリッドの縦の列の数で、第二要素はグリッドの横の列の数です。以下のプロパティーを受け取ります。 :
デフォルトは False で、横の列が縦の列より先に埋められます。 True なら縦の列が横の列より先に埋められます。
以下も受け取ります。 :
これには縦x横だけの子が指定される必要があり、違う数の子が指定されるとエラーになります。
screen grid_test:
grid 2 3:
text "Top-Left"
text "Top-Right"
text "Center-Left"
text "Center-Right"
text "Bottom-Left"
text "Bottom-Right"
これはその子を透明な横長の箱に左から見に並べて表示します。これはパラメーターを受け取らず、以下のプロパティーを受け取ります。 :
UI displayable の子はボックスに追加されます。
screen hbox_text():
hbox:
text "Left"
text "Right"
その上にマウスがあると状態が変化する画像で構成されるボタンを作成します。これはパラメーターを受け取らず、以下のプロパティーを受け取ります。 :
このボタンに使用する画像を自動的に定義するために使用されます。これは %s を含む文字列であるべきです。これが指定されて、画像のプロパティーの一部が省略されていると %s をそのプロパティーの名前で置き換えて、その値をそのプロパティーのデフォルトとして使用します。
例えば auto が "button_%s.png" で idle が省略されると、 idle はデフォルトで "button_idle.png" になります。同様に auto が "button %s" なら button idle
画像が使用されます。
auto の動作は config.imagemap_auto_function
を変更してカスタマイズできます。
ボタンが無効の時使用される画像です。
ボタンがフォーカスを持っていない時使用される画像です。
ボタンがフォーカスを持っている時使用される画像です。
ボタンが選択されアイドル状態の時使用される画像です。
ボタンが選択されフォーカスを持っている状態の時使用される画像です。
ボタンがアクティベートされると実行されるアクションです。これは sensitive がなければボタンが有効かどうかの、 selected がなければ選択されているかどうかの制御もします。
ボタンが代替方法でアクティベートされると実行される代替アクションです。代替方法はプレイヤーがマウスベースのプラットフォームでボタン上で右クリックするか、タッチベースのプラットフォームで長押しすると発生します。
ボタンがフォーカスを所得するときのアクションです。
ボタンがフォーカスを失うときのアクションです。
ボタンが選択されているかどうかを決定する式です。この式はインテラクション毎に少なくとも一回評価されます。 指定されなければ、アクションが選択状態決定に使用されます。
ボタンが有効かどうかを決定する式です。この式はインテラクション毎に少なくとも一回評価されます。 指定されなければ、アクションが有効無効決定に使用されます。
押すとこのボタンのアクションを実行するキーボードのキーを表わす キーシンボル の文字列です。
押すとこのボタンの代替アクションを実行するキーボードのキーを表わす keysym の文字列です。
以下も受け取ります。 :
これは子を受け取りません。
screen gui_game_menu():
vbox xalign 1.0 yalign 1.0:
imagebutton auto "save_%s.png" action ShowMenu('save')
imagebutton auto "prefs_%s.png" action ShowMenu('preferences')
imagebutton auto "skip_%s.png" action Skip()
imagebutton auto "afm_%s.png" action Preference("auto-forward mode", "toggle")
テキスト入力をする領域を作成し、ユーザーがテキストを入力できるようにします。ユーザーが Enter を押すと、テキストがインタラクションから返されます (call screen
からスクリーンを呼び出したときは _return
変数に結果が代入されます) 。
Android や ウェブプラットフォームではサポートするライブラリーの制限により、 input Displayable はアルファベット文字に制限されます(訳注 こちら にカナ漢字変換対応のスクリーンキーボードを用意しました。)。
input ステートメントはパラメーターを受け取らず、以下のプロパティーを受け取ります。 :
この input が使用する input value オブジェクトです。 InputValue オブジェクトはデフォルト値、テキスト変更、エンター押下時の動作、テキストがデフォルトで変更可能かどうかを決定します。
これは default や changed と同時に指定してはいけません。
入力されるデフォルトのテキストです。
入力されるテキストの最大の長さです。
入力の最大ピクセル幅です。入力した文字がこの幅を越えると、そのキー入力は無視されます。
入力できる文字を含む文字列です (デフォルトではすべての文字が許可されます )。
入力出来ない文字を含む文字列です。 (デフォルトでは「{}」です。 )
True なら、この入力へのコピーとペーストが可能になります(デフォルトでは無効です)。
ユーザーが入力したテキストの先頭に追加される文字列です。
ユーザーが入力したテキストの末尾に追加される文字列です。
ユーザーが入力した文字列を引数に、文字列が変更したときに呼ばれる python 関数です。
テキストに表示される各文字を置き換える文字列です。これはパスワードのマスクに使用されます。
False またはデフォルトキャレットの点滅期間です。 config.input_caret_blink
を上書きします。
以下も受け取ります。 :
これは子を受け取りません。
screen input_screen():
window:
has vbox
text "Enter your name."
input default "Joseph P. Blow, ESQ."
これはあるキー、または指定したリストのどれかのキーが押されるとあるアクションを実行するキーバインドを作成します。 キーはここではジョイスティックやマウスイベントも含む大まかな意味で使用されています。
key はパラメーターを一つ受け取り、それは関連づけるキーの文字列です。利用可能なキーについては キーマップのカスタマイズ の章を参照してください。これは1つのプロパティーを受け取ります:
これはキーが押されると実行されるアクションを与えます。このプロパティーは必ず必要です。
デフォルトでは True で、そのイベントは捕捉され、他の Displayable には渡されません。 False かつアクションがインタラクションを終えなければ、そのイベントは他の Displayable に渡されます。
これは子を受け取りません。
screen keymap_screen():
key "game_menu" action ShowMenu('save')
key "p" action ShowMenu('preferences')
key ["s", "w"] action Screenshot()
ラベルスタイルのウィンドウを作成し、その内側にテキストを置きます。同時にこの連携はフレーム内部にラベルを貼るために使用されます。
位置引数を一つ持ち、それはラベルの文字列です。以下のプロパティーも受け取ります。 :
ボタンテキストに使用されるスタイルの名前です。これが指定されず、さらに style プロパティーが文字列なら、「 _text 」がその文字列に追加されてデフォルトのテキストスタイルになります。
text を接頭辞に持つその他のプロパティーは、この接頭辞を取り除いてテキスト displayable に渡されます。
以下も受け取ります。 :
子は受け取りません。
screen display_preference():
frame:
has vbox
label "Display"
textbutton "Fullscreen" action Preference("display", "fullscreen")
textbutton "Window" action Preference("display", "window")
マウスエリアはマウスの出入りに反応できるスクリーンの領域です。ボタンと違ってマウスエリアはフォーカスを受け取らないので、その内部にボタンを持つマウスエリアも可能です。 mousearea
ステートメントはパラメーターを受け取らず、以下のプロパティーを受け取ります。 :
マウスエリアにマウスが入ると実行されるアクション
マウスエリアからマウスが出ると実行されるアクション
focus_mask
スタイルプロパティーで、 displayable か None です。displayable ならマウスがその displayable の不透明な領域上にあるときのみマウスエリアはフォーカスを持ちます ( displayable はユーザーには表示されません )。
以下も受け取ります。 :
子は受け取りません。
通常 mouseare ステートメントは area
スタイルプロパティーを受け取ってマウスエリアのサイズや位置を制御します。そのサイズを制御しないとマウスエリアは画面全体になり、かなり不便です。
注釈
Ren'Py のゲームはキーボードとジョイスティックでもプレイ出来るので、他の方法でもマウスエリアの機能を再現してください。
screen button_overlay():
mousearea:
area (0, 0, 1.0, 100)
hovered Show("buttons", transition=dissolve)
unhovered Hide("buttons", transition=dissolve)
screen buttons():
hbox:
textbutton "Save" action ShowMenu("save")
textbutton "Prefs" action ShowMenu("preferences")
textbutton "Skip" action Skip()
textbutton "Auto" action Preference("auto-forward", "toggle")
label start:
show screen button_overlay
nearrect
ステートメントは子オブジェクトをひとつ受け取り、その子オブジェクトをある矩形に近い位置に配置します。通常これは CaptureFocus()
アクションを使用して保存された、フォーカスされた矩形です。これは、ツールチップやドロップダウンメニュー、プルダウンメニューに使用できます。
Nearrect は次のプロパティーを受け取ります :
指定するならばこれは後述するように (x, y, w, h) の形の矩形であるべきす。これに対し、その子が相対指定で配置されます。
指定するならこれは文字列であるべきです。この文字列は GetFocusRect()
相当な物に渡され、その矩形を探します。その名前のフォーカスされた矩形が見つかれば、子が描画されます。
これに "tooltip" を渡せば、ツールチップを表示している間中、最後にフォーカスされた位置を使用します。
指定するとその子をフォーカスされた矩形上部に優先的に配置されます。
以下も受け取ります。 :
Nearrect は他のレイアウトと異なり、その子をその内部ではなく指定の矩形の近くに配置します。その子はまずは利用可能な幅全体とその矩形の上と下の高さの最大値で描画されます。 y 座標は次のように算出されます。
その子が矩形の上部におさまり、かつ prefer_top が指定されていれば、矩形のすぐ上に配置されます。
そうではなく、子が矩形の下に収まれば、矩形直下に配置されます。
それ以外の場合、子は矩形のすぐ上に配置されます。
x 座標は通常の規則で計算され、子の xpos
と xanchor
プロパティー、および xalign
のようにそれらを設定するプロパティーが使用されます。 位置プロパティーは矩形のx座標に対する相対値であり、浮動小数点の場合は幅に対する割合です。
最後に、 xoffset
と yoffset
プロパティーは通常通り適用されます。
nearrect の子が transform だった場合、その transform には show
と hide
イベントが与えられますが、位置は即座に変更されます。 nearrect は画面の一番上で最適に動作し、 transforms と 配置は nearrect ではなくその子に適用されます。
nearrect の使用の 1 つはドロップダウンメニューです。
default difficulty = "Easy"
screen select_difficulty():
# This frame can be a very complex layout, if required.
frame:
align (.5, .3)
padding (20, 20)
has vbox
# This is the button that is clicked to enable the dropdown,
textbutton "Difficulty: [difficulty]":
# This action captures the focus rectangle, and in doing so,
# displays the dropdown.
action CaptureFocus("diff_drop")
textbutton "Done":
action Return()
# All sorts of other screen elements could be here, but the nearrect needs
# be at the top level, and the last thing show, apart from its child.
# Only if the focus has been captured, display the dropdown.
# You could also use showif instead of basic if
if GetFocusRect("diff_drop"):
# If the player clicks outside the frame, dismiss the dropdown.
# The ClearFocus action dismisses this dropdown.
dismiss action ClearFocus("diff_drop")
# This positions the displayable near (usually under) the button above.
nearrect:
focus "diff_drop"
# Finally, this frame contains the choices in the dropdown, with
# each using ClearFocus to dismiss the dropdown.
frame:
modal True
has vbox
textbutton "Easy" action [ SetVariable("difficulty", "Easy"), ClearFocus("diff_drop") ]
textbutton "Medium" action [ SetVariable("difficulty", "Medium"), ClearFocus("diff_drop") ]
textbutton "Hard" action [ SetVariable("difficulty", "Hard"), ClearFocus("diff_drop") ]
textbutton "Nightmare" action [ SetVariable("difficulty", "Nightmare"), ClearFocus("diff_drop") ]
ドロップダウンではスタイルを改善した方がよいかもしれませんが、ここでは述べません。
null ステートメントはスクリーンに空白の領域を挿入します。これは間を開けるために使用されます。 null ステートメントはパラメーターは受け取らず、以下のプロパティーを受け取ります。 :
ピクセル数での空白の幅です。
ピクセル数での空白の高さです。
以下も受け取ります。 :
子は受け取りません。
screen text_box():
vbox:
text "The title."
null height 20
text "This body text."
これはグリッドの中心か端に displayable を配置します。これはパラメーターを一つ受け取り、それはスペースで区切られたその子を配置する場所のリストです。このリストの各要素は次のうちの一つです。 :
'c', 't', 'b', 'l', 'r', 'tl', 'tr', 'bl', 'br'
「c」は中心、「t」は上端、「tl」は左上端、「br」は右下などのように表わしています。
side は以下のプロパティーを受け取ります。 :
グリッドの縦横の列の間のスペース
side は以下の種類のプロパティーも受け取ります。 :
レンダリング時に、これは最初に角を、次に側面、最後に中心のサイズを決定します。角と側面は利用可能な領域を 0 としてレンダリングされるので、それらに最小のサイズを与えて ( xminimum
または yminimum
を使用して ) すべてが描画される保証をする必要があります。子は上から下(つまり引数の文字列順)へ順に配置され、最後が最も高くなります。これは config.keep_side_render_order
によって無効化されます。
位置リストのすべてに対応する子があるので、これは位置リストに登録されているのと同じ数の子を持たなければなりません。
screen side_test():
side "c tl br":
text "Center"
text "Top-Left"
text "Bottom-Right"
text ステートメントはテキストを表示します。これはパラメーターを一つ受け取り、それは表示するテキストです。以下のプロパティーも受け取ります。 :
子は受け取りません。
screen hello_world():
text "Hello, World." size 40
テキストラベル付きのボタンを作成します。ボタンはパラメーターを一つ受け取り、それはボタンの一部として含まれるテキストです。以下のプロパティーを受け取ります。 :
ボタンがアクティベートされると実行されるアクションです。これは sensitive がなければボタンが有効かどうかの、 selected がなければ選択されているかどうかの制御もします。
ボタンが代替方法でアクティベートされると実行される代替アクションです。代替方法はプレイヤーがマウスベースのプラットフォームでボタン上で右クリックするか、タッチベースのプラットフォームで長押しすると発生します。
ボタンがフォーカスを所得するときのアクションです。
ボタンがフォーカスを失うときのアクションです。
ボタンが選択されているかどうかを決定する式です。この式はインテラクション毎に少なくとも一回評価されます。 指定されなければ、アクションが選択状態決定に使用されます。
ボタンが有効かどうかを決定する式です。この式はインテラクション毎に少なくとも一回評価されます。 指定されなければ、アクションが有効無効決定に使用されます。
押すとこのボタンのアクションを実行するキーボードのキーを表わす キーシンボル の文字列です。
押すとこのボタンの代替アクションを実行するキーボードのキーを表わす keysym の文字列です。
ボタンテキストに使用されるスタイルの名前です。これが指定されず、さらに style プロパティーが文字列なら、「 _text 」がその文字列に追加されてデフォルトのテキストスタイルになります。
text を接頭辞に持つその他のプロパティーは、この接頭辞を取り除いてテキスト displayable に渡されます。
以下も受け取ります。 :
子は受け取りません。
screen textbutton_screen():
vbox:
textbutton "Wine" action Jump("wine")
textbutton "Women" action Jump("women")
textbutton "Song" action Jump("song")
これは時間が来るとアクションを実行するタイマーを作成します。これは位置パラメーターを一つ受け取り、それは秒数です。以下のプロパティーも受け取ります。 :
時間が来ると実行するアクションを指定します。このプロパティーは必須です。
True ならその時間が経つ度にタイマーが繰り返し実行されます。
True なら、モーダルスクリーンによりブロックされるとそのタイマーは動作しません。 False または指定されないと、タイムーはモーダルスクリーンでブロックされても動作します。
Timer は子を受け取りません。
screen timer_test():
vbox:
textbutton "Yes." action Jump("yes")
textbutton "No." action Jump("no")
timer 3.0 action Jump("too_slow")
横向きになった bar です。プロパティーは bar と同じです。
screen volume_controls():
frame:
has hbox
vbar value Preference("sound volume")
vbar value Preference("music volume")
vbar value Preference("voice volume")
これはその子を透明な縦長の箱に縦に並べて表示します。これはパラメーターを受け取らず、以下のプロパティーを受け取ります。 :
UI displayable の子はボックスに追加されます。
screen vbox_test():
vbox:
text "Top."
text "Bottom."
viewport はドラッグやマウスホイールまたはスクロールバーでスクロール可能なスクリーンの領域です。画面より大きいものを表示するために使用され、以下のプロパティーを受け取ります。 :
レンダリングのために子に指定されるサイズで、 (xsize, ysize) のタプルです。子が自身のサイズを算出できるとき、これは通常省略されます。どちらかの要素が None なら子のサイズが使用されます。
これはつぎのうちの一つです
マウスホイールを無視します (デフォルト)。
縦にスクロールします。
水平にスクロールします。
viewport が動くときのみ、viewport を縦にスクロールします。そうでないなら、マウスホイールイベントは残りのインターフェースに渡されます(例えば、changeが指定されていて、 key "viewport_wheeldown" action Return()
がviewportの前に記述されていれば、 viewport が下端に達しているならそのスクリーンに処理を返させるようにできます)。
Change モードと水平スクロールを組み合わせます。
True ならマウスのドラッグで viewport をスクロール出来ます。
マウスが viewport の端に到達するとスクロールします。 None を設定するか、2要素か3要素のタプルを設定します :
タプルの最初の要素は viewport の端からのピクセル数での距離であり、その距離からエッジスクロールが開始されます。
第二要素は一秒ごとに何ピクセルスクロールするかの最大値です。
与えられるなら三番目の要素はスクロールのスピードをマウスポインターと端との距離に基づいて調整する関数です。関数は -0.0 から 1.0 までの範囲の数字を引数に受け取り、同じ範囲の数字を返すべきです。デフォルトの関数では入力をそのまま返し、端との近さに比例してスクロールを加速させます。関数が入力された符号に基づき 1.0 か -1.0 を返すと一定の速度のスクロールになります。
ui.adjustment()
が viewport の x 軸に使用されます。省略されると新しい adjustment が作成されます。
ui.adjustment()
が viewport の y 軸に使用されます。省略されると新しい adjustment が作成されます。
viewport の初期の水平位置のオフセットです。これはピクセル数の整数か、可能なオフセットの割合の小数です。
viewport の初期の垂直位置のオフセットです。これはピクセル数の整数か、可能なオフセットの割合の小数です。
None でなければスクロールバーがこの viewport に追加されます。これは side レイアウトを作成し、その sideの中心に viewport を作成した viewport を置いて動作します。 scrollbars が "horizontal" なら水平なスクロールバーが viewport の下に追加され、 scrollbars が "vertical" なら垂直なスクロールバーが viewport の右に追加されます。 scrollbars が "both" なら水平垂直両方のスクロールバーが作成されます。
scrollbars が None でなければ、 viewport は次の接頭辞のプロパティーを受け取ります :
viewport_
で始まるプロパティーは viewport に渡されます。
side_
で始まるプロパティーは side に渡されます。
scrollbar_
で始まるプロパティーはあれば水平スクロールバーに渡されます。
vscrollbar_
で始まるプロパティーはあれば 垂直スクロールバーに渡されます。
接頭辞のないプロパティーも受け取られます。 位置スタイルプロパティー は side に渡され、他は viewport に渡されます。
True なら viewport は上下左右の矢印キーでスクロール可能です。これはフォーカスを変更する通常のこれらのキーの機能に優先します。しかし、viewportが端に到達すると矢印キーはフォーカスを変更します。
True なら viewport はページアップ/ダウンキーで上下にスクロール可能です。これはロールバック/フォワードを起こす通常のこれらのキーの機能を無効にします。
さらにこれは以下のスタイルプロパティーを受け取ります。 :
これは一つの子を受け取ります。 0 か 2 以上の子が指定されると、それらを含めるために fixed が作成されます。
viewport のスクロールバーを作成するためにはそれに id を与えて、その id を引数に XScrollValue()
と YScrollValue()
を使用するのが最適です。
screen viewport_example():
side "c b r":
area (100, 100, 600, 400)
viewport id "vp":
draggable True
add "washington.jpg"
bar value XScrollValue("vp")
vbar value YScrollValue("vp")
vpgrid (viewport grid) は viewport と grid を一つの displayable に結合します。 vpgrid は grid のように複数の子を受け取り、それらの子のレンダリングは最適化され、 viewport 内に表示されている子のみがレンダリングされます。
vpgrid はすべてのセルが同じサイズで、最初の子のサイズであると想定します。 vpgrid が誤ってレンダリングされたら、すべての子が同じサイズであるか確認してください。
vpgrid には col か rows の少なくとも一つのプロパティーが指定されなければいけません。一つが省略されるか None であれば、サイズと spacing, 子の数から自動的に決定されます。
Vgrids は以下のプロパティーを受け取ります。 :
グリッドの行数
グリッドの列数
True なら列の前に行が埋められます。これのデフォルトは cols と rows プロパティーに依存します。 cols が与えられたなら、行が列の前に埋められ、そうでなければ列が行の前に埋められます。
さらに vpgrid は viewport が可能なすべてのプロパティーと以下のスタイルプロパティーを受け取ります。 :
scrollbar プロパティーが指定されると、接頭辞つきのプロパティーは viewport 同様に vpgrid に渡されます (viewport_
は vpgrid 自体に渡されます)。
screen vpgrid_test():
vpgrid:
cols 2
spacing 5
draggable True
mousewheel True
scrollbars "vertical"
# Since we have scrollbars, this positions the side, rather than
# the vpgrid.
xalign 0.5
for i in range(1, 101):
textbutton "Button [i]":
xysize (200, 50)
action Return(i)
widow はゲーム内の台詞を表示するための背景を含むウィンドウのことです。これは以下のプロパティーを受け取ります。 :
これは一つの子を受け取ります。 0 か 2 以上の子が指定されると、それらを含めるために fixed が作成されます。
screen say(who, what):
window id "window"
vbox:
spacing 10
text who id "who"
text what id "what"
スクリーン、特に視覚的なものを作成する便利な方法は imagemap を使用することです。 imagemap を作成するときに imagemap ステートメントは 6 つの画像を指定するために使用されます。hotspot と hotbar の画像はその画像の長方形の領域を切り取って、アクションと value をそれらの領域に適用するために使用されます。
ここに imagemap を使用した preferences スクリーンの例があります。
screen preferences():
tag menu
use navigation
imagemap:
auto "gui_set/gui_prefs_%s.png"
hotspot (740, 232, 75, 73) action Preference("display", "fullscreen") alt _("Display Fullscreen")
hotspot (832, 232, 75, 73) action Preference("display", "window") alt _("Display Window")
hotspot (1074, 232, 75, 73) action Preference("transitions", "all") alt _("Transitions All")
hotspot (1166, 232, 75, 73) action Preference("transitions", "none") alt _("Transitions None")
hotbar (736, 415, 161, 20) value Preference("music volume") alt _("Music Volume")
hotbar (1070, 415, 161, 20) value Preference("sound volume") alt _("Sound Volume")
hotbar (667, 535, 161, 20) value Preference("voice volume") alt _("Voice Volume")
hotbar (1001, 535, 161, 20) value Preference("text speed") alt _("Text Speed")
imagemap ステートメントは画像を指定するために使用されます。これはパラメーターは受け取らず、以下のプロパティーを受け取ります。 :
この imagemap に使用する画像を自動的に定義するために使用されます。これは %s を含む文字列であるべきです。これが与えられて、画像のプロパティーの一部が省略されていると %s をそのプロパティーの名前で置き換えて、その値をそのプロパティーのデフォルトとして使用します。
例えば auto が "imagemap_%s.png" で idle が省略されると、 idle はデフォルトで "imagemap_idle.png" になります。同様に auto が "imagemap %s" なら imagemap idle
画像が使用されます。
auto の動作は config.imagemap_auto_function
を変更してカスタマイズできます。
hotspot や hotbar の一部ではない画像を配置するために使用される画像
hotspot や hotbar が無効の時に使用される画像
hotspot が選択されておらず、フォーカスを持たないとき、また hotbar がフォーカスを持たずバーが空のときに使用される画像
hotspot が選択されておらず、フォーカスを持つとき、また hotbar がフォーカスを持ちバーが空のときに使用される画像
hotspot が選択され、フォーカスを持たないとき、また hotbar がフォーカスを持たずバーが満タンのときに使用される画像
hotspot が選択され、フォーカスを持つとき、また hotbar がフォーカスを持ちバーが満タンのときに使用される画像
これはデフォルトでは True で、 hotspot はマウスが画像の不透明な領域上にあるときだけフォーカスを持ちます。 False なら hotspot はマウスが長方形の領域上にあるとフォーカスを持ちます。
これはデフォルトでは True で、 hotspot のデータをキャッシュして追加のディスク消費の代わりにパフォーマンスを改善します。
以下のプロパティーを受け取ります。 :
imagemap は fixed を作成し、 ( hotspot と hotbar だけでなく ) すべての子をそこに追加します。
hotspot は画像で構成されるボタンです。ボタンを作成する imagemap の領域を与えるタプル (x, y, width, height) をパラメーターとして一つ受け取ります。これは以下のプロパティー受け取ります。 :
ボタンがアクティベートされると実行されるアクションです。これはボタンが有効か、選択されているかどうかの制御もします。
ボタンが代替方法でアクティベートされると実行される代替アクションです。代替方法はプレイヤーがマウスベースのプラットフォームでホットスポットを右クリックするか、タッチベースのプラットフォームで長押しすると発生します。
ボタンがフォーカスを所得するときのアクションです。
ボタンがフォーカスを失うときのアクションです。
ボタンが選択されているかどうかを決定する式です。この式はインテラクション毎に少なくとも一回評価されます。 指定されなければ、アクションが選択状態決定に使用されます。
ボタンが有効かどうかを決定する式です。この式はインテラクション毎に少なくとも一回評価されます。 指定されなければ、アクションが有効無効決定に使用されます。
押すとこのボタンのアクションを実行するキーボードのキーを表わす キーシンボル の文字列です。
押すとこのボタンの代替アクションを実行するキーボードのキーを表わす keysym の文字列です。
以下も受け取ります。 :
hotspot は fixed を作成し、そこに子を追加出来るようにします。 fixed は hotspot と同じ大きさの領域を持つので、子は hotspot に対する相対距離で配置されます。
hotspot に alt
スタイルプロパティーを指定すると Ren'Py のセルフボイシング機能が動くようになります。
hotbar は画像で構成されるバーです。バーを作成する imagemap の領域を与えるタプル (x, y, width, height) をパラメーターとして一つ受け取ります。これは以下のプロパティー受け取ります。 :
バーの現在の値。これは bar value オブジェクトか数字です。
バーの最大値です。これは value が数字なら必要です。
このバーを調整する ui.adjustment()
オブジェクトです。
value か adjustment のどちらかは与えられなければなりません。さらにこの機能は以下を受け取ります。 :
これは子は受け取りません。
hotbar に alt
スタイルプロパティーを指定すると、Ren'Py のセルフボイシング機能が動くようになります。
add ステートメントは少し特殊で、すでに存在する Displayable をスクリーンに追加します。結果としてユーザーインターフェースステートメントへの共通のプロパティーを受け取りません。
画像やその他の displayable をスクリーンに追加します。これは任意で transform プロパティー を受け取ります。少なくとも一つ transform プロパティーが与えられると、 Transform
が作成され、その画像をラップして、その transform に渡します。
displayable が None ならスクリーンには何も追加されません。
これは子を受け取りません。
screen add_test():
add "logo.png" xalign 1.0 yalign 0.0
よく使用されるステートメントに加えてスクリーン言語は高度な displayable に対応するステートメントを持ちます。displayable とステートメントの対応は単純です。displayable の位置パラメーターはそのステートメントの位置パラメーターになり、キーワード引数およびスタイルプロパティーはスクリーン言語のプロパティーになります。
高度な displayable のステートメントは次になります。 :
drag
Drag
クラスを作成します。 drag には任意の子が与えられるか、または child
スタイルプロパティーを使用して子や、それがフォーカスを所得した場合のバージョンが提供されます。drag は focus_mask
スタイルプロパティーも受け取れます。
draggroup
DragGroup
クラスを作成します。DragGroup はその子として 0 以上の drag を持ちます。
has ステートメントは子を一つだけ受け取るステートメントのために使用するコンテナを、 fixed の代わりに指定できるようにします。 has ステートメントはおそらく一つの子のみを受け取るステートメントの内部で使用されるでしょう。キーワード引数 has
の (同じ行の) 後にはもう一つのステートメントが続き、それは一つ以上の子を受け取るコンテナの displayable を作成するステートメントでなければなりません。
has ステートメントはそれを含むブロックの解釈を変更しします。そのブロックで作成された子の displayable は親の displayable ではなくそのコンテナに追加されます。親の displayable に対するキーワード引数は has ステートメントの後は許可されません。複数の has ステートメントが同じブロックで使用可能です。
has ステートメントは以下のステートメントの子として提供されます。
has ステートメントには以下のステートメントが入れ物として与えられます。
screen volume_controls():
frame:
has vbox
bar value Preference("sound volume")
bar value Preference("music volume")
bar value Preference("voice volume")
スクリーン言語には、条件実行や反復、他のスクリーンを含んだり、イベントによるアクションや任意の python コードを実行したりするための制御用ステートメントがあります。
default
ステートメントは変数がスクリーンの引数として渡されなかったり、 use ステートメントを使用してそのスクリーンを呼び出しているスクリーンから継承されなければ変数のデフォルトの値を設定します。
screen scheduler():
default club = None
vbox:
text "What would you like to do?"
textbutton "Art Club" action SetScreenVariable("club", "art")
textbutton "Writing Club" action SetScreenVariable("club", "writing")
if club:
textbutton "Select" action Return(club)
for
ステートメントは python の for
ステートメントに相当しますが、else
節をサポートしていません。変数同様に(任意にネストされた)タプルへの代入もサポートしています。
$ numerals = [ 'I', 'II', 'III', 'IV', 'V' ]
screen five_buttons():
vbox:
for i, numeral in enumerate(numerals):
textbutton numeral action Return(i + 1)
for ステートメントは index 節を受け取ります。
screen five_buttons():
vbox:
for i, numeral index numeral in enumerate(numerals):
textbutton numeral action Return(i + 1)
index
節があれば、そのリストの各行に対してユニークである、ハッシュがあり比較出来る値を返す式で構成されるべきです。Ren'Py はこの値を使用して transform とその他の状態を確認します。Ren'Py はこの値を使用して transform やその他の状態が適切な反復をするようにします。繰り返し処理するリストに要素が追加または除去されるときの奇妙な振る舞いを見たなら、 index 節が使いたくなるでしょう。
スクリーン言語の if
ステートメントは Python/Ren'Py の if
ステートメントと同様です。 if
, elif
, else
節をサポートしています。
screen skipping_indicator():
if config.skipping:
text "Skipping."
else:
text "Not Skipping."
on
ステートメントはイベントによってスクリーンがアクションを実行できるようにします。パラメーターを一つ受け取り、それはイベントの名前です。これは以下のうち一つであるべきです。 :
"show"
"hide"
"replace"
"replaced"
イベント時に実行するアクションを指定するプロパティーを受け取ります。
screen preferences():
frame:
has hbox
text "Display"
textbutton "Fullscreen" action Preferences("display", "fullscreen")
textbutton "Window" action Preferences("display", "window")
on "show" action Show("navigation")
on "hide" action Hide("navigation")
use
ステートメントはスクリーンに他のスクリーンを含めるようにします。 use ステートメントは使用するスクリーンの名前を受け取ります。これには任意で括弧で囲まれた引数リストが続きます。
使用されるスクリーンに括弧がなければ、現在のスクリーンのスコープに読み込み書き込みでき、 use
ステートメントで渡されたキーワード引数で更新されます。そうでなければそのスコープは引数をそれらのパラメーターに割り当てた結果で初期化されます。
screen file_slot(slot):
button:
action FileAction(slot)
has hbox
add FileScreenshot(slot)
vbox:
text FileTime(slot, empty="Empty Slot.")
text FileSaveName(slot)
screen save():
grid 2 5:
for i in range(1, 11):
use file_slot(i)
use ステートメントは必要ならプロパティー id
をパラメーターリストの後に 1 つ受け取れます。このスクリーンは同じタグを持つ 2 つのスクリーンが同じスクリーンを使用するときのみ有用です。この場合、あるスクリーンが他方のスクリーンを置き換えると、使用されたスクリーンの状態は以前のスクリーンから新しいスクリーンへ譲渡されます。
transform t1():
xpos 150
linear 1.0 xpos 0
screen common():
text "Test" at t1
screen s1():
tag s
use common id "common"
text "s1" ypos 100
screen s2():
tag s
use common id "common"
text "s2" ypos 100
label start:
show screen s1
pause
show screen s2
pause
return
スクリーン名の代わりに、キーワード引数 expression
も指定でき、使用するスクリーン名を指定する式が続きます。スクリーンに引数が必要なら、 pass
キーワードを使用して式と分離しなければなりません。
screen ed(num):
text "Ed"
text "Captain"
screen kelly(num):
text "Kelly"
text "First Officer"
screen bortus(num):
text "Bortus"
text "Second Officer"
screen crew():
hbox:
for i, member in enumerate(party):
vbox:
use expression member.screen pass (i + 1)
use ステートメントはスクリーン言語ステートメントのブロックも受け取れます。ブロック指定時に使用されるスクリーンには transclude
ステートメントがあるでしょう。 transclude
ステートメントは use ステートメントのブロック内にあるステートメントで置き換えられます。
これによりスクリーンを使用して再利用可能なレイアウトが定義出来るようになります。例えば次のスクリーン
screen movable_frame(pos):
drag:
pos pos
frame:
background Frame("movable_frame.png", 10, 10)
top_padding 20
transclude
これは他の要素をラップする再利用可能な要素であることを意図しています。次のように使用します。
screen test:
use movable_frame((0, 0)):
text "You can drag me."
use movable_frame((0, 100)):
vbox:
text "You can drag me too."
textbutton "Got it!" action Return(True)
use と transclude は ユーザー定義スクリーン言語ステートメント に基づいて形式を組み立てます。
スクリーン言語には python コードを実行する一行または複数行の python ステートメントも含まれます。このコードはそのスクリーンのスコープで実行します。
python コードはスクリーンの外への副作用を起こしてはいけません。 Ren'Py はスクリーンが最初に表示される前に画像予測処理の一部として必要なら何度もスクリーンのコードを実行します。結果としてスクリーンのコードが副作用を持つなら、それが何回実行されるかはわかりません。
screen python_screen:
python:
test_name = "Test %d" % test_number
text test_name
$ test_label = "test_%d" % test_label
textbutton "Run Test" action Jump(test_label)
showif
ステートメントは条件を受け取ります。条件が Trueならその子を表示し、 False ならその子を非表示にします。 showif の子が transform を持つなら、子に ATL イベントを送り、表示、非表示処理を管理して Ren'Py がアニメーションで表示、非表示出来るようにします。
showif
ステートメントは displayable 内のその子を表示非表示処理を管理する displayable にラップします。
複数の showif ステートメントは if ステートメント同様 1 つの showif
/elif
/else
構造に纏められます。if ステートメントとは違い、条件が False であっても python コードを含むそのブロックを showif はすべて実行します。 これは showif ステートメントが非表示される子を作成する必要があるためです。
showif は 3 つのイベントをその子に送ります。
appear
スクリーンが最初に表示されたときに条件が True なら送られ、即座に子を表示します。
show
条件が False から True に変わると送られます。
hide
条件が True から False に変わると送られます。
これらの目的のため、 elif
節の条件はそれ以前の条件が True なら常に False で、すべての前の条件が False なら else 節だけが True になります。
例
transform cd_transform:
# This is run before appear, show, or hide.
xalign 0.5 yalign 0.5 alpha 0.0
on appear:
alpha 1.0
on show:
zoom .75
linear .25 zoom 1.0 alpha 1.0
on hide:
linear .25 zoom 1.25 alpha 0.0
screen countdown():
default n = 3
vbox:
textbutton "3" action SetScreenVariable("n", 3)
textbutton "2" action SetScreenVariable("n", 2)
textbutton "1" action SetScreenVariable("n", 1)
textbutton "0" action SetScreenVariable("n", 0)
showif n == 3:
text "Three" size 100 at cd_transform
elif n == 2:
text "Two" size 100 at cd_transform
elif n == 1:
text "One" size 100 at cd_transform
else:
text "Liftoff!" size 100 at cd_transform
label start:
call screen countdown
Ren'Py 言語にはスクリーンに作用する三つのスクリーンステートメントがあります。
show screen
ステートメントはスクリーンを表示します。スクリーン名と任意の引数リストを受け取ります。もしあるなら引数はそのスクリーンのスコープを初期化するために使用されます。 show_screen()
と call_screen()
に渡されるいくつかの特別なキーワードもあります。
expression
キーワードが指定されると、それに続く式がスクリーン名として評価されます。expression キーワードでスクリーンに引数を渡すには、式と引数を pass
キーワードで区切ります。
$ screen_name = "my_screen"
show screen expression screen_name
# Or if you need to pass some arguments
show screen expression screen_name pass ("Foo", message="Bar")
show screen ステートメントは任意で nopredict
キーワードを受け取り、スクリーンの予測を禁止します。スクリーンの予測中にスクリーンへの引数は評価されます。スクリーン引数の評価が不測の副作用を起さないように確認してください。
警告
スクリーンの引数の評価が副作用を起すなら、あなたのゲームは予測しない方法で動作するかもしれません。
このように表示されたスクリーンは明示的に非表示にされるまで表示されます。これによりそれらで意図的に上書きが出来ます。
show screen overlay_screen
show screen clock_screen(hour=11, minute=30)
if rare_case:
show rare_screen nopredict
show screen
ステートメントは with 節を受け取り、それは show
ステートメントと同様に解釈されます。
show screen clock_screen with dissolve
hide screen
ステートメントは現在表示されているスクリーンを非表示にします。そのスクリーンが表示されていなければ何もしません。 with 節は show ステートメントの with
節と同様に解釈されます。
show screen
ステートメントと同様に、 hide screen
も expression
キーワードを受け取り、任意の式をスクリーン名として使用できます。
hide screen rare_screen
hide screen clock_screen with dissolve
hide screen overlay_screen
$ screen_name = "some_screen"
hide screen expression screen_name
call screen
ステートメントはスクリーンを表示し、現在のインタラクションが終了するとそれを非表示にします。そのスクリーンが値を返すならその値は _return
に代入されます。
これは imagemap を表示するために使用されます。 imagemap は Return()
アクションを利用して値を変数 _return に代入するか、 Jump()
アクションを使用してラベルにジャンプできます。
call screen ステートメントは任意で nopredict
キーワードを受け取り、スクリーンの予測を禁止します。スクリーンの予測中にスクリーンへの引数は評価されます。スクリーン引数の評価が不測の副作用を起さないように確認してください。
call screen ステートメントで、 with
節はそのスクリーン表示時にトランジションを起こさせます。
スクリーンの呼び出しはインタラクションであり、インタラクションは暗黙に with None
を伴うため、 call screen
の後に with
ステートメントを続けてもすでにそのスクリーンは表示されていないため、トランジションを使用してスクリーンを消しません。暗黙の with None
トランジションを無効にするには、特別なキーワード引数 _with_none=False
を以下の例のようにスクリーンに渡してください。
[ With(dissolve), Return() ]
アクションリストのようなトランジションを発生させる他の方法も動作します。
show screen
ステートメントと同様に、 call screen
も expression
キーワードを受け取り、任意の式をスクリーン名として使用できます。
警告
スクリーンの引数の評価が副作用を起すなら、あなたのゲームは予測しない方法で動作するかもしれません。
call screen my_imagemap
call screen my_screen(side_effect_function()) nopredict
# Shows the screen with dissolve
call screen my_other_screen with dissolve
# The screens instantly hides with None, then the pixellate transition executes
with pixellate
# Shows the screen with dissolve and hides it with pixellate.
call screen my_other_screen(_with_none=False) with dissolve
with pixellate
$ screen_name = "my_screen"
call screen expression screen_name pass (foo="bar")
Ren'Py は Windows, Mac, Linux PC のような伝統的なマウスを持つデバイスと Android ベースのスマートフォンやタブレットのような最新のタッチベースのデバイス両方で動作します。スクリーン variant によりゲームは複数の種類のスクリーンを提供でき、実行中のハードウェアに最適なものを使用できます。
Ren'Py は config.variants
にリストされた順番で variant を探索して使用するスクリーン variant を選択します。存在する最初の variant が使用されます。
環境変数 RENPY_VARIANT があれば空白でその変数を分割し、 None
を追加して config.variants を初期化します。RENPY_VARIANT を 「medium tablet touch」や「small phone touch」のように設定すると PC で android デバイス用のスクリーンをテスト出来ます。
環境変数がなければ variant のリストは以下のリストを順番に探索して現在のプラットフォームに対応するものを選んで自動的に生成されます。
"steam_deck"
Steam Deck またはそれに相当するハードウェアで実行していれば True です。
"steam_big_picture"
Steam Big Picture モードで実行していれば True です。
"large"
比較的小さなテキストを快適に読め、ボタンを簡単にクリックできる十分大きな画面です。これはコンピューターの画面に使用されます。
"medium"
やや小さいテキストは読めるが、ボタンは快適に押せるためにはサイズを大きくしなければならない画面です。これはタブレットで使用されます。
"small"
テキストを読むためにも字を大きくする必要がある画面です。これは携帯やテレビで使用されます ( テレビは物理的には大きいですが、大概遠くて見にくいです )。
"tablet"
画面の対角線が 6 インチタッチかそれ以上のタッチスクリーンベースのデバイスで定義されます ( 通常は「 medium 」が「 tablet 」の代わりに使用されます )。
"phone"
画面の対角線が 6 インチタッチかそれ以下のタッチスクリーンベースのデバイスで定義されます。そのような小さなデバイスではボタンを十分に大きくして簡単に選択できるようにすることが重要です ( 通常は「 small 」が「 phone 」の代わりに使用されます )。
"touch"
タッチスクリーンベースのデバイスで定義されます。
"tv"
TV ベースのデバイスで定義されます。
"firetv"
Amazon Fire TV のコンソール上で定義されます ("tv" と "small" も定義されます )。
"chromeos"
Chromebook 上で Android app として実行時に定義されます。
"android"
すべての Android デバイスで定義されます。
"ios"
iPad ( "tablet"
と "medium"
も定義されます )や iPhone ("phone"
と "small"
も定義されます)のような iOS デバイスで定義されます。
"mobile"
Android や iOS, モバイルウェブブラウザー のようなモバイルプラットフォームを定義します。
"pc"
Windows, Mac OS X, Linux で定義されます。 PCはマウスとキーボードを所持し、ボタンへのフォーカスと正確な移動が出来ると期待されます。
"web"
ウェブブラウザー内部で実行しているときに定義されます。
None
常に定義されます。
スクリーン variant を定義する例です。 :
# A variant hello_world screen, used on small touch-based
# devices.
screen hello_world():
tag example
zorder 1
modal False
variant "small"
text "Hello, World." size 30
Screen Actions, Values, Functions : スクリーンと使用するためのアクションやその他ツールの包括的なリストです。
スクリーン言語の最適化 : できるだけ効率のよいスクリーンを作成する便利な方法があります。
スクリーンと Python : Ren'Py であらかじめ定義されたツールの使用から、Ren'Py の拡張までがあります。