同人ゲーム制作を語らうゆっくりとしたメディア |
すろ〜ふ〜ど HowTo企画 『吉里吉里いったっきり 』 |
さていよいよ最終回「ゲームを完成させてみよう」です。 どうにか素材を用意し、システムを組み上げるところまで来ました。 今までの挑戦をふまえ、きちんとゲームの形にできるのでしょうか?! |
ぐはぁあ! 上げましたぞ! 立ち絵とイベントCG!! |
その間にこっちは背景素材とか音楽・効果音素材を揃えましたぞー。 ちなみに今回は素材提供サイト様と、すろふのHowTo企画「なんちゃってCG講座」の「イメージ背景の作り方」も参考にさせてもらいましたよ。 何と立体的な企画なんでしょう! とセリフ棒読みで、ではさっそく本編に組み込んでいきましょうか!! |
ちょいとその前に絵を表示させてみてくださいよー。 折角がんばって描いたんだし。 |
もう仕方ないなあ。 よいしょ、よいしょ……ん? |
どうしたんですか? |
どうせなら、メッセージ表示はいつもうちで作っている作品と同じようなウィンドウ型にしたいんですけど〜。 なんかその方が落ち着くし。 |
ええと、ちょっと待ってくださいよっと……おっとこれかな? [layopt]ってタグで色々変更できるみたいデスヨ? |
[layopt]でもいいんですけど、Config.tjsでも設定できるようなのでそっちでやりたいなあ。 あちこちのサイトで吉里吉里講座を見たら、そうしているところが多かったみたいだし。 えーと、Config.tjsの521行目付近をいじるんですね。……っと、なんだぁこりゃあ! |
// ◆ 初期位置 // これらは、position タグのそれぞれ left top width height の属性に対応しま // す。 ;ml = 16; // 左端位置 ;mt = 16; // 上端位置 ;mw = 640-32; // 幅 ;mh = 480-32; // 高さ |
mlだのmtだの、何のことだかさっぱりわからん!! きぃー! |
うーん。これはつまりアレですね。 まずこの上から三番目の「mw」ってのはメッセージレイヤ自体の幅ですね。 んで、四番目の「mh」が高さです。 つまり、例えばmw=500でmh=200にすれば、500ピクセル×200ピクセルのメッセージレイヤが作成されますよって意味です。 |
つまり500×200のでかバナーみたいな画像を作ったという解釈でいいんですかね? |
うーん、なんかちょっと違うような気もするけど、まぁそんな感じでとらえてくれればよいかと。 で、その「500×200ピクセルのでかバナー」をゲーム画面の中に表示させるワケですが、設定項目一番目の「ml」と二番目の「mt」ってのはその「でかバナー」を表示させる位置って事じゃないっすかねこれ。 |
位置といってもこれじゃなんだかわからないっす。 |
とりあえず図を参照です。 |
例えば「ml」が16「mt」が300とすると、左上を(0,0)とした、ゲーム画面の座標(16,300)の位置に、さっきの「400×200のでかバナー」画像の左上の点がかさなるように表示されるって事なのですよ。 |
んー、図で言うとmlの方向に16ピクセル、mtの方向に300ピクセルの位置に、メッセージレイヤの左上端が来る、と。 |
ですです。 さて、モノは試しにこの設定で起動してみますか。 |
ふむ……ん、なんかイメージと大きさが違うからいじくろうっと。 ……んん!? メッセージレイヤって、一行あたりの文字数の設定項目ないんですかね? 調べては見たけどそれっぽい記事は見つからない……。 うちではいつも、一行何文字って決まっているので、それに慣れているから従いたいんですけど。 |
うーん。無いみたいですねぇ…… |
しょうがない、マージンだの文字の大きさだので調整するしかないかな? もしくはスクリプトを打ちながら改行・禁則具合を確認していくしかなさそう。 まあこれも慣れですかね〜。 では、今回は以下のようなサイズでやっていきます。 |
// ◆ 初期位置 // これらは、position タグのそれぞれ left top width height の属性に対応しま // す。 ;ml = 16; // 左端位置 ;mt = 300; // 上端位置 ;mw = 608; // 幅 ;mh = 170; // 高さ |
うーん。ですねぇ。 何かよさげなツールを知ってる人は教えてくださいねって事で。 |
では、絵の組み込みをしていきますかね。 この立ち絵はここに入れて、背景はこれにして、今度は違う絵を表示して……うがー! 一枚の絵を表示したりするたびに、何行もあるタグをいちいち、入力するのは面倒くさいですよー! |
むむ? なんかマクロなんていう便利機能があるみたいですよ? ええと、どれどれ? |
ふんふんふん(チュートリアル参照中)……まあ要するに、よく使うタグを省略形で呼び出せるようにセットしておくというような感じですね。 |
ですねー。 タグの省略だけじゃなくて、複数行に渡るスクリプトをまとめてひとつのマクロにしたり、またそのタグに数値や文字列を渡す事も出来るみたいですな。 |
[macro name=(タグの名前)] [(マクロで呼び出して使いたいタグを)] [(入力します)] [endmacro] |
細かいところはリファレンスを見ていただくとして、今回はこんな感じでいくつかのマクロを作りました。
これでかなり楽になりますね。 |
;背景表示 [macro name=bgchg] [backlay] [image storage=%cg layer=base page=back] [trans method=crossfade time=700] [wt] [endmacro] ;立ち絵表示 [macro name=chron] [backlay] [image layer=0 page=back storage=%cg visible=true] [trans method=crossfade time=700][wt] [endmacro] ;立ち絵を消す [macro name=chrkill] [backlay] [layopt layer=0 page=back visible=false] [trans method=crossfade time=700][wt] [endmacro] ;全部をフェードアウト [macro name=f_out] [backlay] [image storage="black" layer=base page=back] [layopt layer=0 page=back visible=false] [trans method=crossfade time=700] [wt] [endmacro] ;背景を一瞬で変える [macro name=bgchg_2] [image storage="%cg" page=fore layer=base] [endmacro] ;立ち絵を一瞬で変える [macro name=chron_2] [image layer=0 page=fore storage="%cg" visible=true left=0 top=0] [endmacro] ;立ち絵を一瞬で消す [macro name=chrkill_2] [layopt layer=0 page=fore visible=false] [endmacro] |
おおう! すごいですね。 何か新しいタグが出来たみたいなかんじだ! |
っと、ところでこの [image storage="%cg" page=fore layer=base] ってやつなんかの「%cg」ってのはなんなんですかい? |
マクロを使うことによってタグは省略できても、表示するCGのファイル名は省略できないですよね。 マクロの中で image storage=○○(ファイル名)って指定しちゃうと、CGの枚数分マクロを作らなきゃいけないことになっちゃって面倒だし。 そこでこの呪文です。%を頭につけた言葉を指定しておいて、 |
例: [macro name=bgchg] [backlay] [image storage=%cg layer=base page=back] [trans method=crossfade time=700] [wt] [endmacro] |
実際にスクリプト中でそのマクロを呼び出すときは |
[bgchg cg=blue.jpg](拡張子は省略してOKです) |
という風に書いて %cgに当てはまる値を指定してやります。 そうすると |
[macro name=bgchg] [backlay] [image storage=blue.jpg layer=base page=back] [trans method=crossfade time=700] [wt] [endmacro] |
このようにタグを書いたのだと同じように解釈されます。 %cgはこの場合blue.jpgが代入されたことになって、背景にきちんとblue.jpgが表示されるのです。 |
ほうほうなるほど。 これは便利ですな! ではこのマクロを使ってサクサクスクリプトを組んで行きましょうぞ!! |
ではまず、このmp3ファイルでBGMが鳴るかどうかを……あー! 音が鳴らないです! そういえば以前の挑戦でBGMを鳴らしたときはwavファイルを使ったっけ……どうしよ。 |
うーん。どうやらmp3は著作権とかゴニョゴニョな事情でNGみたいですねー。 どうやらOGGが使えるみたいなんで、そっちにしてみてはいかがでしょう? |
そうですねえ、その方が無難かな。 ではoggファイルに変換して、今度こそタグを書いて……あーん、今度も聞こえないっ、なぜー! がたんがたん(スピーカーを揺すってる) |
本当だ!! よーし、四十五度の角度で伝家の宝刀空手チョップで叩けば!! アチョー!! |
やめぇい! 真剣白羽取り骨折アタック! ……えーとプラグインを使えば解決するんだ、なるほど♪ |
まずはfirst.ksのどこかに、 |
[loadplugin module=wuvorbis.dll] |
と、書いてから、プラグインのコピーをします。 吉里吉里/KAGフォルダ→kirikiri2フォルダ→pluginフォルダに、 wuvorbis.dllというフォルダがありますので、 |
そのファイルを、krkr.eXeがあるフォルダか、krkr.eXeがあるフォルダより下の階層のpluginフォルダ、もしくはプロジェクトフォルダに入れます。 すると……あー、ちゃんと聞こえます。 |
おおー。では次は効果音ですな! ではこの夏海さんが苦労して集めた効果音も一気にOGGに変換です!! しかも後腐れ無いように元ファイルは同時に削除!! |
余計なことすんな! ハートブレイクショット! 以前の挑戦でチュートリアル読んだでしょう、「効果音はWave(PCM)系である必要があります」って! |
ぐはっ!(俺の時間が止まった!!) |
では、バシバシとシナリオにタグを入れていきましょう! バシバシ! |
バシバシ入れてるのはわたしなんですけどねえ。ぶつぶつ…… 選択肢で分岐させたいところが出てきたんですけど、選択肢ってどうやるんでしたっけ? |
えーと、チュートリアルに「選択肢を使おう」って項目がありますよ? |
あー、ホントだー。 なるほど、htmlの<A HREF="url">リンク</A >みたいなものですね。 [link storage="リンク先のファイル名" target=*ラベル名]選択肢[endlink][r] [s] ↑この[s]というタグで選択肢がクリックされるのを待つ状態にします。 リンク先が、選択肢を書いたファイルと同じファイルの中ならば、こうなりますね。 |
などと思いつつ僕は、脱衣所の中を……[r] [link target=*nozoku]1.覗いてみる[endlink][r] [link target=*nozokanai]2.覗かない[endlink][r] [s] |
「1.覗いてみる」をクリックすれば、このシナリオファイルの中のラベル「*nozoku」にジャンプします。 リンク先が選択肢を書いたファイルとは別のファイルにリンクする場合。 |
僕は……[r] [link storage="2.ks" target=*02_1]1.思わず声を上げた。[endlink][r] [link storage="2-2.ks" target=*10_1]2.思わず目を背けた。[endlink][r] [s] |
これだったら、「1.思わず声を上げた。」はリンク先が2.ksというファイルで、さらにその中のラベル*02_1にジャンプする、と。 |
なるほどなるほど。 うーん。これは簡単ですねー。 例えばこれをhtmlにすると…… |
僕は……<BR> <A HREF="2.html">1.思わず声を上げた。</A ><BR> <A HREF="2-2.html">2.思わず目を背けた。</A ><BR> |
こういう普段使い慣れてるhtmlにたとえてみると、何か親近感がわきますねえ。 |
ですねー。 じゃあついでに条件分岐もやりますかね。 |
ほいほい。ええとこれはCGモードの時にやった、「cond」が役に立ちそうですね。 選択肢の片方で「f.」ではじまる変数(ゲーム変数、栞のセーブとロードとともにセーブ・ロードされる)のフラグを立てて、で、立ってたら(数値が「1」だったら)こっち、立ってなかったら(数値が「0」だったら)あっちと[jump]タグで別々のラベルに飛ばせばいいんじゃないでしょうかね。 |
では、まずフラグを立てるところから。 さっきの選択肢次第で、のちに条件分岐することにしましょう。 |
などと思いつつ僕は、脱衣所の中を……[r] [link target=*nozoku]1.覗いてみる[endlink][r] [link target=*nozokanai]2.覗かない[endlink][r] [s] |
で、「1.覗いてみる」を選択したシナリオに行った場合はフラグ「sukebe」が立って、「2.覗かない」を選んだシナリオに行った場合はなんのフラグも立てない。 シナリオの先の方で、フラグ「sukebe」が立っていたら、ある場面でのイベントCGを「ev03_02」にし、フラグが立っていなければ「ev03_01」を表示することにしますので、シナリオはこんな感じ。 「1.覗いてみる」を選択する場合、ジャンプ先のラベル*nozokuのところで |
*nozoku [eval exp="f.sukebe = 1"] なんたらかんたら(←シナリオ本文です) ………… …… |
前回の挑戦でも使った[eval exp="f.変数(フラグ)名 = (代入する値)"]を使って、変数「sukebe」に「1」を代入します。 そして安全のため? 「2.覗かない」を選択したときは、ジャンプ先のラベル*nozokanaiのところで |
*nozokanai [eval exp="f.sukebe = 0"] なんたらかんたら(←シナリオ本文です) ………… …… |
そして、イベントCGを表示させるため、条件判断をする箇所で |
なんたらかんたら……(←シナリオ本文です) [jump target="*05_57" cond="f.sukebe==0"] [jump target="*jaji" cond="f.sukebe==1"] |
変数「sukebe」が「0(ゼロ)」だったらラベル「*05_57」にジャンプ。 変数「sukebe」が「1」だったら、ラベル「*jaji」にジャンプ。 ラベル*05_57では、CG「ev03_01.jpg」を表示するので以下のようになります。 |
*05_57 [bgchg cg="ev03_01"] なんたらかんたら…… |
そしてラベル*jajiでは |
*jaji [bgchg cg="ev03_02"] どうとかこうとか…… |
こうして、選択肢次第で条件分岐して、表示するCGを変えるということができました! |
ふむふむ。 これでフラグによってシナリオを変える条件分岐も出来た事ですし…… あとは一気呵成に最後までタグを入れまくりましょうぞ!! |
チッ。 タグうちするのはわたしなんですけどねえっ! |
(そんなこんなで数時間) できたあっ! |
ここまで長い道のりであった。 こうして我々はレッツ吉里吉里チャレンジを最後までやりとげることができたのである。 だが、 オレはようやくのぼりはじめたばかりだからな! このはてしなく遠い吉里吉里坂をよ…… 未か……(ゲフッ!) |
勝手に登らないでください! てか古いなあ。 ……今テストプレイしてセーブしてみたんですけど、セーブした箇所よりもずっとずっとずーっと前のところに戻ってしまってパニクってるんですから! こわれてしまったのかなあっ?! |
あれ? 知らなかったんですか? 何か吉里吉里/KAG3ってどこでも自由にセーブができるわけじゃないみたいですよ。 ラベル使って1ページづつセーブポイントを記述しなきゃいけないんですよ? |
なんでそれを先に言わないだ! もうー、最初の方からラベル入れていかなきゃ…… セーブポイントとなるラベルの書き方は、 *(ラベル名)|(セーブ箇所の名前。この名前が栞に記録されます) セーブした箇所から一番最近に通過したセーブ箇所で、栞に記録されます。 たとえば、このような感じでラベルが書かれている箇所があったとして、 |
なんたらかんたら〜(本文) *01_1|セーブポイント1 どうのこうの〜(本文) *02_1|セーブポイント2 なんとかかんとか。 あーしてこうしてそうなって。 ……。 ←ここでセーブしたとします |
上記の場所でセーブ(栞をはさむ)した場合、次回にロードすると、*02_1|セーブポイント2 の位置から読み込まれることになります。 セーブした行で読み込まれることにはならないのでご注意。 |
あと、ラベルの名前「*01_1」って部分のラベル名は、重複してはいけない決まりになってるのでご注意を。 「|」のあとの「セーブ箇所の名前」は重複しててもかまいません。 |
うーあー、これでとにかく完成!! やっったあ! |
オレはようやくのぼりはじめたばかりだからな! このはてしなく遠い吉里吉里ざ……あ、あれぇ? そっか、差分分のCGがあるからCGモードも少し書き直さないと! そこらへんはちょっとややこしい話になっちゃうので直にソースを見てくださいね! |
前回と同じように、アーカイブ化した実行ファイルの他に、ソースファイルも置いておきますのでそちらをご参照くださいませ〜。 |
今回やってみて、吉里吉里/KAG3は、とても簡単にノベルゲームを作る事ができるって事がわかりました。 しかも、物足りなければ自分で色々手を入れてある程度まで作り変える事も出来るし。 まぁこういう事はおそらく何十何百回とウェブ上で語られてきた事なんでしょうけど、今回実際にやってみてそれが実感できました。 あと悩むより、とにかくまず用意されているチュートリアルをじっくり読んで、更に実際に自分でソースを書いてみて実行してみる事。 エラーを恐れずドンドン書いて、ドンドン実行してみる事がとても重要だなぁと思いました。 |
わたしはプログラムだのなんだのはサッパリなんですが、チュートリアルを見ながらでも結構形になるものですねえ。 ある程度の機能はデフォルトで揃っているので、そこまで難しいことはしなくてもいいですし、逆に細かいところまでカスタマイズできるみたいなので、自分なりに面白カスタムをしてみるのも楽しそうですねえ。 |
あとまだまだ、吉里吉里/KAG3には今回では紹介しきれなかった色々なタグがあるので、チュートリアルのタグリファレンスを見て「あれが出来る」「これが出来る」と想像を膨らませていくともっともっと吉里吉里/KAG3の理解が深まるんじゃないかなと思います。 |
有志の方が作ったプラグインも各種あるようですし、試してみるのも面白そうですね。 うーん、それにしても、短編とはいえ3ヶ月ぐらいでゲームを作れるものなんですねえ。 |
そうですね。 って事で…… ああ、蛇足なんですけど、そういや今回作ったゲームの内容には何も触れてなかったですね。 |
前からやってみたかった、ロメロに捧げるゾンビモノです。 あと「28日後…」とか、小野不由美先生の「屍鬼」とかいろいろ。 ついでに「東京ゾンビ」も……。 ソース共々、ゲームの方も楽しんでいただけたら(できればご感想など聞かせていただけたら)うれしいです!!! |
記事の方はおちゃらけてますけど、ゲームの方は割と真面目に作ったので……っていうかここまでちゃんとしたのを作る意味ってあったんでしょうか? なんか作ってしまった後で言うのも何なんですが…… |
てなわけで、次の作品でお会いしましょ〜!! ばいばーいばいばーい! |
Days+172 シリアルコーン(ZIP形式33.1 MB (34,800,718 バイト) 解凍後36.4 MB (38,220,810 バイト)) ソースファイル(ZIP形式 12.8MB 解凍後 14.2MB) 今回の挑戦にて完成させた短編「Days+172 シリアルコーン」です。 内容の簡単な紹介ページ(グリーンティミルク。のサイト内)はこちら。 素材提供サイト様(敬称略・順不同) 背景素材 背景写真補完の会 こぶたのすあな+ゲーム用写真素材 とも&ゆりGAMEZONE RUTA 音楽 SENTIVE モーツァルト REQUIEM KV626より「II.KYRIE」(この曲のみ、自作音源) 効果音 WEB WAVE LIB こうちゃのじかん サウンドアベニュー ザ・マッチメイカァズ SOUND LIBRARY フリー効果音のページ 「ソースファイル」は今回スクリプトを組んだシナリオファイル等が入っていますので、今回の挑戦記事と合わせてどうぞ。 |
そんなこんなで、いったっきりコンビもようやくゲームを完成させることができました。 この挑戦を読まれた皆さまも、ぜひ吉里吉里/KAGを用いたゲーム作りに挑戦してみてください! では! |