YaneuraoGameScript2001でビジュアルノベルプログラミング

初心者歓迎!プロのゲームプログラマによる、×××ツクールでは物足りない人のためのゲーム制作入門!

written by やねうらお
やねうらおのホームページ


 §1.真打ビジュアルノベルエディション!登場!

みなさん、お元気でしたかー。ygs2kでゲームの開発に勤しんでますかー(笑)
今回は、そんなみなさんに、とっておきのクリスマスプレゼント(?)があります!

ついに完成したんですよ!!構想3年、制作1日(たった1日かよヽ(`Д´)ノ)の超大作!!
ビジュアルノベル専用yaneuraoGameScript2000 for Visual Novel Edition略して、yaneuraoGameScript2001が!1]

 1 略になっていません。しかも、最後の数字、勝手に2000から2001になってますし..^^;
あまり細かいことは、気にせず ygs2001とお呼びください(笑)



ビジュアルノベル専用とは言うものの、半透明処理が以前のバージョンに比較すると、何倍もの速さになっている点、そして、加色合成・減色合成2]と言った、いま流行りの(?)エフェクトも、バリバリ速い!ときたもんだ。

 2  加色合成とは、色同士の足し算をするエフェクト。PhotoShopで言えば、ソフトライトや覆い焼きがそれに近い。光の表現をするのに適している。
 減色合成とは、色同士の引き算をするエフェクト。PhotoShopで言えば、除外がそれに該当する。



ということは、いままで速度面から、ゲームでの使用は不可能だと思っていたような画面効果も可能になるわけで、いままで以上の使いかたが出来るかも知れない..できないかも知れない。(なんで、そんな弱気やねんヽ(`Д´)ノ)

それは、ともかく、何より、簡単なビジュアルノベルを作るだけなら、プログラムをたった数行書くだけ!これは、もう、ビジュアルノベルツクールと言っても過言では無いです。しかも、タダで使い放題、同人使用、商用使用OKと来たもんだ。

これは、もう、南極にいるやねうらおのほうに足を向けて眠れませんね。(注意:やねうらおは、南極には住んでません)

簡単操作だけど、プログラムだから、汎用性がある。だから、実際の用途の限定はされない。アクションゲーム(ミニゲーム)の混じったあなただけのノベルゲームが作れちゃう。いたぶりおしゃぶり..もとり、至れり尽せりな、このゲームスクリプト、使わない手は無いってもんですよ!

 §2.便利な機能

それでは、さっそく、使っていくことにしましょう。これを右クリックして、「対象をファイルに保存」してください。

いつも通り、ygs2001の実行ファイルが存在するフォルダにscriptというフォルダを作成し、そのフォルダのなかに、gamestart.cという名前のテキストファイルを作成し、そこにプログラムを書いていけばokです。

というか、事前にすでにサンプル(gamestart.c)が用意してあるので、それを自分の使用用途に合わせていじっていくことになります。

基本的な使いかたは、ygs2kのときと同じなので、今回から読まれている方は、私のホームページのほうから以前の記事を閲覧することが出来ますので、そちらをご覧くださいね。

それでは、追加した機能のうち、便利そうな機能を順番に解説していきます。


デバッグウィンドゥ

まず、デバッグ作業をしていると、欲しくなるのが、変数の値の表示や、「そこまで本当に実行しているのか」などという情報が知りたくなります。通常、ファイルに変数の状態を書き出したりして、それを検証するんですが、さすがに毎回それをやるのは面倒くさいです。
そこで、簡単に別ウィンドゥにその情報を表示する機能を持たせました。これをデバッグウィンドゥと呼びます。
実際の使いかたは、非常に簡単で、
Dbg("やっほー");
のように、スクリプトのプログラム中で、Dbg(文字列)と、表示したい文字を書いてやれば、それが表示されます。また、この書式は、sprintfの書式と同じなので、変数の値を表示したい場合は、
void main(){
  int n;
  n = 5;

  Dbg("変数nの値は %d です",n);

  loop halt;
  // ↑これを入れておかないとプログラムがこのまま終了してしまうので
}
というように書けば、「変数nの値は 5 です」とデバッグウィンドゥに表示されます。

