忍者ブログ

凪司工房の徒然

お知らせ・小説・ツイノベ・随筆・エッセイなど

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

Ren'Py はじめます。 の補講 第3.5回

 「Ren'Pyはじめます。 の補講 第3.5回です」

「こちらでは本編では悠長に触れていられない、Ren'Py のプログラム的な話や、やや突っ込んだ内容についての講義であったり、また参照記事であったりを書いていきます」

「今回は第3回の補足です」

「これまで補講は土曜日に記事をアップしていましたが、」

「第4回以降の記事の製作にやや時間がかかる……」

(画像関係になると素材準備に時間が費やされる orz)

「なもんで、今後は暫く補講と本編をそれぞれ1週間毎に書き上げていく予定となっております」

「という訳で、補講を読まれる方は ↓続きの記事からお願いします」



拍手[0回]





「第3回ではテキストを中心に、やっとノベル・ゲームらしいものを作りましたね」

「今回の補講ではテキスト処理を中心に、最終的には第3回でやったものを少しグレイド・アップさせてみましょう」

「まずは台詞等の基本的な書き方から……」





3.1 <""で括る>

「台詞や地の文章として表示させるものは "" (ダブルクォーテイション)で括りましょう」


label kokuhaku:
"美智" "先輩"
"亮介" "どうした?"
"美智" "先輩のこと、ずっと……好きでした!"
"亮介" "お前……美智じゃねえだろ?"
"驚いた美智は少し笑おうとして、思わず涙を零してしまった。" # こっちは地の文章


「ラベル中に""で括った部分の最初は名前として表示され、次の部分は台詞として表示されます」

「これが一番簡単な台詞や地の文章の書き方ですが、おそらくRen'Pyを使って作ってあるゲームでこんな風に記述してあるものは少ないと思います」

「理由は次のような機能を備えているからです」





3.2 <人物を設定する>

「第3回で使ったコードでは全く使われていませんでしたが、Ren'Pyには人物それぞれの名前や色等を予め設定しておいて、簡単な記号のみで設定しておいたものに差し替えてくれる機能があります」

「第3回で登場する"勇者"や"魔王"なんかの名前も、予め設定しておくことが出来ます」


# 人物の設定
define m = Character('魔王', color="#ff0000")
define u = Character('勇者', color="#0000ff")


「label start より前の部分にこれは書いて下さい」

「ここでやっているのは m という文字が台詞の""の前に出てくるとそれを"魔王"という字に置き換えて、更にその文字の色を赤にする、というものです」

「同じように u は勇者と表示されます」

「実際にコード中に書くとこんな感じです」


label start:

"この物語は一人の魔王と、一人の勇者の、汗と涙と血と骨と肉の物語である。"
"この国では国民から魔王と戦う勇者を選出し、永きに渡り魔王と戦ってきた。"
king "次の勇者はこの者だ。探し出してここに連れてこい!"
soldier "承知しました!"
"こうして第156代目の勇者にあなたは選出されたのである。"
u "えっと、何すか?"
king "お前は第156代目の勇者に選ばれたのだ。さっさと魔王と戦って世界平和を取り戻せ!"
u "えー、そんな面倒な。"


「ここで使われている Character() という関数 (こういう処理をしてくれるものを関数と呼びます) は文字の色以外にも様々な引数 (関数に渡す値を引数と呼びます) を取ることが出来ます」

Character(名前, 種類, 画像, 色……)

「台詞を 『』 等で毎回括って表示したい場合は」

Character("魔王", what_prefix='『', what_suffix='』')

「なんてすると、毎回『』で括られて表示されます」

「他にも色々な使い方が出来るようですが、今回は基本的な名前と文字色のセットを押さえておきましょう」





3.3 <ラベル移動>

「コード中では特に説明なく使ってしまっていますが、jumpという命令があります」

jump ラベル名

「これは jump ラベルその1 とjumpに続けてラベル名を記述することで、そこからそのラベルへと処理が飛んでくれるというものです」

「分岐の時にも使いますが、基本的には長い物語になると話のひとまとまりをラベルにしてしまうので、その間の移動にもこの命令を使います」





3.4 <選択肢>

「選択肢を表示するのは menuという命令を使います」

menu:
"最初の選択肢":
〜何らかの処理〜
"次の選択肢":
〜何らかの処理〜

「これについては第3回の中でも触れていますが、一番単純な使い方としては次のように表記することで、選択肢として機能してくれます」


label cafe:
"美少女" "私を誘拐しますか?"
menu:
"はい":
jump monogatari_start
"いいえ":
jump monogatari_owata


「menuの後の(セミコロン)と、その次に選択肢の台詞の後にもがついていることにご注意下さい」

「これはmenuの次からが一つのブロックであり、選択肢の台詞の後もそれはそれで一つのブロックであるという、二重のブロック構造になっています」

「そのブロック中には色々な処理とか台詞を書き込むことが出来ます」

「こんな使い方する人もいないでしょうが、こんなことも出来るということで」


