積雲が映像制作したMV『RANGEFINDER』公開中
専門88IO

【Ren’Py】Pythonで始めるノベルゲーム制作3 左クリックの無効化

専門

スプラッシュ・スクリーンや各章の節目等でアニメーションを跳ばせないようにしたい部分が出てきた。

Pauseトランジションの引数にhard=Trueを加えればよいのかと言えばそうでもなかったので、今回は一時的なキーマップの無効化について記載することにした。

スポンサーリンク

キーマップについて

キーマップのカスタマイズ — Ren'Py Documentation

ドキュメントを読めば理解できることだが、config.keymap辞書に設定が格納されている。

スポンサーリンク

キーマップの変更

上記の辞書config.keymapの値を変更すればよい。

config.keymap['hide_windows'].append('K_SPACE')
config.keymap['dismiss'].remove('K_SPACE')

この例ではSpaceキーでウィンドウの表示/非表示を行い、デフォルトのdismissアクションを無効化している。

キーマップの無効化

左クリックやEnterキーによる次テキストへの移動はconfig.keymap['dismiss']に該当する。

特定のキーマップを無効化したい場合は、押した時のアクションを空にすればよい。

key 'dismiss' action NullAction()

キー単位の動作の無効化も同様に、key 'mouseup_1' action NullAction()等とすればよい。

しかし、この操作をラベル内に記述すると後の操作でアクションを元に戻す必要が出てくる。

そこでスクリーンで導入することにした。(記述はinitブロックで行う)

screen disable_dismiss:
    key 'dismiss' action NullAction()

無効化したい場面でshow screen disable_dismissを実行し、無効化を破棄するならばhide screen disable_dismissとすればよい。

しかし、他のアクションの無効化には対応しておらず汎用性に欠けるので少しカスタマイズを行う。

screen disable_actions(*acts):
    for act in acts:
        key act action NullAction()

これでほとんどのアクションに対応はずだ。

複数を無効化したい場合は、disable_actions("dismiss", "game_menu")のように引数で指定すればよい。

使用例

前回扱ったスプラッシュ・スクリーンの表示時にdismissアクションを無効化する。

【Ren’Py】Pythonで始めるノベルゲーム制作2 変換とスプラッシュスクリーン
前回Ren'Py Launcherの導入、またドキュメントを読んで所見を書いた。 今回は実際にスクリプト作業を頼まれたので、実装に伴って新しく知った機能について一部まとめることにする。 サイドイメージの表示 あるキャラクターが話す時、メッセ...
image bg white = "#fff"
image splash = "splash.png"

label splashscreen:
    show screen disable_actions("dismiss")
    scene black
    $ renpy.pause(1.0)

    scene bg white with dissolve
    show splash at truecenter with dissolve
    $ renpy.pause(2.0)
    scene black with dissolve
    $ renpy.pause(1.0)

    hide screen disable_actions
    return

注意点1

dismissアクションはトランジションwith Pause(1.0)pause(1.0)といった一時停止処理時のクリックには該当しない。

そのため、これらを使用しても画面は強制遷移してしまう。また、pauseは指定秒後に下の行を実行するというもので、2行でセットとなる。一時停止時に強制遷移させると下のテキストは表示されない。

このような理由から、$ renpy.pause(1.0)による代用を推奨しておく。

注意点2

キーマップの変更と同様、一時的にconfig.keymapから値を削除すればいいじゃないか、と考える人もいるだろう。

筆者はこれで失敗した。

initブロック外で、

config.keymap['dismiss'].remove('mouseup_1')

等の操作を行いキーマップから削除すると、該当アクションは無効化されるが、

config.keymap['dismiss'].apeend('mouseup_1')

で再び追加しても有効化はされない。

明示的に再読込を行えば解決する可能性もあるが、config.keymapの変更はinitブロック内で完結するべきである。

あとがき

今週月曜日にノベルベームのベータ版(体験版の位置づけ)第1節が公開された。

指定された動作のみを実装したのでとても簡素であるが、調べた演出方法は後々追加していこうと思う。

ページが見つかりません。 - 一応理系男子
とある高校出身大学生による雑記ブログ

コメント

タイトルとURLをコピーしました