マウスレイヤー

DirectDrawを使ったプログラムでは、ウィンドゥのなかにマウスカーソルを置いたときに、マウスカーソルがちらついて見えません。そこで、ソフトウェアでマウスカーソルを描画してやる必要があります。ygs2kのときは、マウスレイヤと言って、これを管理する命令を用意していましたが、ygs2001のほうでは、標準でサポートすることに変更しました。
必要な準備は、実行ファイルの存在するフォルダにgrpという名前のフォルダを作成し、cursor.bmpという、カーソルの素材を置いておきます。そうすれば、ygs2001を実行したときに、自動的にその素材が読み込まれ、カーソルが表示されるということになります。特に問題が無い限り、用意しておいたほうが良いでしょう。なお、ygs2001に添付されているカーソル素材は、私が描いたもので、自由に流用していただいて構いません。
問題は、カーソルはhalt(描画命令)の時点で、描画しているので、画面更新をせずにhaltだけを繰り返して行なうと、画面上にマウスカーソルがいっぱい表示されることになります。よって、
  画面の更新 ⇒ halt ⇒ 画面の更新 ⇒ halt
というように、画面の更新とhaltを交互に繰り返すようなコーディングスタイル(プログラムの書き方)を推奨します。

αチャンネル付きサーフェース

αチャンネル付きサーフェースからの転送もサポートしています。
αチャンネル付きサーフェースとは、α値を持ったサーフェース(プレーン)です。α値とは、ブレンドするときの比率のことです。なぜこんなものが必要になるのでしょうか?
たとえば、ノベルで、立ち絵を表示したとします。背景との境界にぎざぎざが目立ちます。3]
 3 このぎざぎざのことを、ジャギ(jaggy)と呼びます。普通は、これを目立たなくするために、手作業で黒で縁取りしたり、輪郭の色の一段階暗い色(?)で縁取りしたり(色トレス)します。ただし、これは結構、面倒な作業です。



PhotoShopをお使いのかたには不透明度、と言えばわかっていただけるでしょうか。不透明情報を持っているのです。αの値は、0〜255の間で指定します。たとえば、αが0のときは0%,255のときは100%のブレンドをされながら転送されます。
もっと、ありていに言えば、PhotoShopで作成した画像が、そのまま使えるのです。(いったん変換作業は必要ですが)
具体的な方法、ツールは、これを見てください。これを用いて、yga4という拡張子のファイルを作成します。
 4 ygaというのは、Yaneurao Graphic format with Alpha channelの略です。何?かっこ悪い?(笑)



ygs2001では、このyga画像の表示をサポートしているのです。普通のbmpやjpgファイルを表示する要領で、表示が出来ます。
void main(){
  LoadBitmap("chara.yga",0); // yga画像の読み込み
  Blt(0,100,100); // 普通のBltで転送できてしまう!

  loop halt;
  // ↑これを入れておかないとプログラムがこのまま終了してしまうので
}
というように書けば、yga画像が表示できてしまう、とそういうことです。yga画像を読み込みが決定した時点で、内部的にαチャンネル付きサーフェースが作成されます。そして、あとはBltで普通に転送するだけで、自然に転送が出来てしまうと、そういうことです。
もちろん、αチャンネルの転送なので、通常の画像転送より若干遅いです。あまり多用すると、かなりスピード落ちするとは思いますが、許せない速度では無いと思います。
余談ではありますが、αチャンネル付きであれば、どうして、ジャギが消えるのでしょうか?ジャギが目立つのは、境界で急激に色が変化することが原因です。そこで、境界においては、背景と、そのキャラクターの輪郭との中間の色を表示すれば良いということになります。先に述べた色トレスは、まさにこれを手作業で実践しようというものですが、αチャンネル付きであれば、この部分、あまり悩まなくともできます。この中間の色という部分は、α値を50%というようにしておけば、その部分は半透明になるからです。
一応、気になる人のために、この、αブレンディングの計算式を掲載しておきます。実際に使うのに、ここまで理解している必要は無いので、あくまで参考、ということで。わからない人も気にしないでください。
転送先の色 = 転送元の色 × α + 転送先の色 ×(1−α)
となります。αが100%ならば、転送元の色がそのまま転送先の色になり、αが0%ならば、転送先の色がそのまま転送先の色になります。αが50%ならば、転送先の色は、転送元の色と転送先の色とを半分ずつ混ぜた色になります。これが、αブレンディングの原理です。このブレンドするためのα値を、それぞれのピクセルが情報として持っている、というのがαチャンネル付きサーフェースというわけです。