label cafe:
"美少女" "私を誘拐しますか?"
menu:
"※この美少女はあなたを見つめて瞳がうるうるとしています"
"※こんな美少女をあなたは放っておくのですか?"
"はい":
jump monogatari_start
"いいえ":
jump monogatari_owata


「こうすると選択肢が出ている間に、台詞の表示部分に説明的にコメントが表示出来たりもします」

「慣れてくると、この選択肢にゲーム変数を絡めたり(例えば好感度みたいなものとか)、ラベルに飛んだりせずに変数の数値だけを弄るとか、そういったことも可能です」

(たぶんPythonを使うともっと色々と複雑なことも可能です)





3.5 <条件分岐>

「条件分岐というのは、例えば何かアイテムを持っている時はAルートへ進めるとか、犯人の手がかりを手に入れているとBルートへ進めるとか、そういった処理のことです」

「本編でも触れてましたが、条件分岐には if を使います」


if 条件式:
〜何らかの処理〜



label gake:
"こんなところに呼び出して、まるで私が真犯人と言っているみたいね"
if shinjitsu == True:
"真犯人フラグ立ったな!"
jump jiken_shinsou # 真相解明編へ
"証拠も何もありません。ただ、あなたが仮に犯人なら、私をどうするかと思って"
"殺しますね。ふふ"


「分かりやすいようにわざわざ shinjitsu == True と書きましたが、True/False (真/偽)のどちらかの値しか無い場合は、通常は if shinjitu: と書きます」

「if 命令はこういう単発の条件分岐だけで無く、もっと多くの分岐を作ることも可能です」


label gake:
"こんなところに呼び出して、まるで私が真犯人と言っているみたいね"
if shinjitsu == 1:
"真犯人フラグ立ったな!"
jump jiken_shinsou # 真相解明編へ
elif shinjitsu == 2:
"あなたが真犯人ならこんな場所へは呼び出しませんよ"
jump jiken_shinsou_2 # 真相解明編その2へ
else:
"証拠も何もありません。ただ、あなたが仮に犯人なら、私をどうするかと思って"
"殺しますね。ふふ"


<if 〜条件1の時〜/elif 〜条件2の時〜/else〜その他>

(他のプログラム言語に慣れ親しんだ人は「elseif」とか「elsif」とかで無いことに注意して下さい)

「このようにすれば幾つかに分岐する部分を作成出来ます」

「分岐を沢山増やしたければ elifをその数だけ増やせばいいです」





3.6 <変更した第3回のコード>

「こちらに今回の補講で補足したものを使って、第3回の講義のコードに手を加えたものを置いておきます」

「と言っても、変更したのは人物名を事前に定義しておいた、というだけですが」


# You can place the script of your game in this file.

# Setting Japanese
init:
$ style.default.font = "VL-PGothic-Regular.ttf"
$ style.default.language = "eastasian" # 日本語禁則処理

# Declare images below this line, using the image statement.
# eg. image eileen happy = "eileen_happy.png"

# Declare characters used by this game.←名前定義だよ
define king = Character('王', color="#ff9900")
define soldier = Character('兵士', color="#009900")
define u = Character('勇者', color="#0000ff")
define wiz = Character('魔法使い', color="#ffdd00")
define pre = Character('僧侶', color="#ff00ff")
define inn = Character('宿夫')
define M = Character('魔王', color="#9900ff")

# The game starts here.
label start:

"この物語は一人の魔王と、一人の勇者の、汗と涙と血と骨と肉の物語である。"
"この国では国民から魔王と戦う勇者を選出し、永きに渡り魔王と戦ってきた。"
king "次の勇者はこの者だ。探し出してここに連れてこい!"
soldier "承知しました!"
"こうして第156代目の勇者にあなたは選出されたのである。"
u "えっと、何すか?"
king "お前は第156代目の勇者に選ばれたのだ。さっさと魔王と戦って世界平和を取り戻せ!"
u "えー、そんな面倒な。"
king "もし魔王を倒したらその暁には何なりと望みを叶えよう。"
u "よしわかった。商談成立だな。"
king "では手続きを済ませて、さっさと魔王討伐の旅へ出ろ。"
u "もし俺が魔王を倒して帰ってきたら、まずお前のその命令口調なおしてやっからな。"
"こうして勇者は旅の準備をしに酒場へ向かった。"

jump sakaba

label sakaba:
"酒場にやってきた勇者だったが、そこで勇者は二人のよく知る女性を見かける。"
"一人は今付き合っている彼女の金髪の魔法使いだ。"
"もう一人は寂しそうにバーカウンターに座っている元彼女の紫髪の僧侶。"

"あなたはどちらに話しかける?"
menu:
"今の彼女の金髪の魔法使い":
$ girl_friend = 1
jump ima_kano
"昔の彼女の紫髪の僧侶":
$ girl_friend = 2
jump moto_kano

label ima_kano:
u "飲みにくるなんて珍しいな。"
wiz "あんた、私を置いて旅に出るつもりだったんでしょ?"
u "危険な旅に連れてけないよ。"
wiz "この前ずっと一緒にいようって言ってたじゃない!"
u "酔ってたんだよ。"
wiz "死ぬ時は一緒だから。"
u "何言うんだよ、縁起悪いな。"
wiz "私、一緒に行くから。"
"魔法使いが仲間になった!"

