Ren'Py memo

Ren'Pyの個人的なメモ。

Ren'Pyの最新プラグイン探す用ブックマーク

24/01/12 よくチェックするので一番上に固定。

Ren’Py Cookbook
Ren'Py Cookbook - Lemma Soft Forums
公式フォーラムの再利用可能なコードの置き場所。
色々な場所からまとめてくれている方がいるので最新の情報を得やすいです。

Itch.io
Latest tools tagged Ren'Py - itch.io
Latest free game assets tagged Ren'Py - itch.io
開発ツールとRen'Pyタグがついた素材の新作タブリンク。
画像・説明が多くてどんなコードか感覚が掴みやすい。
(24/01/26追記)
Visual Novel Assets, Tutorials, and Tools - Collection by Natasha Luna - itch.io
更新頻度の高いitch.ioの素材ブックマーク。こちらをチェックした方が早いかも。

Github
renpy · GitHub Topics · GitHub
GithubのRenpyタグを付けている最新レポジトリのリンク。

以前開いたタブを記憶する

最初のテンプレートにあるヘルプ画面はタブ形式になっています。
はじめてのコピペUI改造として向いているいい画面です。

しかし使われている変数が普通の変数のため、
ここに後日談の部屋や回想部屋を入れる場合、
見終わると毎回最初のタブに戻されてしまいます。

今回はその変数をpersistent変数に変更して
以前開いたタブを記憶する仕組みにします。

1.persistent変数を作る

default persistent.help_navi = "sousa"

最初に表示したい画面の文字を設定します。
わかりやすくするためにscreen名に似た文字を設定していますが、
後述の内容に沿っていれば特に問題はありません。

2. screen helpのコードを改造する

screen help():

    use game_menu(_("Help"), scroll="viewport"):

        hbox:
            if persistent.help_navi == "sousa":
                use sousa_help
            elif persistent.help_navi == "readme":
                use readme_help
            elif persistent.help_navi == "log":
                use log_help
            elif persistent.help_navi == "credit":
                use credit_help
            elif persistent.help_navi == "warn":
                use warn_help

    hbox:
        xalign 0.5
        yalign 1.0
        hbox:
            style_prefix "navigation2"
            spacing 5

            textbutton _("はじめに"):
                action SetVariable("persistent.help_navi", "readme")

            textbutton _("操作方法"):
                action SetVariable("persistent.help_navi", "sousa")

            textbutton _("クレジット"):
                action SetVariable("persistent.help_navi", "credit")

            textbutton _("注意免責事項"):
                action SetVariable("persistent.help_navi", "warn")

            textbutton _("更新履歴"):
                action SetVariable("persistent.help_navi", "log")

screen sousa_help():
(省略)

deviceの変数を削除し、SetScreenVariableからSetVariableにしています。

テキストボタン部分のレイアウトは自作ゲーム用に変更しているので、
そのまま使うとおかしくなるかもしれません。適宜変更おねがいします……

Ren’Pyでテキストファイルを出力する

引用
How do you create an output text file? - Lemma Soft Forums

準備

default persistent.txt_file = False

一度だけ起動させるためpersistent変数を作っておくこと。

コード

if persistent.txt_file == False:
    python:
        with open( os.path.join( renpy.config.gamedir, "testfile.txt" ), 'w' ) as f:
            f.write( 'text' )
            persistent.txt_file = True

このコードをテキストファイルを出力したいタイミングに書く。

テキストファイルが出力される時、特に通知はされないため
$ renpy.notify("txtファイルが出力されました")をコードに追加するなど通知を入れてもよい。

勝手にテキストファイルを開きたい場合はこちらを参照。
【Ren’Py】テキストファイルを開く #Ren’Py - Qiita


1.ファイルを出力する場所を選ぶ

3行目のrenpy.config.gamedirのままだと、gameフォルダに出力される。
それ以外の場所で出力する場合は以下のどれかに変更すること。

renpy.config.gamedir:この変数を設定するとgameフォルダに出力される。
gameディレクトリのフルパスを取得する読み込み用の変数。
https://ja.renpy.org/doc/html/config.html#var-config.gamedir

renpy.config.savedir:この変数を設定するとsaveフォルダに出力される。
saveディレクトリの取得する読み込み用の変数。
https://ja.renpy.org/doc/html/config.html#var-config.savedir

renpy.config.renpy_base:この変数を設定するとexeファイルのあるフォルダに出力される。ビルド前のプロジェクトが出力するときはrenpy.exeのある場所に出力されるので注意。

ファイルを出力する場所はゲームのフォルダ内に限る。(ゲームの作りとしてデスクトップなどゲームフォルダ外での干渉することは推奨されない)

2.テキストファイル名を決める

3行目のtestfile.txtを変更する。
.txtは拡張子のため注意。

3.内容を決める

4行目の'text'内を変更する。

パブリックドメイン背景素材の備忘録メモ