さまざまな転送モード

最近流行りなのは、加色合成や減色合成です。加色合成というのは、技術的に言えば、RGB(赤・緑・青)の各値を加算して、上限を超えたら上限に戻すような処理です。たとえば、RGBをそれぞれ256段階、すなわち0〜255の範囲で現されるとしたら、
r = r1 + r2 ; if (r>255) r = 255;
g = g1 + g2; if (g>255) g = 255;
b = b1 + b2; if (b>255) b = 255;
というようになります。このほうに、255で飽和させる(それ以上にはしない)ので、この加算のことを飽和加算5]というようにも呼びます。
 5 ほんわかさんって聞こえますね(笑) なんだか、ほんわかしそうです^^;
飽和加算の逆で、0以下になれば0で飽和させる引き算を、飽和減算と呼びます。減色合成とは、この計算によって表現されています。



まあ、そんな原理的なことはどうでも良いとして、加色合成は、PS2などのゲームでも、いま、大流行しています。近年、ハードウェアで加色合成をサポートしているビデオカードが増えたこともあるのだと思います。何より、光の表現として、通常の半透明(αブレンド)より美しく見えるからなのだと思います。
ygs2001のほうでは、これをソフト的に実装していますので、お世辞にも超高速とは言えませんが、それでもリアルタイムのアクションゲームで使えないことは無いスピードになっていると思います。
前置きが長くなりましたが、とにかく使いかたのほう、説明します。使いかたは、いたって簡単で、転送の前に
SetBltMode(転送モード , ブレンド比率);
と、転送モードと、ブレンド比率を指定してやります。転送モードは、
0:通常転送
1:ブレンド転送
2:抜き色有効ブレンド転送
3:加色合成
4:抜き色付き加色合成
5:減色合成
6:抜き色付き減色合成
の7種類、ブレンド比率としては、ブレンド比率を0〜255で指定します。0ならば、0%を意味し、何も転送されず、255ならば、100%を意味し、完全に転送されます。128ならば50%を意味し、転送先と転送元をブレンドしながらの転送となります。初期状態では、転送モードは0になっており、このときはブレンド比率は関係ありません。
また、SetBltModeで一度描画モードを変更した場合、次に再度設定するまで、その状態は維持されます。この、描画モードが反映するのは、以下の転送においてです。
Blt,BltRect,ClipBlt,ClipBltRect
BltR,BltRectR,ClipBltR,ClipBltRectR
つまり、通常の等倍の転送以外に、拡大・縮小転送等においても、上記の7種類の転送モードを指定することが出来ることを意味します。
たとえば、加色合成を行なうプログラムならば、
void main(){
 LoadBitmap("script/276.jpg",0);
 LoadBitmap("script/113b.jpg",1);

 loop {
  ClearSecondary();
  Blt(0,0,0);
  SetBltMode(3,255); // 加色合成モードに
  Blt(1,0,0);
  SetBltMode(0,0); // 通常の描画モードに戻す
  halt;
 }
}
のようにすればOKです。また、α付きサーフェースに対しても加色合成が出来ます。また、たとえば、SetBltMode(3,128)のようにすれば、転送元の50%(のRGB値≒明るさ)だけが、加色合成されます。定数倍加色合成と呼ばれるような効果ですが、いろいろ使えそうです。
あと、以上に伴い、以前ygs2kで存在していた、ブレンド系の描画命令(BlendBlt等)はすべて廃止しました。だもんで、以前のスクリプトで動かないものがあれば、ごめんなさい。もし、以前のプログラムが動かなくてお困りの方は、BlendBlt関数を用意して、上のように、SetBltModeして、Bltを行ない、転送が終わったら、SetBltMode(0,0);と通常の転送モードに戻す処理を書いておけば、良いだけですが..

