Ren'Pyの日本語記事が少ないからまとめてみた(中級者編)

# はじめに
これは、以前投稿した、[Ren'pyの日本語記事が少ないからまとめてみた(初心者編)](https://qiita.com/taxi13245/items/93d14b70c67bd3669694)の続編です。できれば、初心者編から見ていってくださると、よりRen'pyの書き方が理解できると思います。

また、Qiita記事を書くのはまだまだ慣れていない部分も多く、わかりにくいなと思うようであれば、[Ren'pyドキュメント](https://ja.renpy.org/doc/html)が、Ren'py公式のサイトということもあり、とても参考になります。また情報量も公式の方が圧倒的に多いので、ぜひそれと合わせてご覧ください。

# 1. ラベル

```python
label game:
```

このように記述すると、ラベルをつけることができます。
gameのところは、自分の好きな文字を入れても構いません。
「ラベル」とは、ゲームで言うところの転移魔法陣みたいなもので、

```python
jump game
```

このように書くと、ラベルをつけた所から処理をすることができます。(ここは、gameのところは自分がラベルをつけたときに書いた文字にしてください。)

ちょっとわかりにくいので、例を上げてみましょう。
例えば、こんな記述をしたとします。

```python
label a
"おはよう！"
label b
"こんにちは！"
label c
"こんばんは！"
```

`実行結果 ≫ おはよう！、こんにちは！、こんばんは！の順に表示される。`

この場合、labelは無視され、普通に上から順に実行されます。
では、こんな記述だとどうなるでしょう。

```python
label a
"おはよう！"
jump c
label b
"こんにちは！"
label c
"こんばんは！"
```

`実行結果 ≫ おはよう！、こんばんは！の順に表示される。`

この場合、`こんにちは！`は表示されなくなりました。このように、処理をスキップしたり、移動したりすることが、ラベルの役割です。
ちなみに、こんな記述だとどうなると思いますか？

```python
label a
"おはよう！"
label b
"こんにちは！"
label c
"こんばんは！"
jump a
```

`実行結果 ≫ おはよう！、こんにちは！、こんばんは！の順に表示がループする。`

この場合、`こんばんは！`を表示したあと、またaに戻るので、処理がループしてしまいました。このようなことが起こるので、ラベルは動作を想像しながら使っていくことが大切です。

# 2. 選択肢
わざわざなんで最初に小難しいラベルの紹介をしたんだと思った方もいらっしゃると思いますが、それはノベルゲームでは必須とも言っていい、「選択肢」の紹介をしたかったからです。

```python
menu:
#これで選択肢を表示する！とRen'py側に認識させる
    "どちら派ですか？"
    
    "たけのこ派":
        jump take

    "きのこ派":
        jump kino

label take:
   ta "やっぱりたけのこ派だ。チョコが多くてお得なように見えるからね。"
   jump matome

label kino:
   ta "クッキーの部分の絶妙な甘さ具合、これをそのまま味わえるきのこ以外、私は許せん。"
   jump matome

label matome:
ta "やっぱ間を取ってポッキーってことにしよう。"
```

こんな感じで書きます。
変えてもいいところは、「take」と、「kino」と、「matome」と、あとはセリフ部分です。セリフ部分は、セリフじゃなくて、音楽を流すとか、立ち絵を変えるなどにしても構いません。

:::note warn
改行は、余計なところに入れないでください。
<span>エラーが出て、動かなくなる</span>可能性があります。
また、「menu:」などは変えてはいけません。
:::

一応コメントで解説はつけましたが、わかりにくいので、順を追って説明します。

---
①選択肢を使うことを宣言
②選択肢(今回の場合は2つ)
<dl><dt>  ・たけのこ派</dt>
  <dd>   ラベル「take」へ移動</dd>
  <dt>  ・きのこ派</dt>
  <dd>   ラベル「kino」へ移動</dd>
<dt>ラベル「take」</dt>
<dd>セリフ表示</dd>
<dd>ラベル「matome」へ移動</dd>
<dt>ラベル「kino」</dt>
<dd>セリフ表示</dd>
<dd>ラベル「matome」へ移動</dd>
<dt>ラベル「matome」</dt>
<dd>セリフ表示</dd>
</dl>

---
こんな感じ。別に今細かい動作を覚える必要はないので、自分で選択肢を追加してみるとき、どこを変えればいいかなどの参考にしてください。

正直ここの説明難しくて、訳わからんところもあると思うので……ここに関しては、[Ren'pyドキュメント](https://ja.renpy.org/doc/html/quickstart.html#menus-labels-and-jumps)を見たほうが、わかりやすいかも。

# 3. フラグ立て
例えば、プレイヤーの選択によってエンディングを分岐させるとか、話の内容を変えるなどの演出をしたい場合、「フラグ」というものを立てることで、それを実現することができます。
フラグの説明は今から書きますが、わからなかったら[このサイト](https://wa3.i-3-i.info/word1602.html)を見ると、この記事の説明なんかより何倍も分かると思います。

フラグの説明
---
フラグとは、スイッチみたいなもので、「True」と「False」の二つの状態があります。（スイッチでいうなら「ON」と「OFF」）
フラグは普通、最初はFalse(OFF)の状態なんですが、何かの動作をしたときにTrue(ON)にすることで、あとでプレイヤーがその動作をしたのかどうかを区別することができます。

漫画で例えるなら、もともとは戦争で生きて帰るはずだったモブキャラが、「俺、この戦争終わったら、あいつに告白するんだ。」とか言って、フラグを立てて死んでいくのを想像するといいです。
![フラグ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1751564/f4c66983-4b44-736d-dd3d-db151bbc725c.png)
とりあえず、「フラグとは、TrueとFalseを切り替えられる、スイッチのようなもの」と覚えておけばいいです。

```python
default book = False

$ book = True
```
「default book = False」のほうは、***startラベルより前に書く***もので、フラグを初期化する役割があります。(「フラグを初期化」とは、ゲーム開始時Falseになっていなければならないフラグが、Trueになっていることが無いようにする作業のことです。意味わかんなかったら、まあとりあえず書いとけばいいと思います。)

「$ book = True」のほうは、***startラベルより後に***記述します。これは実際にフラグをTrueにしているコードで、「bookに、Trueを代入する」みたいな意味があります。

どちらも、bookの部分は好きな文字に変えても構いません。

# 4. 条件分岐

```python
if book:
    "本が好きなんだ！"
else:
    "本は嫌いなの？僕はとても面白いものだと思ってたんだけど・・・"
```

条件分岐は、こんな感じで書きます。
このコードの意味は、bookというフラグがtrueの時に、「本が好きなんだ！」と表示し、Falseの時、「本は嫌いなの？僕はとても面白いものだと思ってたんだけど・・・」と表示するという意味です。
これはRen'py特有のものではなく、Pythonの条件分岐の書き方と同じです。
なので、Pythonを触ったことがある人は、すぐわかると思います。

---
ここはちょっと個人的な話になるんですが、この記事を書くきっかけは、この条件分岐がわかりにくかったからなんです。
なぜかというと、いつも私はJavascriptやHSPなどの言語を使っており、そういう言語では、

```javascript:いつも使っていた言語での書き方
if (book){
   document.write("本が好きなんだ！");
}else{
   document.write("本は嫌いなの？僕はとても面白いものだと思ってたんだけど・・・");
}
```
こんな感じで書きます。
つまり、｛　｝で条件を満たしたときに実行するコードを囲むわけです。
なのでいつもと書き方が違い、最初頭に<ruby>？マーク<rp>（</rp><rt>はてな</rt><rp>）</rp>が浮かびました。

# 今回紹介したコード
今回紹介したコードを使ってまたサンプルゲームを作ったので、記事の理解の参考にしてください。
これをそのままscript.rpyに貼り付けても、画像とかがないので、動きません。
文の書き方の参考にしかならないです。
もし遊びたかったら、下にURLを貼り付けときますので、そこで遊んでください。(ゲーム性はない)

```python:script.rpy
define ta = Character('太郎', color="#c8ffc8")
default sause = False
label start:
scene ribing
show taro-smile
with dissolve
play music "music.mp3"
menu:
#これで選択肢を表示する！とRen'py側に認識させる
    ta"目玉焼きには？"
    
    "醤油":
        jump syo

    "ソース":
        jump sau

label syo:
   ta "大豆って万能だよね。"
   jump next

label sau:
   ta "やっぱソースっしょ。"
   $ sause = True
   jump next

label next:
if sause:
    ta"ソース派の僕は、ソースが好きすぎてそのまま飲むようになった。"
    ta"その結果もとからあった糖尿病が悪化し、若くして息を引き取った・・・"
    "End.2 幸せ？"

else:
    ta"醤油派の僕は、世の中の醤油をすべて買い漁り、お金が無くなってしまった・・・"
    "End.1 貧乏"
    
return
```
サンプルゲームは、[ここ](https://taxi13245.github.io/Ren-py-Intermediate/)で遊べるようにしておきました。
ぜひ遊んでください。

# おわりに
これで、Ren'pyの日本語記事が少ないからまとめてみた(中級者編)は終わりです。
初級者編でも書きましたが、ここまでで、何か一つゲームを作ってみてはどうでしょうか。
実際私も、結局は理解するまでエラーが出ては調べる・・・またエラーが出ては調べる・・・と、実践で身に着けていきました。
百聞は一見に如かず。実践することで、自分の理解はもっと深まります。
それでは、楽しいRen'pyライフを！