本題

検索の時によく使うopenverseのフィルターURLブックマーク。
商用可、CC0、美術館等公的なソースのみ。
room | Openverse

部屋以外を探したい場合はroomを別の単語に変えて検索してください。
検索のフィルターが残ったまま検索できるはず。

余談

❓ openverseとは
オープンソースのCC作品の検索エンジン。出所を選んで検索可能。

自分の個人的なパブドメ探しのルール
・人が映っているのは避ける
著作権保護期間かどうかは80年ぐらいで見積もっておく
・ユーザーが自由に投稿できるサイトは気持ち避ける

あとパブリックドメインではありますが素材のURLとクレジットは掲載しておくと後で自分が見るときに便利。何かあった時もきっと便利。

画面に雪を降らせる

これはタイトル画面に雪を降らせている

コード素材元:GitHub - Thediamondcryst/Ren-Py-Free-to-Use-Falling-Leaves: A free to use project for falling leaves, complete with many different tree leaves types, just copy the images and script file, type the appropriate image names and enjoy!


用意するもの

雪の結晶の画像

・雪の結晶の画像x2
私はICOOON MONOさんから2つアイコンを借り、色を明るめに変えて13x15と10x11くらいに縮小しました(私のゲームの解像度は1080x1920)お好みで大きくしたり小さくしたりしてください。これはimagesフォルダに加えておきます。雪じゃなくても色んなもの降らせたらいいと思います。

続きを読む

スクリプトの変換に失敗しましたエラーが出る

きっかけ:https://x.com/intheriverJP/status/1904386586273559003

よくあることかもと思ったのでこちらでもメモ。

captiontool.rpyをcaption_tool.rpyにリネームした画像
rpyファイルの削除、位置変更、名前を変更した等の関係で出るエラーです。本体のrpyが消えてもrpycの方は読み込めるためエラーが出るみたいな感じです。

ランチャーのアクション→強制再コンパイルで直ります。

ルビ(ふりがな)をオンオフできるようにする

2025/04/21 より簡単でスクリプトが読みやすい関数をYan-Gyanが提案してくれました。ありがとう!
2024/12/04 追記

ルビ(ふりがな)をオンオフできるようにする

引用・参考
https://www.reddit.com/r/RenPy/comments/1gthq3l/enablingdisabling_text_tags/
https://ja.renpy.org/doc/html/text.html#ruby-text
https://ja.renpy.org/doc/html/custom_text_tags.html

ルビのスタイル設定
screens.rpy

style ruby_style is default:
    size 30
    yoffset -50
    color None

style say_dialogue:
    ruby_style style.ruby_style

永続変数の設定
options.rpy

default persistent.ruby_pref = False

設定画面を作る
screens.rpy

        if preferences.language == None:
            vbox:
                style_prefix "radio"
                label _("ふりがなの有無")
                null height 30
                hbox:
                    textbutton _("あり") action SetVariable("persistent.ruby_pref", True), Function(gui.rebuild)
                    null width 10
                    textbutton _("なし") action SetVariable("persistent.ruby_pref", False), Function(gui.rebuild)

ルビの関数を作る
options.rpy
新ver.

        def simple_ruby(tag, argument, contents):
            if persistent.ruby_pref:
                return [
                    (renpy.TEXT_TAG, u"rb"),
                ] + contents + [
                    (renpy.TEXT_TAG, u"/rb"),
                ]+[
                    (renpy.TEXT_TAG, u"rt"),
                    (renpy.TEXT_TEXT, u"{}".format(argument)),
                    (renpy.TEXT_TAG, u"/rt"),
                ]
            else:
                return contents

        config.custom_text_tags["r"] = simple_ruby

旧ver.

        def ruby_tag1(tag, argument, contents):
            if persistent.ruby_pref:
                return [
                        (renpy.TEXT_TAG, u"rt"),
                    ] + contents + [
                        (renpy.TEXT_TAG, u"/rt"),
                    ]
            else:
                return ""

        def ruby_tag2(tag, argument, contents):
            if persistent.ruby_pref:
                return [
                        (renpy.TEXT_TAG, u"rb"),
                    ] + contents + [
                        (renpy.TEXT_TAG, u"/rb"),
                    ]
            else:
                return contents

        config.custom_text_tags["r1"] = ruby_tag1
        config.custom_text_tags["r2"] = ruby_tag2

バックログでスルーされないよう設定
screens.rpy
新ver.

define gui.history_allow_tags = ("r", "rb","rt","alt","noalt","i", "k")

旧ver.

define gui.history_allow_tags = ("r1", "r2", "rb","rt","alt","noalt","i", "k")

テスト
script.rpy
新ver.

”{r=かさ}傘{/r}”

旧ver.

”{r2}傘{/r2}{r1}かさ{/r1}”

入力した文章を自動でふりがなをつけてくれるツール紹介

accessreading.org