圧縮書庫に対応!

ygs2001で作ったゲームで、ゲームに使用する画像ファイルが多いのでまとめて圧縮をかけておきたいなんて人には、yanePackExがいいかも知れません。詳しいことは、添付されているマニュアルのほうを読んでください。ygs2001は、yanePackExに完全対応しています。
 §3.シナリオ描画機能
さて、今回のメイン機能は、シナリオ描画機能です。これは、かなり強力な機能で、これを利用すればプログラムはほとんど書かずして、本格的なノベルゲームが作れてしまいます。ノベルゲームのプログラマの商売あがったりになります(笑)
というか、プログラムは、すでにサンプルとして用意されているので、さきほどのygs2001本体を、そのまま実行すれば、何やらノベルらしき画面6]が出てくることと思います。まずは、それを試してみてください。
 6 これは、来年の春に発売しようと、ひそかに自社開発に励んでいる、お笑い系シューティングゲーム「宅配天使SisterAngel」のノベル画面です。よかったら買ってやってくださいませ^^;

              



ということで、どうやら、今回解説しようと思っていたノベルのプログラムは、すでに完成しているようです。とりあえず、このscriptフォルダに入っているgamestart.cを読んでみることにしましょう。
void main(){

 // シナリオレイヤーを設置
 ScenarioLayerOn();

 // シナリオの読み込み
 ScenarioLoad("grp/kari/scenario01.html");

 // シナリオの早送りボタンを有効にする
 // ScenarioEnableSkip(1);

 loop {
  // キーとマウスの入力は、こちらで行なう
  KeyInput(); MouseInput();

  // シナリオの描画
  if (ScenarioOnDraw()!=0) break;
  halt;
 }

 // シナリオレイヤーを除去
 ScenarioLayerOff();
}
シナリオレイヤーというものが存在するわけです。最初に、ScenarioLayerOnとして、シナリオ画面をいまから使いますよ、という宣言をします。この宣言の段階で、素材やら何やらが読み込まれるわけです。そのあと、シナリオファイルを読みます。それが、ScenarioLoadです。あとは、見ての通り、ScenarioOnDrawを呼び出しつづけて、非0が返ってきたら、終了するようなプログラムにしておけば良いのです。7]
 7 今回は、ほとんど全自動でシナリオ画面が表示できてしまうため、あまり解説することが無くて困ります(笑)

ところで、スキップボタン(早送りボタン)は、初期状態では使えません。これは、一度読んだシーンを2度目以降に早送りを行なうためのもので、上のプログラムでは、コメントアウトしてある、ScenarioEnableSkip(1);というようにすれば、早送りボタンが有効になります。ここを1ではなく0にすれば、また無効になります。再度変更するまで、この設定は生きます。
              



それでは、このシナリオファイルというのは、どんな書式で書くのでしょうか?拡張子がhtmlとなっていることからもわかるかも知れませんが、このファイルはhtml風に書けます。(実際に、grp/kari/scenario01.htmlをテキストファイルで開いてみてください) htmlファイルを自分で書いたことがある方は、ぱっと見て、だいたいの意味がわかると思いますが、ほとんどはhtmlファイルと同じタグで、立ちキャラの表示や、ネームプレートの表示、BG(背景)の表示等だけが、特別なタグが用意されているという感じです。実際、このファイルをhtmlブラウザで見ることも出来ますし、htmlエディタ(例:ホームページ・ビルダーなど)で編集することも出来ます。

シナリオファイルで使用する全タグ一覧

