Ren'Py memo

Ren'Pyの個人的なメモ

バックログに立ち絵(レイヤー画像)の顔部分を追加する

引用 add images to history log[works with layeredimages] - Lemma Soft Forums
使用コード GitHub - Moshibit/portraits-for-dialogue-log-in-RenPy-


・MITライセンス
・レイヤー画像形式のみ説明


1.Characterにimageタグを追加する

define narrator = Character("", image=None)
define e = Character("Eileen", image="eileen")

台詞とナレーション — Ren'Py Documentation
顔画像を表示しないCharacterの場合はNoneを指定


2.portaits.rpyをダウンロードしてgameフォルダに入れ、編集する

portraits-for-dialogue-log-in-RenPy-/portrait.rpy at main · Moshibit/portraits-for-dialogue-log-in-RenPy- · GitHub
このリンクからダウンロードしたファイルをgameフォルダ(他のrpyファイルが入っている場所)に入れる

その後portaits.rpyの一番下の方にある130行目をコメントアウトし、131行目行頭の#を消して保存する

#config.history_callbacks.append(image_history_callback)
config.history_callbacks.append(layeredimage_history_callback)


3.screen historyにコードを入れる

screen history():
(省略)
 has fixed:
   yfit True

   add h.image

add h.imageをバックログのスクリーンに追加する
位置を変更したい場合は、add h.image xpos 8 ypos 8 のような感じに書く


4.立ち絵から顔部分を切り抜く

transform backlog_img:
 zoom 0.6
 crop (100, 90, 240, 320)

screen history():
(省略)
 add h.image xpos 8 ypos 1 at backlog_img

このままだと立ち絵全体がバックログにそのまま追加されるので、
transformで縮小・切り抜きをする
cropの数字は左からx, y, width, height
https://ja.renpy.org/doc/html/atl.html#transform-property-crop

立ち絵ごとに切り抜きのtransformを変える場合は、
以下のコードのようにif文を入れるなどする
h.image_tagは1)でCharacterで指定したimageと同じもの

if h.image_tag == "eileen" :
    add h.image xpos 8 ypos 1 at backlog_img
elif h.image_tag == "eileen2":
    add h.image xpos 4 ypos -301 at backlog_img2
elif h.image_tag == "eileen3" :
    add h.image xpos 55 ypos -282 at backlog_img3
elif h.image_tag == "eileen4" :
    add h.image xpos 8 ypos -301 at backlog_img4




余談 顔画像にふちをつける

image color5_line = RoundedFrame(Solid("#F0F0EC00"), radius=6.0, outline_width=1.0, outline_color="#404057E6")

screen history():
(省略)
 add "color5_line" xpos 0 ypos 0 xsize 160 ysize 174
 add h.image

xpos ypos:位置
xsize ysize:ふちの大きさ

Ren'Pyで作った矩形を角丸シェーダーで丸くする - Ren'Py memo
この記事のコードを使用しています べた塗り四角でもよい、上記記事のコードの導入が面倒な場合はSolid("#404057E6")だけでも


余談 エラーを避ける

立ち絵をhide指定している状態でその立ち絵のimageタグが付いているキャラクターがバックログで登場しているとportaits.rpyでエラーが起きる場合があります(レイヤー画像に指定された画像属性を読み取ろうとしてエラーになる)

キャラクターが話しているけれど立ち絵を表示したくない場合は、
別のCharacterを用意してimageをNoneに指定すると良い
例:define e = Character("Eileen", image="eileen")
define e_noface = Character("Eileen", image=None)


余談 実際に動いているプロジェクト例を見る

portraits-for-dialogue-log-in-RenPy-/examples/portrait layeredimages.zip at main · Moshibit/portraits-for-dialogue-log-in-RenPy- · GitHub
・上記のリンクからzipをダウンロードする
・解凍し、renpy.exeの入っているフォルダに入れる
・ランチャーを起動して、プロジェクトを確認する

導入前に一端こちらで確認することをおすすめ

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

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