jump trip1

label moto_kano:
u "久しぶり、だな。"
pre "あ……。勇者に選ばれたんだよね?"
u "ああ。世界を救うことになっちまった。"
pre "あの頃言ってたホラが、叶っちゃったね。"
u "最近はどうなんだよ?"
pre "どうって……別に。"
u "また悪い男につかまってんじゃないのかよ。"
pre "だったら何?"
u "もうやめろよ、そういうの。"
pre "じゃあ、勇者と一緒に冒険の旅に出ちゃおうかな。"
u "……いいぜ。"
pre "ほんとに? ほんとのほんと?"
u "ああ。"
"僧侶が仲間になった!"

jump trip1

label trip1:
"勇者は仲間と共に魔王討伐の旅に出かけた。"
"行く先々で魔王の配下に苦しめられている町や村を救いながら、進んだ。"
"とある村に泊まった夜のことだった。"

jump shuraba

label shuraba:
if girl_friend == 1:
jump shuraba_imakano
if girl_friend == 2:
jump shuraba_motokano

label shuraba_imakano:
u "何だよ、話って?"
wiz "あのね……アレが、ないの。"
u "何か前の村に忘れ物か?"
wiz "ソレがさ、きちゃったみたいなの。"
u "忘れ物が? 歩いてきたのか?"
wiz "お前の赤ん坊が出来たって言ってんだよ!"
u "えっと……マジか?"
wiz "結婚する? ねえ結婚しちゃう?"
menu:
"はい":
"翌日、勇者と魔法使いは村で小さな式を挙げた。"
"こうして二人は冒険の旅から新婚旅行へとその目的を切り替えた。"
jump ending
"いいえ":
"翌日、勇者の撲殺死体が発見された。"
"犯人は見つかっていないが、王国では既に次の勇者選考が行われているそうだ。"
jump ending

label shuraba_motokano:
u "あれ? 僧侶どこ行ったんだ?"
"勇者が宿の外に出てみると、そこでは僧侶と宿屋の息子が抱き合っていた。"
u "おい! 何してんだ!"
pre "あ、勇者。ごめん……。"
u "ごめんじゃなくて何か言えよ。"
inn "彼女は悪くない。オレが、宿屋を継がずにいれば……。"
pre "彼と、付き合ってたの……。"
u "ごめんじゃなくて何か言えよ。"
inn "……。"
pre "……。"
u "何なんだよ! これじゃ俺が悪者じゃないか!"
"宿屋の息子をぶち殺しますか?"
menu:
"はい":
"宿屋の息子は意外と強かった。"
"敗れた勇者は一人寂しく、傷心の旅へと出かけたが、"
"勇者のその後を知る者は誰もいない。"
jump ending
"いいえ":
"翌朝、勇者はひっそりと村を出て行った。"
"僧侶と宿屋の息子の毒殺死体が見つかったが、その犯人はまだ見つかっていない。"
jump ending

label ending:
"一方その頃、魔王の城では……"
M "勇者君まだ来ないの? もう待ちくたびれちゃったよお。"
"魔王はそのあまりの退屈さに一億と三千二百六十四回目の欠伸をかみ殺した。"

"END"
return



「とまあ、ざっと解説してきましたが、文章表示に関しては他にも文字の色を変えたり、文章の間に画像を挟んだり、文字の大きさを変えたり、ルビをふったり……と、様々な機能があります」

「ですが、そういった細々とした装飾はまたずうーっと後日になってから説明します」

「まずは基本を押さえておきましょう」

「基礎が身につけば、そこから応用したり発展させたりするのは、独学でどんどん勉強していけます」

「まあ基礎より応用の方がずっと面白いのは学校の勉強を考えてみれば分かると思うのですが」

「何とか飽きないように基礎が押さえられて、尚且つ、最低限度の機能を備えたビジュアルノベルを製作出来るように、最終的にはなれるよう、ここではやっていくつもりなので」

「ぼちぼちついてきて下さい」

「てか、一緒に勉強していきましょう」

「ではまた本編にて〜」




「の補講 第6.5回」
「第6回 -俺の鼓動が聴こえるか?-」
「の補講 第5.5回」
「第5回 -君に会いに行く-」
「第4回 -魔女の誘惑-」
「の補講 第3.5回」
「第3回 -出会いと別れ-」
「の補講 第2.5回」
「第2回 -そんな話は聞いてない-」
「の補講 第1.5回」
「第1回 -魔王現る-」
「第0回 -1人の敗者-」
PR

コメント

コメントを書く

お名前:
タイトル:
文字色:
メールアドレス:
URL:
コメント:
パスワード:   Vodafone絵文字 i-mode絵文字 Ezweb絵文字

カレンダー

04 2024/05 06
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

プロフィール

HN:
NAGI Tsukasa WORKS
性別:
男性
職業:
不詳
趣味:
小説、妄想、読書、音楽、(料理)

フリーエリア

カテゴリー

最新記事

最新CM

リンク

最新TB

バーコード

RSS

ブログ内検索

アーカイブ