yaneuraoGameScript2000で行こう! |
written by やねうらお
1.プログラマへの道は一日にしてならずぢゃ
なんか、まわりの友達が次々と結婚しはじめ、高校時代の友人には、5歳になる娘がいたりします。俺もそんな歳になってしもたんかー。おおー。嫁さん欲しいなぁ…。いい人いたら紹介してよ!とその友達に言ったところ、彼の娘が、やねうらおにメールしてきました。きっと彼の差し金なんでしょう。
みさきは しょうらい ふ゜ろグラマ に なりたいて゛す みさきも グラマ に なれままますか おんなは なれないですか |
なんじゃこりゃ!!一瞬、メール爆弾かと思ったゾ(笑)
しかも、「グラマになれままますか」って、どういう意味やねん!?(笑)
とりあえず同じような調子で返信しておきました。(以下のです)
♀プログラマわ 料り の こんだて お かんがえなくてわ ならないので プログラムに 集ちう 出来ないのデス だから ♀わ グラマに 向いていないかも!? |
その後も、彼の娘と低レベルなメールバトル(泥んこの手を相手のほっぺたになすりつけるような泥遊びを彷彿とさせる)を繰り返したのですが、本当のところ、女性プログラマさんも今後どかーんと増えて欲しいなーと切実に願ったりしておりまする。
そんなこんなで、今回のこの講座は、プレゼンに挑戦する!です。yaneuraoGameScript2000って、名前にGameって付いてるから、ゲームにしか使えないと思われている節があります。確かにGameに向いていますが、本当は、お手軽に(C言語風の記述で)CGを表示したり、音楽を再生したり、そういう使いかたも出来ると思うんです。
そこで、今回は簡単なCG集を作ってみたいと思います。こういうことも出来るんだよってことで。そもそも、市販のゲームっていうのは、ゲームの画面だけではなく、CG回想や、音楽モード、ハイスコア表示、データのLoad/Save画面などと、肝心のゲーム画面以外のものも多数あります。そういうのを作る練習だと考えてください。
また、「ビジュアルノベルを作りたいんですが、どうすればいいんですか?」という質問メールも結構来ています。アクションとかより、ノベル系とかのほうが需要が多いのかも知れませんね。偶然にも、やねうらおは、いま実は、WAFFLE制作・販売『蒼き大地』(今春発売予定)のプログラムをやっています。そんなわけで、次回は、この『蒼き大地』の制作ノウハウなんかを紹介したいと思っています。今回は、そのためのステップだと考えてください。
『蒼き大地』のゲーム画面。こいつら、かなり可愛いです^^
背景は残念ながら、まだ出来てません^^;
2.インポートライブラリを使用する
さて、今回の素材は、プロのグラフィッカーとして活躍しておられる、みずさわひろさんに頼んでCGをいくつか提供していただきました。将来有望なグラフィッカーだけに、将来、このCGが凄いプレミアになるかも知れません(笑)
まず、yaneuraoGameScript2000(以下ygs2k)を用意します。最新版はこれです。使いかたは、前回までの講座で習得済みですよね?もし、今回がはじめて、という方は私のホームページのほうに前号までの記事を公開していますので、そちらも参考にしてください。
今回は、インポートライブラリというのを使います。最新版はこれです。これは何かというと、ygs2k本体だけでは足りない部分の拡張を行なうためのものです。どんな機能があるのか確認してみましょう。ygs2k本体と、インポートライブラリを解凍して、ygs2kの実行ファイルをインポートライブラリを解凍したフォルダに移動(あるいはコピー)してください。(下図)
移動させ終わったら、YGS2000.exeを実行してみてください。scriptフォルダには、gamestart.cというファイルは用意していないので、どれを実行するか聞いてくるはずです。scriptフォルダにある、trans_test.cを指定してみましょう。
このような画面になったはずです。何番でもいいのでマウスでクリックしてみましょう。仮に78番を左クリックすると、小さな画像が渦巻き状に現れて、また消えて行ったはずです。面白い画面効果ですが、これは何なのでしょうか?(他のもクリックして試してみてください)
3.トランジションについて考える
実行したときに画面中央にPhaseと書かれている数字に着目してください。
このPhase(フェーズ:段階)は、0から徐々に増加して、256になり(256になったときにCGは完成して)、また減少して0に戻っていくという動作を繰り返しています。
シーン(画面)切り替えのときに、前のシーンを残しつつ、何らかのエフェクト(画面効果)を伴って段階的に次のシーンに移ることから、このようなものをトランジションと呼ぶことがあります。ygs2kのインポートライブラリで採用しているトランジションは、種類を指定し、そのフェーズ(移行する段階)を0〜256の間で指定します。256ならば、完全に移行しきったという意味になります。
実際にプログラムを組んでみましょう。(インポートライブラリの使いかたについては、さきほどインポートライブラリを解凍したフォルダにあるmanualフォルダに説明ファイルが入っていますので、そちらも参考にしてください)
さきほど、インポートライブラリを解凍したフォルダにYGS2000.exeを移動(コピー)してきたと思いますが、そのフォルダにtest.cというファイルを作り、次のように入力してみましょう。
import "trans" void main(){ LoadBitmap("grp/sample2.jpg",0,1); BltTrans(0,0,0,78,128); loop halt; } |
YGS2000.exeを実行すると(前回、終了させていなければ、いったん終了させて再度実行します)、どのスクリプトを実行するのか聞いてきますので、今回は、このtest.cというファイルを指定してやります。
こう表示されましたか?察しのいい人ならば、これで、何となく使いかたはわかったかも知れませんね。
そうです。インポートライブラリを使うには、まず一行目に
import "trans" |
と書きます。これが凄く重要です。これを書くだけで、インポートライブラリのトランジションライブラリ(libフォルダに入っているtrans.dll)が自動的に呼び出され、このトランジションライブラリで用意されている関数がすべて使えるようになるのです。それぞれの関数の使いかたについては、このインポートライブラリのマニュアルを見ていただくとして、ここで使っているBltTransについて簡単に解説しておきましょう。
BltTrans(0,0,0,78,128); |
ひとつ目の0は、表示するプレーンの番号です。その直前で0番のプレーンにLoadBitmapでグラフィックを読み込んでいるので、ここで指定しているのは0番です。二つ目と三つの0は、表示される座標です。これをいろいろ変更して、YGS2000.exeを実行してみてください。表示される位置が変わったでしょう?次の78というのは、トランジションの種類を表す番号で、さきほどトランジションのサンプルで表示されていた番号と一致します。そして、最後の128という数字は、トランジションのPhaseを表すものです。ここで指定しているのは128ですから、半分ぐらい完成しているCGが表示されます。
もう少し動きのあるものを書いてみましょう。
import "trans" void main(){ int i; LoadBitmap("grp/sample2.jpg",0,0); loop { for(i=0;i<=256;i++){ ClearSecondary(); // 画面を消す BltTrans(0,0,0,78,i); // トランジション描画 halt; // 画面を描画 } } } |
前回までの講座を読んできた人なら難しくないですね。トランジションのPhaseを0から256に徐々に増やし、256に達したら、また最初から…という繰り返しですね。これだけのプログラムで果たしてうまく動くのでしょうか?
実行してみると、画像が正しく変化していくのがわかりますね。トランジションの種類や座標を変えていろいろ試してみてください。
しかし、表示されるのが遅くないですか?Phaseを1ずつ増やしているところらへんに問題がありそうです。ここを1ずつではなく、16ずつ増やすようにすれば16倍速く表示されます。(i++を、i=i+16に変更すればOKです)
4.CG集を作ってみる
お友達のみずさわひろさんがCGを提供してくれたので、さっそく、これを使ってCG集を作ってみましょう。見たことのない関数とかも出てくると思いますが、難しく考える必要はありません。丹念にスクリプトマニュアルとインポートライブラリのマニュアルを調べてみましょう。(テキストエディタならば、たいてい検索機能があると思うので、わからない関数が出てきたら検索してみると良いです)
まず、お宝の(笑)CGは、これです。これを解凍して、さきほどインポートライブラリを解凍したフォルダにコピー(移動)させましょう。
そんなわけで、さくっとプログラムしてみましょう。私が30分ほどで書いたのが、これです。例によって、さきほどインポートライブラリを解凍したフォルダにコピーして実行してみてください。マウスで選択すれば、CGがトランジション効果とともに現れますね。たったこれだけのプログラムで、こんなにおいしいのです(笑) これだから、ygs2kはたまりませんね(笑)
では、このプログラムの難しそうな部分を簡単に解説しましょう。
void mouse_init(){ LoadBitmap("grp/cursor.bmp",10,0); SetColorKeyPos(10,5,0); // マウスを使うときはマウスカーソルを必要とする MouseLayerOn(10,0,0); } |
ここでは、マウスのセットアップをしています。マウス処理(マウス入力等)を行なうためには、マウスレイヤーというのを準備しなくてはなりません。と言っても難しいことはありません。マウスカーソルのグラフィックをプレーンに読み込み(ここでは10番のプレーンに読み込んでいます)、そのあと読み込んだプレーンに対して、上の例のようにMouseLayerOnとしてやれば良いのです。これが難しければ、このプログラムをそのままコピーして使ってもいいわけです。
ここではCGの種類によって、トランジションの種類を変更しています。
// CGの種類によってトランジションの種類を変更してやる alt { case n==0: type = 10; case n==1: type = 78; case n==2: type = 60; case n==3: type = 128; } |
0番のプレーンに読み込まれているCGならば、10番のトランジション、1番のプレーンに読み込まれているCGならば78番のトランジション…という具合です。この番号を変えると、トランジションのタイプが変わることは言うまでもありません。
そのあと、画面にCGを表示しているこの部分
// 意地悪なことにプレーンのサイズは640×480とは限らないので // 画面中央に来るようにセンタリングしてやる必要がある GetPlaneSize(n,&sx,&sy); // (sx,sy)にサイズを取得。 x = (640-sx) /2; // X方向のセンタリング y = (480-sy) /2; // Y方向のセンタリング |
ですが、ここでは画像のセンタリングを行なっています。つまり、画像が中央に来るように調整しています。GetPlaneSizeで、画像サイズを取得できるので、640×480の中心に来るように、調整しています。(なぜ2で割らなければならないかは、考えてみてね) 画面をセンタリングするときのお約束なので、覚えておいてください。
キー入力を行なっているのは、以下の部分ですね。
// キー入力 /* 返し値 0:キー入力なし −1:スペースキー 1〜4:マウスで画面のどの部分かが押された (1左上,2右上,3左下,4右下) */ int KeyCheck(){ int x,y,b; // カーソル位置(x,y)とボタン情報 KeyInput(); if (IsPushSpaceKey()) return -1; // スペースキーが押されたら GetMouseInfo(&x,&y,&b); if (b!=0) { // クリックされたら // 押された部分に応じて、数値を返す if (y<240){ if (x<320) return 1; return 2; } if (x<320) return 3; return 4; } return 0; // キー入力なし } |
スペースキーが押されたら、−1,マウスが押されたら押された場所に応じて1〜4,どちらもなければ0が返ります。マウスのボタンが押されたときに、マウスカーソルのある場所を調べて1〜4の数字を返している部分ですが、このようにだらだら書かなくとも、
return ((x/320) + (y/240)*2)+1; |
このように計算式で済むじゃないかと言われるかも知れません。確かにそうなのですが、マウス座標は、負の値や640以上の値を取ることもあるので(例:ボタンを押したまま、そのままウィンドゥ外にマウスカーソルを持って行った場合)窓の範囲内であるかどうかのチェックが必要となります。そのチェックを行なった上で、このような計算式を使うことは優秀なやりかたで、CG枚数がこの例のように4枚から9枚、16枚と増えたような場合、だらだらif文を書くよりすっきりします。
5.次回予告
とりあえず、CG集のプログラムが完成したところで時間が来てしまいました。しかし、CG集のプログラムも、これで完成形とは思わずに、いろいろ手を加えてみてください。かっこよく音楽とともにカットインしてきて、CGを選択したら効果音が鳴るだとか、サムネイルも、マウスで選択していないときは、一段階トーンを落としたものを表示させて、マウスでセレクトしたときに通常のトーンに戻すだとか、一人前のCG集(のプログラム)になるためには、まだまだ機能追加が必要でしょうから。
次回は、yaneuraoGameScript2000の次期バージョンを紹介できるかも知れません。これは、C++の言語機能を取り入れた高性能なものです。現在作っている最中なのですが、グラフィックエフェクトについても格段に向上しているので、あんなこととか、こんなこととか、こんなこも出来るようになる予定です。私もいまから完成を楽しみにしてます…って俺が作るのか(笑)
ではまた次回お会いしましょう。