Itch.io
New & popular tools tagged Ren'Py - itch.io
開発ツールの話題の新作タブリンク。
画像・説明が多くてどんなコードか感覚が掴みやすい。

(24/01/26追記)
Visual Novel Assets, Tutorials, and Tools - Collection by Natasha Luna - itch.io
更新頻度の高いitch.ioの素材ブックマーク。こちらをチェックした方が早いかも。

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

バックログにロールバックのボタンをつける

参照 little-used history chips - Lemma Soft Forums
資料1 Adding a history/backlog jump button - Lemma Soft Forums
資料2 https://ja.renpy.org/doc/html/config.html#var-config.hard_rollback_limit
資料3 https://ja.renpy.org/doc/html/config.html#var-config.rollback_length


define config.hard_rollback_limit = 128
define config.rollback_length = 128

screen history():

 style_prefix "history"
 for h in _history_list:

   window:

(省略)

    textbutton "Jump":
     action Confirm(_('このテキストまでジャンプしますか?'), yes=RollbackToIdentifier(h.rollback_identifier), no=None, confirm_selected=False)

config.rollback_lengthはデフォルトの128より下回ると不安定になるので注意。

名前入力などのスクリーンを挟むなど想定外っぽいことをした場合、挙動がおかしくなる場合があります。

        call name_change(1) from _call_name_change
        call pronoun_change(1) from _pronoun_change
        $ renpy.block_rollback()

こんな感じでロールバックを防いで応急処置はできます。

最新のセーブ/ロードファイルにNEWをつける

参照1:https://www.renpy.cn/forum.php?mod=viewthread&tid=1002&extra=page%3D4
参照2:Little used features screen Load/Save - Lemma Soft Forums

screens_saveload.py

button:

(省略)

  if FileNewest(slot):
   text "NEW":
    color "#F0F0EC" #テキストの色
    size 30 #テキストのサイズ
    xpos -24
    ypos -35
    outlines [ (absolute(3.5), "#A472A9", absolute(0), absolute(0)) ] #テキストのアウトライン
    anchor(0, 0) #rotate(傾き)のための設定
    at transform_save_label_new #transformの名前

image_tranform.rpy

transform transform_save_label_new:
    rotate -5
    # ここから点滅コード
    linear .6 alpha 0.7
    linear .6 alpha 1.0
    repeat
    # 点滅コードおわり

テキストのアウトラインがいらない場合:outlines [ (absolute(3.5), "#A472A9", absolute(0), absolute(0)) ]を削除
点滅がいらない場合:transform transform_save_label_newの点滅コードはじめ~点滅コードおわりを削除
rotate(傾き)も点滅もいらない場合:xanchor 0.0 yanchor 0.0 at transform_save_label_newを削除

Ren’Pyの最新機能をより知るためのブックマーク

すべて英語。

