【Ren’Py】キャラクターによってネームボックスの背景に設定したSolidの色を変更する

:::note info
2023年7月1日時点Ren'Py ver.7.6.0の初心者の覚書。
変なところやもっと効率的な部分があったら教えてください。
:::
この記事で確認できるネームボックスの実装内容は以下です。
1. backgroundに設定したSolidの色を変更する

# キャラクターによってネームボックスの表示を変更する
選択肢の編集を行う時はscreen.rpyのscreen say(who, what):(99行目あたり)です。
```ruby:screen.rpy
screen say(who, what):
    style_prefix "say"

    window:
        id "window"

        if who is not None:

            window:
                id "namebox"
                style "namebox"
                text who id "who"

        text what id "what"
```
参考ドキュメントは[特別な名前のスクリーン](https://ja.renpy.org/doc/html/screen_special.html#say)と[台詞とナレーション](https://ja.renpy.org/doc/html/dialogue.html#defining-character-objects)

## backgroundに設定したSolidの色を変更する
そもそもネームボックスの背景はこれで書き換えができます
```ruby:script.rpy
define e = Character('Eileen', color="#c8ffc8", namebox_background="設定したい画像")
```
ただ私の場合はネームボックスのbackgroudをSolid()で設定しており、以下のように実装してもbackgroundの設定に失敗しました。
```ruby:script.rpy
define e = Character('Eileen', color="#c8ffc8",namebox_background=Solid("#ecf460",  xalign=gui.name_xalign))
```
ネームボックスの背景が透明になりました。
オブジェクトの引き渡しはできないのかもしれない。

そういう訳でCharacterではなくsay()を以下のように修正しました。

```ruby:screen.rpy
screen say(who, what):
    style_prefix "say"

    window:
        id "window"

        if who is not None:

            window:
                id "namebox"
                style "namebox"
                text who id "who"
                if who == persistent.mc_name : #whoが喋るキャラクターの名前と一致しているか確認する
                    background Solid("#ecf460",  xalign=gui.name_xalign)
                else :
                    background Solid("#60f48c",  xalign=gui.name_xalign)


        text what id "what"
```
主にやっていることは
`if who == persistent.mc_name :`で誰が喋っているのか調べて、
` background Solid("#ecf460",  xalign=gui.name_xalign)`一致している場合はbackgroundで直接値を設定しています。
まぁこれたぶんキャラクターに合わせてstyleを変更する形の方がオシャレな実装になると思うのですが、background以外変える予定がなかったのでこの実装方法にしました。

![screenshot0001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3487997/922be136-f9a5-d14e-97ea-2b56f90524d6.png)![screenshot0002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3487997/3550d3f3-49c2-9737-9cfc-8567e44135ea.png)
こんな感じになります。

# 全部実装したらこんな感じ
```ruby:screen.rpy
screen say(who, what):
    style_prefix "say"

    window:
        id "window"

        if who is not None:

            window:
                id "namebox"
                style "namebox"
                text who id "who"
                if who == persistent.mc_name : #主人公名
                    background Solid("#ecf460",  xalign=gui.name_xalign)
                elif who == __(detective_name) : #サブキャラクター
                    background Solid("#937cf8",  xalign=gui.name_xalign)
                elif who == __(doctor_name) :  #サブキャラクター
                    background Solid("#f48a60",  xalign=gui.name_xalign)
                elif who == __(lady_name)  : #サブキャラクター
                    background Solid("#f46071",  xalign=gui.name_xalign)
                else : #それ以外
                    background Solid("#60f48c",  xalign=gui.name_xalign)

        text what id "what"
```
比較する値が常に変数になっていますが、人によってはべた書きで比較してもいいと思います。
私の場合は途中で人の名前を思いつきで変えるので、その際に抜け漏れが発生防止で変数管理をしています。