\(([ぁ-ん]+)\){r1}\1{/r1}
半角カッコを正規表現でr1タグに囲って置き換える正規表現

[一-龥]{1,}{r2}$&{/r2}
1文字以上の漢字をr2タグで囲う正規表現

ルビをつけると翻訳テキストが煩雑になる

"{――}時{r1}とき{/r1}は{r2}十二月{/r2}{r1}じゅうにがつ{/r1}の{r2}某日{/r2}{r1}ぼうじつ{/r1}。"

正規表現で除去する。

\{r1\}(.*?)\{\/r1\}
正規表現。r1タグで囲んだひらがなを含んでマッチできます。

\{\/?r2\}
正規表現。r2タグマッチかつ、囲んだ漢字は残したままに出来ます。

Ren'Pyのスクリーンショット機能にウォーターマークを入れてみる

※この方法はスクリーンショットの度にウォーターマークがチラつくため、あまり実用的ではありません。内容としてはRen’Py内のSキーを押した時に使用されるスクリーンショット機能に画像を表示する動きを挟むものです。外部ソフトによるスクリーンショットでは実行されません。

1.スクリーンを用意する

screens.rpy

screen logo():
    timer 0.01 action Hide("logo")
    add "logo.png" xpos 10 ypos 10 # 画像の場合はこちら
    text "circle name" xpos 10 ypos 10 #テキストの場合はこちら

ウォーターマークを表示する用のスクリーンを用意する。logoの名前は変更可能。画像を用意する場合はaddの行を使い、textをコメントアウトする。テキストのみにする場合は逆の方法で。どちらも使う場合はどちらも残す。xpos yposなどで位置を調整。表示した後、時間経過で閉じるようにtimerを記述している。

2. Config変数に記述する

options.rpy(どこでもいい)

define config.pre_screenshot_actions =  [Hide("notify", immediately=True),Show("logo")]

引用:Config 変数 — Ren'Py Documentation

スクリーンショットを撮るときに呼び出されるアクションのリストの変数config.pre_screenshot_actionsに、上記で作成したスクリーンの表示を指定する。スクリーンショットに移したくない要素の一時的な非表示のために使用されるが、今回はウォーターマークの表示のために使う(Hide("notify")~はデフォルトで設定されている内容)

余談

    transform alpha_set:
        alpha 0.8

透明度を設定するtransformを作って add や text の一番後ろに at alpha_set(名前変更可)で調整することも可。

Winter Visual Novel Jam 2024のススメ

itch.io

※ この記事は非公式です。

itch.ioで開催されるノベルゲームジャムに参加してみませんか?という記事です。このジャムはオンラインで開催される「冬」がテーマのノベルゲームジャムで、「冬に関係するビジュアルノベル」であればソロでも、前から作りかけていたゲームでも参加が可能です。(流血描写・性的描写が露骨なものは不可です)

ジャムに参加するとゲームを見つけてもらえる確率が上がるので、短編を作ろうかなと思っている人がいらっしゃればおすすめです。

続きを読む

リンクに下線が出ない・uタグが効かない

出典:Unable to underline strings with a capitalized "P" - Lemma Soft Forums

フォントによって下線が出ない・途中で切れてしまう場合があるようです。
手っ取り早い解決法としては別のフォントに変えることをおすすめします。

ブラウザ版読み込みの高速化(バイトコードキャッシュ)

出典

ja.renpy.org

方法

注意:ブラウザはGoogleChromeを使っているため用語が別になるかも

1. Webからビルドしてブラウザで開くを選択
(既にビルドしている場合はブラウザで開くでも可)

2. ブラウザにゲームが表示されたらF12を押し、コンソールを開く

3. Consoleを押し、一番下の > に downloadBytecode() を貼り付けもしくは手打ち
(貼り付けが出来ず黄色い警告が出る場合がある、警告に順じてallow pastingと打ってエンターすれば貼り付けできるようになる)

4. bytecode-311.rpybがダウンロードされる

5. 元のプロジェクトのgameフォルダを開き、cacheフォルダにbytecode-311.rpybを移動

6. Webでもう一度ビルドする

Ren'Pyのクリップボードボイシング機能はいつからある?

クリップボードボイシングとは:ここではShift+Cを押すと画面内のテキストをクリップボードにコピーしてくれるRen’Pyの機能を指す。マウスでホバーした物も(それがテキストであれば)テキストの内容をコピーしてくれる。アクセシビリティのために作られた機能だが、最近は翻訳に大変便利。

Ren’Py6.99から実装。
Changelog (Ren'Py 6.11 - 6.99) — Ren'Py Documentation

6.99は2015年3 月25日にリリースされたため、(長期開発のゲームは別として)
2016年以降のRen’Py製ゲームなら標準実装されているはず。
https://www.renpy.org/release/6.99

あまりGUIを変更していないゲームであれば、AboutからMade with Ren'pyの後の数字を見ればどのバージョンか確認可能。