Changelog (Ren'Py 7.x-) — Ren'Py Documentation
ナイトリー版のドキュメント
・これから追加される機能の説明を確認できる
・安定板と間違えないこと

Renpytom | creating the Ren'Py Visual Novel Engine | Patreon
・開発者のPatreon
・月初に更新される
・追加される機能についての詳しい紹介記事がある
 ・Patreon有料会員(最低月1ドル)はすべての紹介記事を先読みできる
 ・なお、90日後に紹介記事は無料公開される
  (ランク→一般公開→タイトルにRen'Py Developer Updateが含まれる記事)
 ・過去の紹介記事もコードをまじえて説明されている場合があり、参考になる

言語によって文章のスタイルを変更する

option

renpy.register_style_preference("lang", "0", style.say_dialogue, "xsize",852)
renpy.register_style_preference("lang", "1", style.say_dialogue, "xsize",840)

screen

textbutton _("日本語") action [Language(None), StylePreference("lang", "0")]
textbutton "English" action [Language("en_us"), StylePreference("lang", "1")]

この例ではsay(本編のダイアログ)の文章の表示域のスタイル設定を変更している。

lang:ここではlangとしているが指定する名前は自由。上のコードと下のコードで利用する名前が合っていればよい。
style.say_dialogue:スタイル設定の名前の前にstyle.~を付けて指定する。
xsize:そのスタイルに合ったプロパティの指定。
840:数値の指定。

ブラウザ版について

参照 Web / HTML5 — Ren'Py Documentation
資料 Creating HTML/Web Builds (Last Tested with 7.5.1.22070801) - Ren'Py All-In-One GUI Template community - itch.io

progressive_download.txtについて
ブラウザ版をビルドするとgameフォルダと同じ階層に自動生成されるファイル
個人的に設定は全部-がおすすめ
この設定だと使用する素材をゲーム開始前の読み込み中に全て読み込んでくれる

・永続変数の保存のタイミング
ブラウザ版はゲームがセーブされた時に保存される
PC版とは勝手が違うため注意が必要

・ブラウザ版のzip
Web版をビルドすると自動生成される
場所は(プロジェクト名)-(バージョン)-distsフォルダ

画像ボタンの透過部分を押せるようにする

参照:スタイルのプロパティー — Ren'Py Documentation

imagebutton action Skip()  focus_mask None

focus_maskはデフォルトがTrueですが、Trueの場合ボタンの透明領域もボタンの当たり判定がなくなります。画像ボタンが押しにくいと感じたらfocus_maskをNoneに指定すると押しやすくなる場合があります。

セーブのmax表示を決める

参照
Ren’Py改造メモ(5) – akakyouryuu
Screen Actions, Values, and Functions — Ren'Py Documentation

for page in range(1, 9):
  textbutton "[page]" action FilePage(page)

textbutton _(">") action FilePageNext(max=8, wrap=True)

for page in range(1,9):この書き方だと1~8までページのボタンが表示されます。

FilePageNext
max:これを上のrangeの最大-1に設定すると>ボタンを押しても画面上で表示されているページまでの移動で止まります。逆に言うとこれを設定しないと>ボタンを押せば無限にセーブページを移動できます。
wrap:maxが設定済みかつ最後のファイルページにいる場合、最初のページに戻ります。ボタンがA Q 1 2 3 の並びだった場合、3のページにいる時>ボタンを押すとAに戻ります。

簡単な罫線の作り方

imageの宣言

image color1a = Solid("#404057E6")

screen内に書く

add "color1a" xsize 1000 ysize 2

xsize:長さ
ysize:縦の太さ

Solidの色指定コードの末尾2文字は透明度を表しています。
16進数 透明度 で検索すれば出てくると思います。

ポイント&クリックの資料

imagemapを使うパーツ画像がいらないポイント&クリックの説明
(ただ当たり判定は矩形になる、古め、2013年ぐらい)
A simple navigation map tutorial - Lemma Soft Forums


imagemapの説明ブログ記事(日本語)
うみのぶどう 【R】イメージマップ(画像選択肢)大勝利


imagebuttonを使ったポイント&クリックのサンプルプロジェクト
(インベントリ機能あり、古め、2013年ぐらい)
Point and Click Sample Project - Lemma Soft Forums


imagebuttonの説明のYoutube動画(英語)
RenPy Tutorial using imagebutton | Point and Click Feature - YouTube


インベントリから調べる箇所にドラッグするシステムの作り方
(英語・内容はだいぶ難しいかも)

気にしなくていいエラーコード


While running game code:
  File "renpy/common/00start.rpy", line 212, in script call
    call _load_reload_game from _call__load_reload_game_1
  File "renpy/common/00keymap.rpy", line 529, in script
    python hide:
  File "renpy/common/00keymap.rpy", line 529, in <module>
    python hide:
  File "renpy/common/00keymap.rpy", line 540, in _execute_python_hide
    renpy.load(renpy.session["_reload_slot"])
Exception: Couldn't find a place to stop rolling back. Perhaps the script changed in an incompatible way?

上記のエラーはたまに直近で変数を変更している時などに出ますが気にしなくていいやつです。リロードもしくはロールバックで強制終了になります。