Ren’pyを使って学祭紹介ゲームを作ってみた

# はじめに
近畿大学 Advent Calendar 2019の5日目担当のniyaです.
今回は, 近畿大学で毎年行われている生駒祭を紹介するゲームをRen'pyで作ったので, その時に覚えた文法等共有できたらなあと思います.

成果物は以下のurlにあります.
https://drive.google.com/drive/u/2/folders/1CVx17S12MDS8VLIsH4Q2Iu4C5U93vYC_

また, githubは以下です.
https://github.com/niya1123/Short-Novel/tree/dev

## Ren'pyのゲーム作りの基礎

今回はRen'py自体のDLとプロジェクトの作り方などは[**前回の記事**](https://qiita.com/niya1123/items/70a536b1642e0a10c93a)で紹介しているので, そちらの方を見ていってください.

### セリフの書き方

セリフの書くには以下の手順を踏めば良いでしょう.

1. キャラクターのセリフなのか独白やナレーションなのかを考える.
2. 前者ならキャラクターを定義する. 後者は特に定義する必要なし.
3. script.pyにその定義を書き込む.

具体的には以下のようになります.

```script.rpy
# キャラクターの定義 define キャラ名 = Character("キャラ名", color="カラーを16進数で設定")
# define直後のキャラ名は基本的には1文字やキャラ名の短縮名で定義することをお勧めする.
# colorはテキストボックスに表示されるキャラ名の色.
define character = Character("キャラクター", color="#c8ffc8")

# ゲーム起動時はlabel startから始まる.
label start:
    # キャラの短縮名 "セリフ"でセリフの表示
    character "こんにちは！"

    # キャラ名を設定しないと, ナレーション.
    "ナレーションですこんにちは"

    # returnでlabelの終了.
    return
```

### キャラクター画像の設定
キャラクター画像の設定は以下のように行います.

```script.rpy
# 略
label start:
    
    show character default
    with fade
    
    character "こんにちは！"

    return
    
```
ここで注意すべきはshow以降の文字列です.ここでは任意の画像のファイル名を指定することで画像を表示します.

そして, 画像の名前には推奨される命名規則があり, 例えば` bg green.jpg (Bg Green.jpgでも可)`のように"bg"がタグ, "green"が属性という風になっています.他に以下のような命名が考えられます.

```script.rpy
# bgがタグでgreenとhouseが属性
show bg green house
```
また, 同じタグの画像が同時に指定された場合一番最後に指定された画像が表示されます.

次に` with fade `とありますがこれはトランジションというものです.

詳細は以下を参考にしてください(数が多いので).

https://ja.renpy.org/doc/html/quickstart.html#transitions

### pythonスクリプトの使用

Ren'pyではpythonのスクリプト(python2系)が使用することができます. まだ正式に発表されていませんが今後は3系のpythonが利用できる可能性はあります.(参考: https://twitter.com/renpytom/status/1196203607252709376?s=20)

では, 使い方を説明していきます.

```script.rpy

default flag = False

label start:

    menu:
        "想いを伝えますか?"
        "はい":
            $ flag = True
        "いいえ":
    jump flag
    return

label flag:
    if not flag:
        "Bad End"
    else:
        "Good End"

    return
```
色々新しい要素が出てきましたね. 順番に説明します.

まず, default文がありますがこれはstartラベルの前に使いたい変数を初期化するためのものです.
なくてもいいですが, その場合label内で変数を用いるとFlaseが初期値として自動的に付与されます.

次にstartラベル内のmenuというものがあります.

```script.rpy
略
    menu:
        "選択肢を選んでね"
        "はい":
            jump yes
        "いいえ":
            jump no
```

使い方はこのような感じで,ナレーション部分はなくてもいいです.` "選択肢": `という風に記述していきます.その後インデントして処理を書くことができます.この辺りはpythonと同じです.jumpは` jump 飛ばしたいラベル名  `という風に設定できてその飛びたいラベルに処理が飛び, そのラベルがreturnで終了するとまた処理が戻ってきます.

次に` $ flag = True ` ですが, $以降に１行のみでpythonのコードが書けます.
複数行にわたってコードを書きたい場合は次のように書けます.

```script.rpy
python:
    life = 100
    damage = 50
    my_life = life - damage
```

次にif文ですが, if文は$やpythonを用いずにそのまま使用することができます.



以上の基礎を押さえておけば, 皆さんもRen'pyを用いてノベルゲームが作れます!!!!

## Ren'pyのゲーム作り応用

ここからはちょっとした応用です. 

まずはRen'pyのデフォルトの起動画面を変更しましょう.

デフォルトの画面はこんな感じです.
![スクリーンショット 2019-12-05 15.49.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274354/c1a5d4f3-a2af-2326-74c3-c6dea556d588.png)

右下の青文字のtestをRen'pyにして色をオレンジ色(#f59e11)にしてみましょう.![スクリーンショット 2019-12-05 20.49.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274354/ee736739-8a81-6410-56f6-9db2ed2cf0e8.png)

変更する点は以下です.

```options.rpy(16行目あたり)
define config.name = _("test")
# これを以下に変更
define config.name = _("Ren'py")
```

```gui.rpy(28行目あたり)
define gui.accent_color = '#0099cc'
# これを以下に変更
define gui.accent_color = '#f59e11'
```

続いてmenuの画像を変更します.

```gui.rpy(96行目あたり)
define gui.main_menu_background = "gui/main_menu.png"
# これを以下に変更
define gui.main_menu_background = "gui/main_susuki.png"
```
変更したらこうなります.(今回は画像サイズ合ってないけど本番は画像の方をゲームのサイズに合わせましょう) 

![スクリーンショット 2019-12-05 20.58.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274354/ae337b31-6674-527f-591f-32a69b1c95aa.png)

## 最後に
正直色々端折ったのですが基本的にここまで理解していれば, 自分の作った成果物くらいは作れると思います.
皆さんも是非Ren'pyで何か作ってみてください！

## 参考サイト
https://ja.renpy.org/doc/html/index.html