クイックスタート link
Ren'Py クイックスタートマニュアルにようこそ。このマニュアルでは、Ren'Py のゲームを簡単な手順でゼロから作る方法を説明します。そのために簡単なゲーム The Question の作り方をお見せします。
Ren'Py ランチャー link
ゲームの制作を始める前に、まず少し Ren'Py ランチャーの動作を見ていきましょう。ランチャーを使って Ren'Py のプロジェクトの作成、管理、編集、実行ができます。
始めましょう。 まず、 Ren'Py をダウンロード します。
Ren'Py をダウンロードしたら、展開して実行してみましょう。
Windows ではダウンローダしたファイルをダブルクリックすると、 Ren'Py は
renpy-<version>
というフォルダーに解凍されます。そのフォルダーに入り、renpy.exe
を実行します (拡張子が隠されていると、 renpy.exe ファイルはrenpy
として表示されるかもしれません)。Mac OS X ではダウンローダしたドライブイメージをダブルクリックしてドライブにマウントします。ドライブが開かれると、
renpy-<version>
という名のフォルダーをどこかにコピーしてください(どこでもよいですが、読み込み専用のドライブイメージ外に移動するべきです。フォルダ内の renpy app はフォルダから移動させないでください。他の場所で動作しません)。 そこに移動し、renpy
アプリケーションを実行します。Linux では、 tarball を解凍し、
renpy-<version>
ディレクトリに入ってrenpy.sh
を実行してください。
実行すると、Ren'Py ランチャーが起動するはずです。
Ren'Py ランチャーは複数の言語に翻訳されています。言語を変更するには、「preferences(設定)」選択後、希望の言語を選んで下さい。
プロジェクトの選択と起動 先ず The Question のような完成されたゲームを見てみましょう。これには Ren'Py ランチャーを起動し、最初の画面から The Question を選択します。 Launch Project (プロジェクトの起動) を選んで The Question を起動しましょう。
「The Question」の代わりに 「Tutorial」 を選択しても、同様の手順で Ren'Py のデモンストレーションが見れます。
Creating a new Project. ランチャーから "Create New Project(新規プロジェクトの作成)" を選択して新しいプロジェクトを作成します。
これが最初のプロジェクト作成なら、 Ren'Py はプロジェクトディレクトリを選択するよう求めます。これは新しいプロジェクトが作成されるディレクトリ(フォルダー)で、既存のプロジェクトはスキャンされます。
ランチャーはプロジェクト名を求めます。 "The Question" は既にあるので、 "My Question" のように違うなにかをタイプして入力してください。
その後、ランチャーはプロジェクトの解像度を選ぶよう求めます。 1280x720 は、ゲームサイズと画像クオリティーでよくバランスがとれています。このチュートリアルでは "The Question" のゲーム画像に一致する 1280X720 を選択し、 "Continue" をクリックします。
ランチャーはカラースキーム(新しい GUI に対するアクセントとバックグラウンドの色)を選択するよう求めます。ここでは何を選ぶかは問題ではありませんので、好きなものを選んで "Continue" をクリックしてください。
ここで Ren'Py は少しの処理をして、簡単なゲームのテンプレートを分離します。テンプレートには placeholder の絵とテキストが使用さていますが、実行可能でロールバックやロード、セーブのような期待される機能がサポートされています。 "Launch Project(プロジェクトの起動)" を選択して起動してください。
簡単なゲーム link
label start:
"Sylvie" "Hi there! How was class?"
"Me" "Good..."
"I can't bring myself to admit that it all went in one ear and out the other."
"Me" "Are you going home now? Wanna walk back with me?"
"Sylvie" "Sure!"
これは、Ren'Py のゲームの中で最も簡単なもののひとつでしょう。絵などは一切無く、二人のキャラクターの会話とナレーションだけを表示します。
これを試すためにはランチャーを開いて「 My Question Project 」を選択し「 Edit File(ファイルの編集)」から「 script.rpy 」を選択します。これが最初なら、 Ren'Py はテキストエディター(最初の開発者には Editra を勧めます)を選択するよう求め、選んだエディターをダウンロードします。それが完了すると script.rpy はそのエディターで開かれます。
エディターを開いたら、 script.rpy
のすべてを削除してください。スクラッチからスタートするので、何も必要ありません。上述の例を script.rpy
にコピーして保存してください。
さあ、このゲームを実行してみましょう。ランチャーに戻って、 「Launch Project(プロジェクトの起動)」 を選択してください。その他のどんな作業をしなくとも、 Ren'Py が起動し、ゲームのロード、セーブ、複数の設定の変更をするメニューが表示されると気づくでしょう。準備が出来たら、「 Start Game 」をクリックして、このゲームをひと通りプレイしてみてください。
この例では Ren'Py でよく使われるステートメントをいくつか使用しています。
1行目は label ステートメントです。 label ステートメント は、プログラム内のある場所に名前を与えるのに使います。この例では、 start
という名前のラベルを作ります。start ラベルは、ユーザーがメインメニューで「Start Game」をクリックしたときに Ren'Py のスクリプトが始まる場所となる、特別なラベルです。
残りの行は say statements です。say ステートメントには2つの形式があります。第1の形式はある行に文字列 (ダブルクオートで始まり、文字を含み、ダブルクオートで終わるもの) だけがあるものです。これはナレーションやメインキャラクターの思考に使われます。第2の形式は2つの文字列で構成され、前半の文字列はキャラクターの名前で、後半の文字列はそのキャラクターの台詞です。これは会話に使われます。
なお、ここの say ステートメントはすべて4つのスペースでインデントされています。このステートメントは label ステートメントの下にあるブロックだからです。Ren'Py では、ブロックは先行するステートメントに対してインデントされていなければならず、ブロック内のすべてのステートメントは同じ量だけインデントされている必要があります。
文字列がダブルクォーテーションを含むときはそのダブルクォーテーションの前にバックスラッシュを置かなければなりません。例
"Sylvie" "Did you ever hear Lincon's famous saying, \"The problem with Internet quotations is that many of them are not genuine.\""
この簡単なゲームは見栄えはしませんが、Ren'Py で動くものを作ることがいかに簡単か、という一例です。少ししたら画像を追加しますが、その前に、キャラクターを定義する方法を見てみましょう。
キャラクター link
最初の例ではキャラクターがしゃべる度にそのキャラクター名を繰り返し打ち込まなければならない問題があります。台詞の多いゲームだとタイプ量が多くなります。また、どちらのキャラクターの名前も同じように表示され、ゲーム開始時に選択された色になります。これを解決するために、Ren'Py ではキャラクターを先に定義しておけます。これにより、短い名前をキャラクターに関連付け、さらにキャラクター名の色を変えられます。
define s = Character('Sylvie', color="#c8ffc8")
define m = Character('Me', color="#c8c8ff")
label start:
s "Hi there! How was class?"
m "Good..."
"I can't bring myself to admit that it all went in one ear and out the other."
s "Are you going home now? Wanna walk back with me?"
m "Sure!"
1行目と2行目はキャラクターを定義しています。1行目は短い名前が「s」、長い名前が「Sylvie」で、名前が緑色で表示されるキャラクターを定義しています(色はウェブページで使われているようなRGBの16進数です)。
2行目は、短い名前が「m」、長い名前が「Me」で、名前が赤色で表示されるキャラクターを定義しています。Character の行をコピーし、短い名前、長い名前、色を変えて、他のキャラクターも定義できます。
また、say ステートメントでもキャラクター名の文字列の代わりに Character オブジェクトを使うように変更しました。これにより、定義したキャラクターを使うように Ren'Py に指示します。
画像 link
:doc: 画像の表示
絵がなければビジュアルノベルとはいえません。ここに "The Question" からのもう一つのシーンがあります。これにはプレイヤーに画像を表示するステートメントも含まれます。試したければ、前回のスクリプト部分を置き換えだけでよいです。
define s = Character('Sylvie', color="#c8ffc8")
define m = Character('Me', color="#c8c8ff")
label start:
scene bg meadow
"After a short while, we reach the meadows just outside the neighborhood where we both live."
"It's a scenic view I've grown used to. Autumn is especially beautiful here."
"When we were children, we played in these meadows a lot, so they're full of memories."
m "Hey... Umm..."
show sylvie green smile
"She turns to me and smiles. She looks so welcoming that I feel my nervousness melt away."
"I'll ask her...!"
m "Ummm... Will you..."
m "Will you be my artist for a visual novel?"
show sylvie green surprised
"Silence."
スクリプトのこの部分では二つの新しいステートメントを導入します。6行目の scene
ステートメントはすべての画像を除去し、バックグラウンド画像を表示します。16と26行目の show
ステートメントはそれぞれ背景の上に立ち絵を表示し、表示している立ち絵を変更します。
Ren'Py では各画像に名前があります。その名前はタグと任意の一つ以上の属性から成ります。タグと属性は共にアルファベットで始まり、アルファベット、数字、アンダースコアで構成されます。例 :
6行目の scene ステートメントで、タグは "bg", 属性は "meadow" です。慣例的に、背景画像は bg タグを使用するべきです。
16行目の最初の show ステートメントで、タグは "sylve", 属性は "green" と "smile" です。
26行目の show ステートメントで、タグ "sylvie", 属性は "green" と "surprised" です。
指定されたタグをもつ画像は同時に一つだけ表示できます。同じタグを持つ別の画像が表示されると、最初のタグの画像が26行目のように置き換えられます。
ランチャーの "Open Directory(ディレクトリーを開く)" にある "images" を選択すると表示される images ディレクトリ内で、Ren'Py は画像ファイルを検索します。Ren'Py はキャラクター画像は PNG か WEBP, AVIF 背景画像を JPGかJPEG, PNG, WEBP, AVIF ファイルであると期待します。 SVG ファイルもサポートされますが、もっぱらインターフェースのカスタマイズに使用されています。ファイル名はとても重要で、拡張子は除去され、小文字に変換されて、画像名として使用されます。
例えば images ディレクトリに配置された以下のファイルは以下の画像を定義します。
"bg meadow.jpg" ->
bg meadow
"sylvie green smile.png" ->
sylvie green smile
"sylvie green surprised.png" ->
sylvie green surprised
ファイル名は小文字になるので、以下も同じです。
"Sylvie Green Surprised.png" ->
sylvie green surprised
画像は images ディレクトリ下のサブディレクトリにも配置できます。そのディレクトリ名は無視され、ファイル名は画像名を定義するのに使われます。
hide ステートメント Ren'Py は、与えられた画像を非表示にする hide
ステートメントもサポートしています。
label leaving:
s "I'll get right on it!"
hide sylvie
"..."
m "That wasn't what I meant!"
実際には hide はあまり使わないでしょう。キャラクターの表情が変わるときには show が使えますし、全員がいなくなるときは scene が使われます。hide が必要なのは、あるキャラクターがいなくなり、場面は変わらない時だけです。
Image ステートメント 開発者は、 Ren'Py に自動定義をして欲しくないときがあります。このため、 image
ステートメントがあります。これは(インデントなしで、 start ラベルの前の)ファイルの最初にあるべきで、画像名を画像ファイルに対応付けるために使用されます。例
image logo = "renpy logo.png"
image eileen happy = "eileen_happy_blue_dress.png"
image ステートメントは start ラベルやプレイヤーとのインタラクションがあるその他のゲームスクリプトの前、初期化時に実行されます。
image ステートメントはさらに複雑な処理にも使用できますが、それは 他の場所 で語られます。
トランジション link
詳細: トランジション
上述のスクリプトでは、画像は即座に表示、非表示されます。場所の変更や、キャラクターの入退場は重要なため、表示の変更時にエフェクトを適用するトランジションを Ren'Py はサポートします。
トランジションは前のインタラクション(台詞やメニュー、トランジション) が終わった時点の表示から、scene、show、hide ステートメントが実行された後の表示に画面を変えます。
label start:
scene bg meadow
with fade
"After a short while, we reach the meadows just outside the neighborhood where we both live."
"It's a scenic view I've grown used to. Autumn is especially beautiful here."
"When we were children, we played in these meadows a lot, so they're full of memories."
m "Hey... Umm..."
show sylvie green smile
with dissolve
"She turns to me and smiles. She looks so welcoming that I feel my nervousness melt away."
"I'll ask her...!"
m "Ummm... Will you..."
m "Will you be my artist for a visual novel?"
with ステートメントは、使用するトランジションの名前を受け取ります。よく使うものの一つは dissolve
で、ある画面から次の画面に徐々に移行します。便利なトランジションには他に fade
があり、真っ黒な画面にフェードアウトし、それから新しい画面にフェードインします。
トランジションが複数の scene、show、hide ステートメントの後に置かれたとき、トランジションはそれらすべてに同時に適用されます。次のように書くとします:
scene bg meadow
show sylvie green smile
with dissolve
「bg meadow」と「sylvie smiles」の両方が同時にディゾルブします。一人ずつディゾルブさせたいときは、2つの with ステートメントを書く必要があります
scene bg meadow
with dissolve
show sylvie green smile
with dissolve
これは、まず meadow をディゾルブし、それから sylvie をディゾルブします。meadow を即座に表示し、それから sylvie をディゾルブさせたい場合は、次のように書けます:
scene bg meadow
with None
show sylvie smile
with dissolve
ここで、特殊なトランジションを指定する None が使われていますが、これは実際にはユーザーに何も表示せずに Ren'Pyの 先頭スクリーンの内部状態を更新します。
位置 link
詳細: Transform
デフォルトでは、画像は水平方向には中央に、そして画像の下端が画面の下端に重なるように表示されます。これは背景と1人のキャラクターでは十分ですが、画面に2人以上のキャラクターがいるときは別の位置にするべきです。また、ストーリーによってはキャラクターを移動させたい時もあります。
show sylvie green smile at right
この移動を行うには、show ステートメントに at 節を加えます。at 節は表示位置を受け取り、画像をその位置に表示します。Ren'Py では表示位置を前もっていくつか定義しており、 left
はスクリーンの左側に、 right
は右側に、 center
は水平方向の中央 (デフォルト) に、そして truecenter
は水平方向にも垂直方向にも中央に、それぞれ表示します。
ユーザーは独自の表示位置や複雑な動きを定義できますが、それはクイックスタートの範囲外になります。
音楽と効果音 link
詳細: オーディオ
ほとんどのゲームではバックグラウンドで曲を再生します。曲は play music
ステートメントで再生されます。これは再生するオーディオファイルとして解釈されるファイル名を受け取ります。オーディオファイル名はゲームディレクトリに対する相対パスと解釈されます。オーディオファイルは opus または ogg vorbis, mp3 フォーマットであるべきです。
例 :
play music "audio/illurock.ogg"
曲を変更するときは fadeout
, fadein
節が使用可能で、それらを使用して以前の曲をフェードアウトし、新しい曲をフェードインします。
play music "audio/illurock.ogg" fadeout 1.0 fadein 1.0
queue music
ステートメントは現在のファイルの再生終了後にファイルを再生します。
queue music "audio/next_track.opus"
音楽は stop music
ステートメントで停止できます。これもオプションで fadeout 節を受け取れます:
stop music
効果音は play sound
ステートメントで再生され、music とは違いループしません。
play sound "audio/effect.ogg"
ファイル名が game/audio
ディレクトリにあり、拡張子を除く名前が Python 変数として利用可能(文字で始まり、文字、数値、アンダースコアのみを含む)であればそのファイルを引用府で囲わないでも再生できます。
例えば game/audio/illurock.ogg
が存在すれば、次のように書けます。
play music illurock
詳細は the audio namespace を参照してください。
Pause ステートメント link
pause
ステートメントは Ren'Py をマウスがクリックされるまで停止します。
pause
数字が指定されると、その秒数が経過後ポーズが終わります。
pause 3.0
ゲームの終了 link
何も呼び出していない状態で return
ステートメントを実行するとゲームを終了できます。その前に、ゲームの終了を表す何か、例えばエンディング番号やエンディング名を伝えるのがよいでしょう:
".:. Good Ending."
return
選択肢のないゲーム、キネティックノベルを作るのに必要なことは以上です。それでは、ユーザーに選択肢を提示するために必要なことを見てみましょう。
default, Python, if ステートメントによるフラグサポート link
詳細: Python ステートメント と 条件分岐用ステートメント
上記のステートメントだけで作れるゲームもありますが、他のゲームはデータを保存し、後で呼び出す必要があります。例えば、ゲームがプレイヤーの選択を覚えておいて、後で反応するというのができるでしょう。これが Ren'Py が Python をサポートする理由の一つです。
ここで、プレイヤーの選択の情報を含むフラグを保持する方法を示します。フラグを初期化するために、start ラベルの前に default ステートメントを使用します。
# True if the player has decided to compare a VN to a book.
default book = False
label start:
s "Hi there! How was class?"
設定されていなければ、 book フラグは False
で初期化されます。ラベル book への道が選択されると、Python 代入式で以下のように True にできます。
label book:
$ book = True
m "It's like an interactive book that you can read on a computer or a console."
jump marry
ドルマークで始まる行は Python ステートメントとして解釈されます。ここの代入ステートメントは変数に値を代入します。Ren'Py は複数行の Python ステートメントのような、 Python を含む他の方法もサポートしていますが、それは他のセクションで語られます。Ren'Py は Python2.7 をサポートしていますが、 python 2 と 3 両方で動くように書くことを強く勧めます。
フラグをチェックするため、 if
ステートメントが使用されます。
if book:
"Our first game is based on one of Sylvie's ideas, but afterwards I get to come up with stories of my own, too."
条件が True なら、スクリプトのブロックが実行され,そうでなければスキップされます。 if
ステートメントは条件が False なら実行されるスクリプトのブロックを導入する else
節も受け取れます。
if book:
"Our first game is based on one of Sylvie's ideas, but afterwards I get to come up with stories of my own, too."
else:
"Sylvie helped with the script on our first video game."
もちろん Python の変数は単なる True/False に限定されず、任意の Python の値にできます。変数はプレイヤー名の保存、得点の保存、その他のあらゆる目的に使えます。Ren'Py では Python プログラミング言語を完全に自由に使えるので、いろいろなことができます。
テンプレート内のファイル link
作成したプロジェクトのゲームフォルダには、以下のフォルダとファイルが含まれています。
- audio/
このフォルダは、オーディオファイルの配置を意図しています。詳細は オーディオ を参照してください。
- cache/
このフォルダにはキャッシュファイルが含まれています。開発者がこれらのファイルを編集する必要はありません。
- gui/
このフォルダには、GUIで使用される画像が含まれています。詳細は GUI カスタマイズガイド を参照してください。
- images/
このフォルダは、画像ファイルの配置を意図しています。詳細は 画像の表示 を参照してください。
- tl/
このフォルダには、翻訳ファイルが含まれています。詳細は 翻訳 を参照してください。
- gui.rpy
GUI 変数は、このファイルで定義されています。詳細は :ref:'GUI カスタマイズガイド <gui>` を参照してください。
- options.rpy
このファイルでは、設定変数とビルド変数、設定の一部、GUI変数の一部が定義されています。詳細は、Config 変数、Preference 変数、配布物のビルド、および GUI カスタマイズガイド を参照してください。
- screens.rpy
このファイルではスクリーンが定義されており、 より高度なGUIカスタマイズ で編集する必要があります。詳細については、スタイル、スタイルのプロパティー、スクリーンとスクリーン言語、Screen Actions, Values および Functions、特別な名前のスクリーン、スクリーン言語の最適化 も参照してください。
- script.rpy
このファイルは、シナリオを含むその他のスクリプトを記述するためのものです。任意の
rpy
を追加または削除することもできます。詳細は 言語の基本 を参照してください。- *.rpyc
これらのファイルは、読み込み時間を短縮するために各
rpy
ファイルをコンパイルしたものです。対応するrpy
ファイルの削除を除いて、開発者がこれらのファイルを編集する必要はありません。詳細は 言語の基本 を参照してください。
ゲームの公開 link
ゲームを作ったら、公開する前にいくつかやるべきことがあります:
- Ren'Py の新しいバージョンをチェックする
Ren'Py の新しいバージョンでは基本的にバグの修正と新機能の追加が行われます。リリース前にランチャーのアップデートボタンを押して Ren'Py を最新バージョンに更新してください。 http://www.renpy.org/latest.html でも新バージョンのダウンロードと更新履歴の確認が出来ます。
Ren'Py の変更がゲームスクリプトの変更を要求するのことは滅多にありませんが、 非互換の変更 では非互換な変更がリストされています。
- スクリプトのチェック
ランチャーの先頭ページから、 「Check Script (Lint) 」を選びましょう。これは様々なユーザーに影響する潜在的エラーがないかをチェックします。これらのエラーのいくつかは他のプラットフォームのユーザーにのみ影響する可能性があるので、あなたのコンピューターで問題が起こらなくてもそれらすべてを修正することは重要です。
- 配布物の生成
ランチャーの先頭ページから、「 Build Distributions 」を選びましょう。options.rpy に含まれる情報に基づき、ランチャーはひとつ以上のあなたのゲームのアーカイブを作ります。
- テスト
Lint はテストの代わりにはなりません。ゲームを配布する前にテストするのはあなたの責任です。自分では見つけられなかった問題を発見することが多いので、友人にベータテストの手伝いを頼むとよいでしょう。
- 配布
開発とテストが終了したら、生成されたアーカイブファイルを人が見れるweb上にアップするべきです (あなた自身のウェブサイトがないならば、 https://itch.io は多くのビジュアルノベルをホストします)。 おめでとう、あなたは最初のビジュアルノベルをリリースしました。
ゲームをアナウンスできる場所はいくつかあります。 :
Ren'Py Games List は開発された Ren'Py ゲームの記録を保持する役に立ちます。
Completed Games section of the Lemma Soft Forums はゲームを開発者同士で報せ合えるよい場所です。
あなたのゲームの配布物のビルドをカスタマイズするより高度な方法は 配布物のビルド のページにあります。
The Question のスクリプト link
ここで 「 The Question 」のすべてのスクリプトを見ることが出来ます。
これから何をする? link
このクイックスタートは、Ren'Py でできることのほんの一部にしか触れていません。簡単のため、ビジュアルノベルを作成する最小機能にフォーカスし、Ren'Py の多くの機能を省略、単純化しました。
Ren'Pyにできることを知るには、 Tutorial や Ren'Py website で特集されている他のゲームをプレイしてください。恐らくこのマニュアルの残りの部分も読みたいでしょう。まずは GUI カスタマイズガイド を参照してください。
上記の他に、 Lemma Soft Forums の Ren'Py もチェックするとよいでしょう。そこには再使用できるライブラリーやサンプルのクックブックや質問のセクションがあります。 Lemma Soft Forum は Ren'Py コミュニティーの中心で、新しい開発者とその疑問を歓迎します。
Ren'Py ビジュアルノベルエンジンを選んでいただき、ありがとうございます。どんなゲームができるか、楽しみにしています!