本シリーズでは、Ren'Pyユーザーが知っておきたいPythonの使い方をご紹介しています。
詳細および事前準備などは「00.はじめに」をご確認ください。
今回は「条件分岐(if文)」、マルチエンドのビジュアルノベルを作るのに不可欠な内容です。
前回の03.条件式をご覧いただいている前提で進めますので、未読の方は先にご確認ください。
準備
今回はコンソールではなくRen'Pyスクリプトで説明を進めます。
今回の記事で出てくるスクリプトのスクリーンショットは、テキストエディター「Atom」を使用した場合の表示となります。同様にAtomを使用したい方は、ランチャーの右下「設定」→「テキストエディター」で「Atom」を選択しておいてください(下図参照)。
※本記事の時点ではAtomを使用していますが、現在はVisual Studio Code推奨です(2023年1月追記)
また、スクリプトの起動時にはランチャーから「script.rpy」を選択してください。上記で設定したエディターで開くことができます。
それでは、始めましょう。
条件分岐の例
1つ簡単なサンプルスクリプトを用意しました。
プロジェクトを起動すると次のようなゲームが走ります。
※背景画像は適当に作成しました
先ほどのゲームは次のようなスクリプトで走っています。
少し長く見えるかもしれませんが、ポイントは太字の部分です。この後詳しく解説します。
# キャラクターの定義
define e = Character('エリカ', color="#c8ffc8")
# メイン
label start:
# (背景を表示)
scene bg sky
with dissolve
"(サンプル開始)"
$ love_point = 0 # 好感度のリセット
e "太郎くん、私のこと…好き?"
menu: # 選択肢
"大好き!":
$ love_point = love_point + 10 # 好感度up
"あんまり…。":
$ love_point = love_point - 30 # 好感度down
e "そう…。"
if love_point > 0: # 好感度が0以上ならハッピーエンド
e "私も太郎くんが好き!"
"ハッピーエンド"
else: # そうでなければバッドエンド
e "あんたなんか、大っ嫌い!!"
"バッドエンド"
"(サンプル終了)"
return
cf. Atom上での表示
条件分岐(if文)の書き方
条件によって分岐させたいときにはif文を書きます。
先ほどの例では、スクリプトの最後の方にある下図の部分にif文があります。
「if」の後ろに条件式を書きます。
条件式がTrueのときは「if」のブロックが走ります。
条件式がFalseのときは「else」のブロックが走ります。
※ 厳密には、ifの後ろは式でなくフラグなどでもOKです。要するにTrue/Falseが入れば何でもOK。
ここで注意事項です。「:」(コロン)と「 」(インデント)はお忘れなく!
Ren'PyでもPythonでも、「:」と正しいインデントは重要です。
特にインデントは、ただの空欄に見えるかもしれませんが、正しく入れないとエラーが出ます。
(半角スペース4つ分です。 tab/shift+tabでも調整可。ある程度は改行時に自動で入ります。)
Ren'Py内で変数に値を与える
ここまでで山は越えました。あと少しで終わりです。
先ほど、このようなスクリプトを書きました。
if love_point > 0:
e "私も太郎くんが好き!"
"ハッピーエンド"
ここでは「love_point」という変数の値が0以上かどうかで分岐させています。
では、love_pointの値はどこで変更しているのでしょうか。
答えは、下図の部分です。
1点異なるのは、頭に「$」がついています。
この「$」について。
実は、Ren'PyスクリプトにそのままPythonコードを挿入することはできません
(if文はそのまま挿入できますが、これは特例です)。
Ren'PyスクリプトにPythonコードを挿入するとき、1行だけなら、頭に「$」を付ければOKです。
今回はここまでです。お疲れ様でした。
cf. 関連ページ
Ren'Py部屋 @crAsmビジュアルノベル情報部屋
お問合せフォーム - ご質問・ご要望はこちら
もう少しだけ頑張れる!という方は、以下の内容もご覧ください。
補足
先ほどの例では「if」と「else」のブロックを用意しました。
label start:
$ love_point = 0
if love_point > 0:
"ハッピーエンド"
else:
"バッドエンド"
return
条件が2段階、3段階あるときには「elif」が使えます。
「elif」の後ろに条件式を書きます。
label start:
$ love_point = 0
if love_point > 0:
"ハッピーエンド"
elif love_point == 0:
"ノーマルエンド"
elif love_point > -10:
"ビミョーエンド"
else:
"バッドエンド"
return
また、「else」ブロックは無くてもかまいません。
label start:
$ love_point = 0
if love_point > 0:
"ハッピーになった!"
"終了"
return
おまけです。
今回はRen'Pyスクリプトで説明しましたが、Pythonでもif文の形は同じです。
下図は以前書いたPythonコードの一例です。水色で囲っている部分にif/elseが居ます。
以上です。