スクリーンと Python link

スクリーン言語同様に、 Ren'Py は python でのスクリーンの定義をサポートします。 python でのスクリーンはスクリーン関数を renpy.define_screen() に与えることで作成され、どんなスクリーンにも使用できます。

スクリーン関数は期待するスコープ変数に対する引数を受け取り、それ以外のキーワード引数は無視するべきです。( それ故その引数の末尾には **kwargs を持つべきです。 ) スクリーンに displayable を追加するためには UI 関数を呼び出します。スクリーン関数はインタラクションが開始するか再開すると呼び出されます。

この再開がユーザーにとってシームレスであることを保証するために、 UI 関数へのすべての呼び出しが id 引数をサポートすることが重要です。スクリーンは再生成されるため、 Ren'Py は同じ id を持つ以前の displayable の内容で各 displayable を更新します。 id はスクリーン言語によって自動的に生成されますが、直接 ui 関数を使用するときは手動で指定する必要があります。

注意: UI 関数は非推奨です。

python スクリーンの例を示します

init python:
    def say_screen(who, what, **kwargs):
        ui.window(id="window")
        ui.vbox(id="say_vbox")

        ui.text(who, id="who")
        ui.text(what, id="what")

        ui.close()

    renpy.define_screen("say", say_screen)

スクリーン関数 link

以下の関数はスクリーンの定義、表示、非表示をサポートします。

UI 関数 link

注釈

The implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.

UI 関数はスクリーン言語と等価な python です。各スクリーン言語のステートメントに対して、同じ名前の UI 関数があります。例えば ui.text は text ステートメントに対応し、 ui.add は add ステートメントに対応します。

スクリーン言語のパラメーターや引数と python の引数には簡単な対応関係があります。スクリーン言語のパラメーターは位置引数に、プロパティーはキーワード引数になります。例えば、スクリーン言語のステートメントでは

text "Hello, World" size 40 xalign 0.5

こうなります。

ui.text("Hello, World", size=40, xalign=0.5)

( 実際には id 引数が追加されるべきです。 )

UI 関数にはそれらが取る子の数に対応した三つのグループがあります。

以下の UI 関数は子を受け取りません。

  • ui.add
  • ui.bar
  • ui.imagebutton
  • ui.input
  • ui.key
  • ui.label
  • ui.null
  • ui.text
  • ui.textbutton
  • ui.timer
  • ui.vbar
  • ui.hotspot
  • ui.hotbar
  • ui.spritemanager

以下の UI 関数は一つの子を取ります。これらはその子を与えられる必要があり、子がないと、 ui.null() を使用します。

  • ui.button
  • ui.frame
  • ui.transform
  • ui.window
  • ui.drag

以下の UI 関数は複数の子を受け取ります。これらは ui.close() が呼び出されるまでは子を受け付けます。

  • ui.fixed
  • ui.grid
  • ui.hbox
  • ui.side
  • ui.vbox
  • ui.imagemap
  • ui.draggroup

スクリーン言語には存在しない考え方に対応するため、僅かにスクリーン言語のステートメントに対応しない UI 関数もあります。

アクション link

スクリーン言語で作成された displayable の多くは引数としてアクションを取ります。アクションは以下の三つのうちいずれかです。 :

  • 引数を取らない呼び出し可能な ( 関数や bound method のような ) python オブジェクト

  • Action クラスを継承するクラスのオブジェクト

  • 他のアクションのリスト

Action クラスを継承する利点はボタンが有効か、選択されているかを設定するメソッドを上書き可能なことです。

class Action link

新しいアクションを定義するためにはこのクラスを継承してください。アクションの動作を変更するためにはこのクラスのメソッドを上書きしてください。

__call__(self) link

これはアクションが実行されると呼び出されるメソッドです。多くの場合 None でない値を返すと、現在のインタラクションが終了します。

