【Ren’Py】nvlモードでダイアログと入力画面を同時に表示する

:::note info
2024年3月5日時点Ren'Py ver.8.6.0の初心者の覚書。
変なところやもっと効率的な部分があったら教えてください。
:::
この記事で確認できる実装内容は以下です。
1. nvlモードでダイアログと入力画面を同時に表示する
1. nvlモードでダイアログと選択肢を同時に表示する

通常nvlモードでinputスクリーンやchoiceスクリーンを表示するとダイアログ部分が非表示になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3487997/174749a2-3984-a242-4003-54e631ae1c90.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3487997/839e00c9-f92f-eafe-9bdf-ca59acd4c23e.png)


# ダイアログと入力画面を同時に表示する
参考URL:[renpy.input boxed in center of the screen?](https://lemmasoft.renai.us/forums/viewtopic.php?f=8&t=22636&p=285619#p285736)
```完成図.rpy
screen input(prompt):
    modal True #入力を完了しない限りダイアログを進行しない
    zorder 1 #ダイアログより前にスクリーンを表示する
    frame:
        style "input_frame"
        vbox:
            xalign 0.5
            yalign 0.5
            text prompt
            null height 10
            input id "input"
```

inputスクリーンに以下の記述を追加します。
```diff_python
screen input(prompt):
+   modal True #入力を完了しない限りダイアログを進行しない
+   zorder 1 #ダイアログより前にスクリーンを表示する
    frame:
        style "input_frame"
        vbox:
            xalign 0.5
            yalign 0.5
            text prompt
            null height 10
            input id "input"
```
inputスクリーンを呼び出す時

```diff_python
    tete "あなたは誰ですか"
+   renpy.call_screen("input",prompt="回答を入力してください")
+   #renpy.input()ではなくcall_scren()で呼び出す
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3487997/bac7eef4-c3c2-e99b-c3aa-1b7dcecc574d.png)

# ダイアログと選択肢を同時に表示する
```完成図.rpy
screen nvl(dialogue, items=None):
    window:
        style "nvl_window"
        frame:
            style "input_frame"
     #menuで選択肢を呼び出したときに選択肢画面が表示される
     if items:
         frame:
             vbox:
                 id "menu"    
                 for caption, action, chosen in items:   
                     if action:   
                         button:
                             style "nvl_menu_choice_button"
                             action action    
                             text caption style "nvl_menu_choice"
                     else:
                         text caption style "nvl_dialogue"
```
nvlスクリーンに以下の記述を追加します。
```diff_python
screen nvl(dialogue, items=None):
    window:
        style "nvl_window"
        frame:
            style "input_frame"
    #menuで選択肢を呼び出したときに選択肢画面が表示される
+    if items:
+        frame:
+            vbox:
+                id "menu"    
+                for caption, action, chosen in items:   
+                    if action:   
+                        button:
+                            style "nvl_menu_choice_button"
+                            action action    
*                            text caption style "nvl_menu_choice"
+                    else:
+                        text caption style "nvl_dialogue"
        
            
```
nvlモードを開始するときに以下の設定を追加します。
         
```diff_python
init python:
+    menu = nvl_menu         
```
あとはいつも通りmenu形式で書けば呼び出せます。
```diff_python
    menu:
        doc "もう一回遊ぶ？"
        "Yes":
            jump start
        "No":
            pass       
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3487997/ab1dcd71-cdec-4b93-170b-b9538cc0844f.png)