全タグ一覧は、こちらに載せておきます。これで、自分でもこの書式に従って、シナリオを書いていくことが出来るというわけです。実際、このフォーマットに基づいて、Waffle発売の『蒼き大地』『麻雀遊戯』等を作ったので、それなりに市販ソフトとしても耐え得る仕様になっていると思います。
ところで、SE(効果音)や、立ちキャラ等は、番号で指定していますが、これ自体はどこで設定すれば良いのでしょうか?
少しygs2001の本体があるフォルダのgrpフォルダのなかのscenarioフォルダを覗いてみてください。
b1.yga
b1d.yga
b2.yga
b2d.yga
b3.yga
b3d.yga
window.yga
nextline.yga
bg_define.txt
bgm_define.txt
button_define.txt
face_define.txt
gaiji_define.txt
layout_define.txt
name_define.txt
sc_define.txt
se_define.txt
巻き戻しボタン(通常時)
巻き戻しボタン(押し下げ時)
窓消しボタン(通常時)
窓消しボタン(押し下げ時)
早送りボタン(通常時)
早送りボタン(早送り時)
表示枠
入力プロンプト
BG定義ファイル
BGM定義ファイル
ボタン定義ファイル
フェイスマーク定義ファイル
外字定義ファイル
レイアウト定義ファイル
ネームプレート定義ファイル
立ちキャラ定義ファイル
SE定義ファイル
以上のファイルがあると思います。拡張子がygaとなっているのは、前述した、α情報付きの画像ファイルで、これらはボタンの画像、そして、表示枠、それから、キーボードを押すことを促進するマーク(入力プロンプト)です。
それ以外の、〜define.txtとなっているのは、定義ファイルで、SEならば、一番目のSEはどのファイルであるのか、というように、順番に書いておけば、シナリオファイル中で<SEPLAY 3>というようにSEを再生しなさいと指定されたときに、ここに書いてある3番目のファイル(0番から始まっているので、厳密には4番目のファイル)が再生されるわけです。
つまり、これらは、ご自分のノベルに合わせてカスタマイズして使います。8] ボタン素材は、流用していただいても構いませんが、私が、30分ほどでいじったものなので、あまり出来がよく無いです。なるべくならば、そのゲームの雰囲気に合った素材に差し替えていただければ、と思います。
 8 上のファイルのうち、gaiji_define.txt(外字ファイル)だけは、少し書式が難解です。説明するのが非常にややこしいですし、麻雀牌を表示したかったので適当に作ったような機能ですんで(笑)、とりあえず、ノンサポートとさせてください。書式は、yaneSDK2ndで使用しているスプライトキャラと同じなので、もし興味のある人は、調べてみると良いでしょう。             



上のファイルのうち、一番重要なファイルは、layout_define.txtです。このファイルは、画面のレイアウトを指定します。すなわち、メッセージ表示ウィンドゥはどの座標にあって、どれだけの大きさなのかだとか、文字の大きさはいくらで表示するのだとか、そういったことを指定します。(一度、テキストエディタで開いてみてください)
ygs2001で、シナリオレイヤをオンにした(ScenarioLayerOn)とき、このgrp/scenario/layout_define.txtが自動的に読み込まれて、そして、ここに書かれている設定情報に従って、初期化を行なっています。


..ということで、今回は、あまり解説することが無いのですが(ビジュアルノベル表示プログラムは最初から完成していますし)、そんなに難しいものではないので、以上の説明で十分使えると思います。
 §4.まとめ
新しくなった、ygs2001はいかがでしたでしょうか。まだ作りたてなので、いろいろ不備があるかも知れませんが、私のホームページのほうでウキウキサポートしてますので、よろしくお願いします。ご意見、ご希望などもお待ちしております。
実のことを言うと、通常の描画のみならば、以前のバージョン(ygs2k)のほうが速いです。しかし、半透明や加色合成を用いた描画となると、ygs2001のほうに軍配があがります。いまどきのゲームならば、半透明なんて当たり前ですしね^^;
あと、インポートライブラリは従来通り使えますが、一部、描画に密着した部分(トランジションライブラリとスプライトライブラリ)が使えないはずなので、なんとかしたいと考えております..。
次回は、RPG等で必須になるマップ描画について解説します。それでは、みなさん、またお会いしましょう〜。

ページデザイン協力:さ〜