このメソッドはデフォルトでは NotImplemented の例外を出す ( Ren'Py にエラーを報告させる ) ため、上書きする必要があります。

get_sensitive(self) link

これはこのアクションに関連づけられたボタンが有効かどうかを決定するために呼び出されます。ボタンが有効なら True を返すべきです。

これが False を返しても __call__ は実行されることに注意してください。

デフォルトでは True を返します。

get_selected(self) link

これはボタンが選択された状態でレンダリングされるべきなら True を返し、そうでないなら False を返すべきです。

デフォルトでは False を返します。

periodic(self, st) link

このメソッドは各インタラクションが開始されると一旦呼び出され、その後も継続的に呼び出されます。数字を返すとその秒数が経過すると、そうでないならすぐに呼び出されます。

これの主な使用法は get_selected や get_sensitive の値が変更されたら renpy.restart_interaction() を呼び出すことです。

引数を一つ取ります。

st

このアクションに関連づけられたスクリーンか displayable が最初に表示されてからの秒数です。

unhovered(self):

アクションがボタン ( または同様なオブジェクト ) への hovered パラメーターとして使用されると、このメソッドはそのオブジェクトがフォーカスを失うと呼び出されます。

pythonからアクションを実行するにはrenpy.run を使用してください。

BarValue link

bar, vbar または hotbar 作成時に、 BarValue オブジェクトは value 引数として提供されます。 BarValue オブジェクトのメソッドは adjustment やスタイルを得るために呼び出されます。

class BarValue link

新しい BarValue を定義するためには、このクラスを継承してそのメソッドを上書きしてください。

get_adjustment(self) link

このメソッドは bar の adjustment オブジェクトを得るために呼び出されます。 ui.adjustment() で adjustment を作成し、作成されたオブジェクトを返します。

このメソッドはデフォルトでは NotImplemented の例外を出す ( Ren'Py にエラーを報告させる ) ため、上書きする必要があります。

get_style(self) link

これはこの値を使用する bar のスタイルを決定するために使用されます。二つのスタイル名か、 style オブジェクトのタプルを返すべきです。第 一要素は bar に、第二要素は vbar に使用されます。 :

これはデフォルトで ("bar", "vbar") です。

replaces(self, other) link

これはスクリーンが更新される時のように、 BarValue が他の BarValue を置き換えるときに呼び出され、 other からこの BarValue に更新するために使用されます。 get_adjustment より前に、呼び出されます。

otherself と同じ型である必要はありません。

periodic(self, st) link

このメソッドは各インタラクションの開始時に一度呼び出され、秒数の数字を返すとその時間が経過した後に、そうでなければすぐに再び呼び出されます。 これは get_adjustment の後に呼び出されます。

AnimatedValue() のように時間につれて bar の値を更新するために使用されます。このためには、 get_adjustment で adjustment を保持し、 periodic で adjustment の changed メソッドを呼び出すべきです。

InputValue link

input 作成時に、 InputValue オブジェクトは value プロパティーとして提供されます。 InputValue オブジェクトのメソッドは テキストの設定と所得、編集可能かどうか、エンターキーが押されたときの処理を決定するために呼び出されます。

class InputValue link

新しい InputValue を定義するためには、このクラスを継承してそのメソッドを上書きしてください。

default link

Trueなら、input はデフォルトで編集可能な状態です(スクリーン表示時に、キャレットが与えられます)。

get_text(self) link

入力されたテキストを返します。これは実装されなければいけません。

set_text(self, s) link

入力されたテキストが変更されると、新しいテキストで呼び出されます。これは実装されなければいけません。

enter(self) link

ユーザーがエンターを押すと呼び出されます。これが None 以外を返すと、その値がインタラクションから返されます。これは renpy.IgnoreEvent() でイベントを投げて押下を無視します。そうでなければ、他の displayable にエンターキーの押下が伝達されます。

以下のアクションは InputValue で利用可能なメソッドです。 :

Enable() link

テキストを編集可能にするアクションを返します。

Disable() link

テキストを編集不能にするアクションを返します。

Toggle() link

テキストが編集可能かをトグルするアクションを返します。

ユーザー定義スクリーン言語ステートメント link

Ren'Py はユーザー定義スクリーン言語ステートメントをサポートしています。ユーザー定義スクリーン言語ステートメントはスクリーン言語の use ステートメント に対するラッパーです。位置引数はそのまま位置引数になり、プロパティーはキーワード引数になり、ステートメントがブロックを受け取ると、use ステートメント同様に処理します。例えば次のユーザー定義スクリーン言語ステートメントは

titledwindow "Test Window":
    icon "icon.png"

    text "This is a test."

こうなります。

use titledwindow("Test Window", icon="icon.png"):
    text "This is a test."

ユーザー定義スクリーン言語ステートメントは python early ブロックで登録されなければなりません。また、そのユーザー定義ステートメントがあるファイル名はそれを使用するどのファイルよりも先に読み込まれなけれなければなりません。Ren'Py はファイルをユニコード順に読み込むので、ユーザー定義ステートメントを登録するファイル名の先頭に 01 やさらに小さい数を付けるとよいです。

ユーザー定義スクリーン言語ステートメント renpy.register_sl_statement 関数で登録されます。 :

ユーザー定義スクリーン言語ステートメントの例として、上記で指定した titlewindow ステートメントの実装を示します。先ず、 01custom.rpy のような初期に読み込まれるファイルの python early ブロックでステートメントは登録されなければなりません。以下のように登録します。

python early:
    renpy.register_sl_statement("titledwindow", positional=1, children=1).add_property("icon").add_property("pos")

次にユーザー定義ステートメントを実装するスクリーンを定義します。このスクリーンはどのファイルでも定義出来ます。そのようなスクリーンの 1 例です。

screen titledwindow(title, icon=None, pos=(0, 0)):
    drag:
        pos pos

        frame:
            background "#00000080"

            has vbox

            hbox:
                if icon is not None:
                    add icon

                text title

            null height 15

            transclude