yaneurao Game SDK 講座ついに開講!

 

§1.まずは入門編(99/9/7)

あいやー。ついに書き始めちゃったあるよ。いや、なんかインチキ中国人風だなぁ。いかにも、大阪駅周辺で変造テレカ売ってそうだ。かと言って、「講座の説明を始めるにょ」なんて脳みそとろけてそうな文体で書く気になれないし(そんなんどうでもいいから、早く書けって)

さて。yaneuraoGameSDKは、ダウンロードしてくれた?付いてたマニュアルは熟読してくれたかな?実際、あのマニュアルだけを頼りに、ゲームデザイナーの人がスクリプトを活用してゲームを作ったのよ。ゲームのタイトルは『盗撮マニア act1.テレビ局』です。9月23日発売。εLoginで攻略が来月から連載になるのよ。面白そうだったら、買ってね。

宣伝はそんくらいにしてやねぇ、ゲームデザイナーの人は別にプログラマに関してはほとんど素人なわけで、その人がサクっとゲームを作れとるっちゅーことは、あのマニュアルだけで十分だって言う証明にもなってるんでないかなーと思うのよ。

そんなわけで、あのマニュアルだけで作られへんかったら、何かおかしいのよ。あのマニュアルだけで何をどうやっていいのかさっぱりわからん!とゆー人はやねぇ、「プログラミングは初心者なもんで」なんて見苦しい言い訳をせずに、謙虚に自分の理解力のなさを反省したほうがいいんでないかなー。(余計なお世話?)

だから、ここで何もかもを説明する気はないし、そもそもそんな説明は出来ないわけなのよ。最低限度の道筋だけを示すから、あとは実際に自分でやってみなちゃいと。それが一番なんだってば!でも、世の中、上には上がいるように、下には下がいらっしゃるわけで、昔の人は言いました。上見て暮らすな下見て暮らせと。(それ全然、意味ちゃうやんか…)

まあ第一回から飛ばすのもなんだし、何から手をつけて良いかわからない人のために、ちょっととっかかりを説明します。

まず、スクリプトは、C言語風です。かなりC言語に似せてあります。出てくる用語もC言語のものがほとんどです。ポインタはやらしいので、ほとんど使用しなくても良いような設計になっていますが、それでも要所要所で、知っていないと困るかも知れません。そんなわけで、ホントのホントの初心者は、まずC言語の入門書を立ち読みしてくること!添付してあるマニュアルからだけで、理解することも可能だと思いますが、C言語について勉強しておくことが近道だと思います。そんなわけで、どのC言語の入門書にも書いてあるような内容はここで、解説しませんから、行き詰まったらC言語の入門書を読んでください。

それでは、さっそく使ってみましょう。

実行ファイル(ygs2000.exe)の存在するフォルダに、scriptというフォルダを作成し、gamestart.cというテキストファイルを作成します。このとき、フォルダ名、ファイル名は半角にしておいてくださいね。初歩的なことですが、全角で入力しちゃう人がときどきいらっしゃいますので。

void main(){
TextLayerOn(0,100,200);
TextOut(0,"我、2000年の眠りより蘇り、再びこの世に君臨せん。");
loop halt;
}

まあ、プログラムは何でも良いです。マニュアルについてるサンプルでも構わないのですが、マニュアルに付いているサンプルは、ビットマップファイルやサウンドファイルを要求するものがあるので、とりあえず、上の赤字のプログラムをそのまま入力してみましょう。そして、ygs2000.exeを実行します。どうですか?うまく表示されましたか?うまくいかなかった人は、エラー内容がファイルに出力されているはずですので、それを見て入力ミスを修正しましょう。「script/gamemain.cが無い」というメッセージが出てきた人は、ファイル名がおかしいので、よく確認しましょう。よく初心者の人にありがちなのは、Windowsの設定で「登録されている拡張子は表示しない」に設定されている方です。その状態でgamemain.cというファイルを作っても、それは実際にはgamemain.c.txtだったり、gamemain.c.docだったりするので気をつけましょう。(どうやってこの設定を変更するのかって?スタートメニュー→ヘルプ→キーワード→「拡張子」で調べるか、Windowsの入門書を読んでください)

コンパイルエラーが出たという人は、タイプミスをしていないか確認しましょう。

script/gamestart.c(1) : ファイルスコープに意味不明の文字が...

とエラーが書いてあったなら、script/gamestart.cというファイルの1行目がエラーになっているということです。タイプミスしていないかよく確認しましょう。今回の場合ならば、たとえば、mainのあとは、ゼロではなくて( )括弧になっているかとか、そういうことです。

さて、これで、入門編は終わり。(早すぎ) いよいよ、実践編に入っていきますが、その前にお手紙を紹介して今回はおしまいにしましょう。


はじめてメールをださせてもらいます。
ackyと申します。

プログラマの駆け出しで、ウインドウズのプログラムに興味はあるの
ですが、なかなか手がだせないへぼい♂です。
そんなときにやねうらおさんのGAMEScript2000を見てシューティングを
作ってみようかなと思ってダウンロードさせてもらいました。
まずは動作スピードにはびっくりしました。
速い!もーこれでゲーム1個作っちゃおうと決心してしまいました。


ackyさんから、こんなメールをいただきましたが、実際のところスクリプトonlyでシューティングが作れるものなのか、私には自信がありません。まず第一に速度面。確かに、VB5.0よりか速いとは思うのですが、それでシューティングが作れるものなのか。あと、データ構造の面。やはり、ある程度の複雑なデータ構造を扱うだけの機能を備えていないということです。(クラス化できましぇん。構造体ありましぇん。配列弱いです。変数タイプLONGしかありましぇん等々…)

まあ、作って作れなくはないでしょうけれど…。ちなみに、『盗撮マニア』のほうでは、マップ表示関数・警備員の移動設定関数等をさらにスクリプト側に追加しています。つまり、そのゲーム専用に特化された関数は一切含まない、標準的な命令や関数のみのバージョンをyaneGameScript2000として一般公開しているわけで、本当に速度が必要な部分や、複雑なデータ構造を扱いたい部分は、VisualC++側で書くことを前提として考えているからです。その追加が出来るように、ソースもすべて公開しているわけですが、さすがに初心者の人にVisualC++で書きなさいというのは、無茶というものでしょう。そんなわけで、ここでは、VisualC++を使ったプログラミングについては一切書きません。そのへんについて興味のある方は、「スーパープログラマーへの道」をご覧ください。

とりあえず、次回からは、30分間プログラミングです。毎回、30分を目処に毎回、簡単なサンプル(あるいはゲーム)をひとつずつ作っていくことにします。それでは、乞う!ご期待!

講座でとりあげて欲しい内容があれば、いまのうちにどうぞ。高度な内容から、超高度な内容まで何でもお答えしますんで(って、それじゃ高度な内容しかないじゃん…) うそうそ。初歩的な質問もお待ちしています。


§2.そして文字を表示する(99/9/8)

一番、メールで質問の多いのが文字表示についてなのよねー。なんでyaneSDKのときも多かったけど、スクリプトのほうは、また一段と多いんですよ。ゲームなんだから、文字表示なんかしないで、キャラクターだけ表示してなさい!とも言えないし(笑)、Windowsは文字フォントは環境依存になるので、漢字フォントぐらいすべて自分で用意しなさい!とも言えないし(笑)

この部分、スクリプトでも一番いやらしい部分、メモリ管理についてお話しないといけないので、あまり話したくないんです。しかし、どうもメールを見ているとビットマップ表示や、サウンド再生は、サンプルを見て案外簡単に作れるのに、文字表示関連になってくると苦戦してらっしゃる方が多いので、そのへん避けて通るわけにはいかないようで。

まず、文字関連ではstr型というのがあります。スクリプトのほうで、実は型チェック等は一切していません。よって、strと書いても、実体は、longと同じく4バイトの変数です。内部的には、区別すらしていません。ということは、単純に考えると、

str text;
text = "ABCDEF";

なんてことは、出来ないはずじゃないですか?「そんなことぐらい出来なきゃ困るよー!」って声も聞こえてきそうですが、確かに出来ます。出来るのですが、これが何故できるのか?そこが大切です。そのメモリは誰がいつ確保したものなのか?確保してもいないメモリに書き込んだり、そこから出力したりすれば即、メモリエラーが出ます。そのへん非常にシビアです。余談ですが、メモリエラーで悩まされたときは、

TextLayerOn(0,0,0);
TextOut(0,"ここまでは実行されている");
halt;

ってなコードを挿入して、どこまでは実行されているのか、エラーの原因はどこにあるのかを特定させることにしましょう。

さて、この文字列の代入が、なぜ出来てしまうのかをよく考えておかないことには、あとで泣きを見ますね。この部分の実装は、C言語と同じなのですが、どうも、その事情に疎い人が多いので、あえて説明しないといけないようです。あまり親切な説明はしませんから、わからなければ是非、C言語の入門書をご覧になってください。もちろん、「文字表示なんてしないよー!」だとか、「そんな複雑なことまで、いまはまだいいよー」って方々には、最終回まで眠っていただくことにして(このネタ2回目やがな…)、とにかく先に進みましょう。

実は、このときtextは、"ABCDEF"へのポインタとなっているわけです。つまり、格納されているアドレスが入っているってわけです。格納先は、どこかと言うと、これがコードエリアです。これは、わからなくても構いませんが、コードエリアは、ファイルのコンパイル時に、そのサイズが決定され、動的に(=実行時に)確保されます。(プリコンパイルによって、サイズを確定させる。つまり、実は2回コンパイルしている!これを2パスコンパイラだと言うと聞こえは良いが、単なる手抜きという話もある)

つまり、コードエリアは、命令エリア+データエリアから構成されており、このデータエリアにサイズ固定で格納しているわけです。よって、固定文字列は、そのアドレスへのポインタであって、

str text1,text2;
text1 = "ABC";
text2 = "DEF";
text1 = text1 + text2;

なんてやっても、格納されているアドレス同士が加算されるだけであって、文字列の連結が出来るわけではないのです。また、初期状態で変数は不定というC言語の掟を頑なに守っているので、

str text;
sprintf1(text,"Text"); // テキスト出力のつもり

なんてやっても、textの指すアドレス(不定)に、文字を転送しようとして、メモリエラー(実行時のエラー)になるというのは、もうお分かりでしょう。固定文字列ではなく、動的に(=実行時に)文字列を格納する必要があるのならば、それを格納する領域をあらかじめ確保しなくてはならないのです。あらかじめ確保する、という部分がわからなければ、あらかじめ一定の大きさを確保してあるstringという配列を使えば良いわけです。(このへんはマニュアルに書いてあるサンプルを見れば十分でしょう) しかし、もっと別の方でメモリを確保する方法も考えられます。動的に確保する方法と、静的に確保する方法です。これについては、次回説明します。

30分間プログラミングは、今回は、勘弁してください。30分では出来なかったので(笑)


§3.だからメモリに泣かされる(99/9/11)

実は、前回、30分間プログラミングで簡単なスロットマシーンを作っていたのですが、作ってる最中に、「んなもん使えっか!」と自分のスクリプトの仕様にキレてしまい、突如、スクリプトの機能拡張を始めてしまったわけであります。会社に行きながらホームページを更新しながらと、ながら作業なので、ろくに時間は確保できなくて、いまも拡張中です。とりあえず、スクリプトの機能拡張が終わったら、30分間クラッキングもとい、30分間プログラミングを開始しますんで、皆々様、よろしゅうに…。

今回は、動的に確保されたメモリと静的に確保されたメモリとの違いについてです。動的という意味がわからなければ、「スクリプトのmain関数を実行以降に」、静的は、「スクリプトのmain関数を実行以前に」と読み替えていただいてかまいません。

まず、変数は、使う前に宣言しなくてはなりません。これは、C言語とかと同じですね。関数の外(ファイルスコープ)で、宣言された変数は、グローバル変数です。グローバル変数は、静的に確保されます。前回もちらっと言いましたが、静的に確保される変数のために必要なメモリは、スクリプトを読み込んだときに必要な分を計算して、1バイトの無駄もなく、ぴったんこで確保しています。そこで、静的に確保する変数の大きさに制限等はありません。強いて言えば、ユーザーメモリの範囲内ということでしょう。実際、1MBや2MBのグローバル配列も使い放題であります。

ところが、関数のなかで宣言する変数(ローカル変数)は動的に確保されます。このとき、変数宣言は、関数の先頭部分でしか宣言できません。C言語(C++ではなく)もそうなっていたはずなので、殊更珍しくはないでしょう。これは、パフォーマンスを向上させるため、あるいは単なる手抜きです。変数宣言のごとにスタックポインタ動かすのが手間で、変数の最適化が甘いと、頻繁にスタックポインタを操作しないといけないことになるからです。

まあ、そんな事情はどうだっていいのですが、この動的に確保される変数というのは、具体的にどこに確保されるのでしょうか?これは、スタック領域に確保されます。スタックが何であるのか、なぜそんなことをしないといけないのかについては説明しません。意地悪しているわけでもなければ、書くのが面倒だからでもありません。それは、本当に、関数型プログラミングの本質的な部分なので自分で学んで欲しいからです。

とにかくローカル変数は、スタック領域ってところに確保していて、そのサイズはyaneGameScript2000では64K固定なわけです。ということは、longは4バイトなので、ローカル変数long型の配列で16,384(=64K÷4)の大きさのものを宣言したりすれば、確実にメモリオーバーしてしまうわけです。

さて、今回はある女性(?)からのメールを紹介して終わることにしましょう。

いきなりなんですが、Yaneurao GAME Script2000βでゲームを作りたいんですけども
何をしたらいいか分かりません。
そこで、ゲームを作る手順を記したマニュアルを作っていただけないでしょうか。

お気の毒なことに、彼女は、ゲームを作るということについて何か勘違いされているのかも知れません。RGPツクールや、格闘ゲームツクールと同じレベルで考えていては一生作れないでしょう。

では、彼女のような初心者はどうすれば良いのでしょうか?まず、C言語の入門書を読んでプログラムとは何なのか?から、勉強するべきです。それほど専門的な事項は不要です。次に、添付のマニュアルを熟読することです。

英語を読むとき、わからない単語があれば辞書を引きますね。それと同じで、わからない命令があれば、ひとつひとつどういう意味なのか調べます。命令はすべてオンラインマニュアル内にあるわけですから、「検索」コマンドを使って、ひとつひとつ潰していくと良いでしょう。

願わくは、彼女がゲームを作れるようになりますように…。Good Luck!


§4.だから初心者様からお叱りを受ける(99/9/16)

初心者から来るメールは、かなり首を傾げてしまいそうなものが多い。初心者からのお叱りのメールもそうである。たいてい、内容が理不尽である。おまけに、自分が悪いくせして、なぜか僕に腹を立てていたりするのである。「なんで富士山が日本一高い山なんだよ!」だとか、「なんで北海道は恐竜みたいな形してるんだよ!」だとか。(いや、そんな内容じゃないけど…)

やねうらおの場合、首を傾げすぎて首がもげそうになった。アラレちゃんのように脱着式だったら、いまごろ首から上だけ階段の下まで転がったあと、「おはこんばんちわ」「んちゃ!」とか言っていたところだろう。(なんのこっちゃ)

今回は、初心者様からのメールを紹介する。一応、メールの内容は、適宜、変えてあるし、特定個人から来たものでもない。よくある質問とそれに対する回答という風に受け取っていただきたい。

通常描画で60FPS出ているのに、拡大縮小転送を使うと、そこで、7FPSぐらいに
落ち込みます。なんとかしてください。

なんとかしてください言われてもやなぁ(笑) そんなもんは、ハードウェアが拡大縮小に対応してないからDirectDrawさんが勝手にソフトでやって、遅くなってるだけであって、んなことはやねうらおの知ったことではないよー。チンケなビデオカードを作ったハードウェアベンダーにでも文句を言っていただきたい。というか、小学生じゃないんだから、「なんとかしてください」でなく、もっと建設的な意見の出し方をできんのかなー。たとえば、この場合ならば、「事前にビットマップを拡大縮小して別のプレーンに移しておく機能を、用意するというのはどうでしょうか」だとか。いや、そういう機能、追加する気がないではないんだけどね。

浮動小数は使えないのですか?浮動小数が使えないと誤差が出て計算が出来ません。

なんで誤差が出たら計算が出来ひんのや!計算は出来とるっちゅーねん。整数同士だから誤差が出てるだけで(それじゃあかんのか:笑)

ちゅーか、下駄履きしたら(2^n乗掛けといたら)どうなんよ?

                z  =  x/y;

やったらやねぇ、

                z  =  (x << 16)/y;

ってな感じで、2^16倍しとくの。んで、zを使う段階で、>>16して2^16で割ったらええのよ。それとやねぇ、

            z = x/y;    w = z*100;

というように割り算した時点で整数になるんで、こういうのは、割り算をあとまわし

            z = 100*x;  w = z/y;

にすると良いと思うよん。

 初心者の方が、とっつきにくいとの回答。(28/40、経験者含む、友人仲間無作為)>ygs講座

その経験者っちゅーのは、VBちょっと触った経験あり…みたいの人も入るんかなー?少なくとも、添付されてるスクリプトマニュアルは熟読して、自分で実際にトライして、C言語の入門書レベルのことは理解していると受け取ってええんかな?ちゅーかやねぇ、その3つさえ守られてるんなら、もう既にゲームは作れるはずなのよ。作られへんっちゅーのは、どれかが欠けるてるのよ。ここの講座は、確かに初心者のための講座ではあるけど、あのマニュアルに書いてあることを噛み砕いて延々と説明を書くほど、やねうらおも暇ではないんで、あのマニュアルの用語等で不明な点があればC言語の入門書を読むように第一回目で言ってあるやん?

つまり、この講座で行なっていこうとしているのは、その3つを守っている人たちのためのアフターケアなのよ。つまり、スクリプトの新機能の紹介だとか、C言語との差異だとか、DirectXまわりの用語だとか、実践的なゲーム制作方法論だとか、そういったことなのよ。決して、「プログラミングは、何も知りません、ここで何もかも教えてもらえると聞いてやってきましたー」という人たちのために書いているわけではないし(そんな人は、初心者というより、単なる怠け者だからして!)、スクリプトマニュアルに書いていない、技術資料的なことも書いていかないといけないのよ。だからして、最初に右も左もわかってない人がここを見て、「うおーなんじゃこりゃー!!めっちゃ敷居高いやんけー!!」と感じても仕方ないとは思うけど、そこはそのへんの事情を踏まえて読んで欲しいし、何もかもをここから学ぼうなんて思わないで欲しいし、何もトライしようともしない人たち相手に、「ほら、yaneuraoGameScriptを使えば、いままで大変だった便器の汚れがこんなに簡単に!」なんて、機能紹介をする気はないんだから…。(なんで便器の汚れやねん!そんな機能ついてないって>俺)

 マニュアルに載ってないことなので、質問します。
 ビットマップを転送したときに、背景にかぶさってしまうのですが、どうすれば良いのでしょうか。もし、その機能がないのなら、追加してください。

マニュアルに載ってます(笑) 透過キーつき転送がそれで、DirectXの世界ではこういうの転送元透過キー付き転送って呼ぶようです。このへん、わからない用語が出てきたら、DirectXのオンラインマニュアルに検索かけるのもひとつの手かも知れませんね。(しかしやねぇ、ないなら追加してくださいとはまた、横柄な(笑) まあ、こちらの説明不足だったとは思いますが…)

 TScript.hとTScript.cppをいじって自分で関数を追加したのですが、コンパイルしなおしたものを再配布するのは構わないのでしょうか?

構いません。出来れば、コンパイルしなおした旨だけは何らかの形で書いておいてください。(配布元が特定できなくなってしまうので…) ちなみに、yaneGameScriptβ5をコンパイルするには、yaneuraoGameSDKβ2が必要で、いま、大改造中(またかいな)なもんで、今週末ぐらいまで公開できません。あしからず、ご了承ください。

 BMS関連の機能は、いつ追加されるのでしょうか。とても楽しみにしてます。

き、来たー!(笑) 今月末ぐらいから実装開始したいんですけど、3Dサウンド関連とMIDIまわりの処理をやり残しているもんで…どーかなぁ…。まー、目標は、10月上旬!ちゅーことで。

                            ☆         ☆           ☆

ここに登場してもらった、初心者君は基本的にフィクションであり、実在の人物その他とは一切関係ありましぇん。プロを目指している人には、厳しいことを言うこともあるかも知れないけど、謙虚な初心者には静香ちゃんのように優しいやねうらおなので、質問等はお気軽にどうぞ。(誰が静香ちゃんやねん…)


§5.だから開発が停滞する(99/9/30)

先週の26日(日)に、毎年恒例の赤旗将棋大会(地区予選)があって、やねうらおも例年のごとく出席し、なぜかあっさり優勝してしまいました。そんなわけで、 10月末に府大会に出場するので猛特訓。よって、開発はおざなり、 ホームページの更新は、テキトーになること必至でありんす。


ygs2Kβ5で発見されている不都合および、要望と、その対応予定。

◎ 文字フォントが95とNTで異なる → ディフォルトフォントが異なるため、大きな文字にしているとサイズもかなり違ってくるようですね。β6でフォント名を指定できるように拡張する予定です。

◎ 起動パスにドット(.)が含まれているとうまく動かない → β6で修正します。

◎ 位置指定の透過カラーキーを使っている場合、範囲外のチェックをしていない → β6で修正します。

◎ 外部DLLを読み込んで実行する機能が欲しい → β6で追加します。

◎ 外部のDLLを読み込めるということは、VC++以外の開発ツールからでもDLLだけ提供するようなことが出来るということですか?  → そうです。ずいぶん可能性が広がりそうですよね。

◎ CallScript/JumpScriptのエラーハンドラを書きたい → β6で対応します。

◎ フルスクリーンモードでBackupPlaneの動作がおかしいのでは? → β6でみなおします。

◎ セカンダリバッファをシステムメモリに置くとうまく動作しないようです → β6でみなおします。

◎ 拡大・縮小・αブレンド系のbltが遅いのであらかじめ別のプレーンにBltしてしまう手段を提供して欲しい → β6で追加します。

◎ ハイスコアの暗号化書き出し機能が欲しいです → β6で余力があれば対応します。

◎ 配列変数の初期化を列挙できると良いのですが → β6で余力があれば対応します。

◎ ModeX等、640*480以外の画面モードに対応する気はありませんか? → ノートパソコン等、最近はModeX非対応であることが多いので、すみませんが対応させる予定はありません。

◎ 本当にygs2Kは速いのですか?ある人に遅いと聞いたのですが? → そんなこと言ってるのは誰ですか。教えてください。首を絞めに行きますから。(ウソ)

◎ ygk2Kβ6の公開はいつですか?  → 10月4日を予定しています。遅れたらごめんなさい。

◎ 早くyaneuraoGameSDKのβ2を公開してください  → ygs2Kβ6と同時に公開します。

◎ 3DSoundはどうなりましたか?  → フリーウェアで3D EFFECTツールがあったので、それ使えばいいやってな感じで(笑) 対応させるのはやめました。

◎ MIDIファイルから、特定のチャンネルのデータを拾うような機能が欲しいです。無理でしょうか?  → 実は、ピアノ練習ゲーを作る予定でいるので、その機能はDLLで提供します。今月中ぐらいには公開できるのかな?

◎ やねさんのygs2Kのサンプルはまだ出来ないのですか? → すみません。この講座の次の更新までには必ず作っておきます。サンプル自体は、DownLoadのコーナーからいろいろDownLoadできるはずですが。

◎ ygs2Kでゲームを作ったので、リンクさせてください → こちらこそ、紹介させてください。

◎ BMS関連の機能はいつ実装されるんですか? → β7で実装します。リリース予定としては10月中旬ぐらいになりそうです。

◎ バイト単位でメモリーにアクセスする機能が欲しいのですが  → これ、確かにあるといいですよね(笑) BYTE型をサポートするかどうかわかりませんが。

◎ FileIOはこれ以上拡張されないのですか?  → 当然、BMS関連の機能追加のときに拡張します。いまのままで良いはずがありません。どのような形で追加するかはわかりません。DLL形式で提供するかも知れません。

◎ Sin、Cos関数が欲しいのですが。  → 他の言語でSin、Cosテーブルを作成して、まるまるLoadFileで読み込む手もありそうですが…ひょっとすると、このへんの機能はDLL形式で提供するかも知れません。

◎ 文字列関連操作もっといろいろ欲しいのですが。  → この手の拡張は、DLL形式で提供するかも知れません。これ以上、基本関数を増やすのは本意ではないのです。また、DLLファイルの作成ならば、私でなくとも、誰かがやってくれるかも知れませんし…。

◎ サンプルをいろいろDownLoadしていると、ゲームが増えてきました。ここいらで、ランチャーのようなもので起動するゲームを選択する機能が欲しいです  → あったらいいなとは思っていますが、作るかどうかはわかりません。私も、すごく欲しいのですが(笑)

◎ yaneuraoGameSDKのβ2はVisualC++5.0でコンパイルできるのですか? → 出来るようにする予定です。ソース大幅変更中です。


ygs2Kの関連リンクも増えてきたしバグもずいぶん減ったので、最初のころに比較するとずいぶんとっつきやすいはずです。まだ「誰にでもゲームが手軽にできちゃう!」にはほど遠い気もしますが、今後とも熱烈サポート(笑)していきますんで、頑張ってついてきてください。


§6.だからDLLからexportする(99/10/9)

私が初心者向きのygs2K講座としてお勧めするのは、Downloadコーナーからリンクを張らせていただいている、ロバートさんのページです。非常にわかりやすいです。私も、初歩的な内容をこれくらいわかりやすく解説できたらいいなーと思うんですけど、ばぶばぶーとこの世に生まれ落ちたときから、xor ax,axなどとアセンブリ言語でしゃべっていたもんで、初心者様が何にお困りなのかてんで見当がつきません。(冗談です)

えーっと。今回は、β6でサポートしたDLLの呼び出しについて語ってみたいと思います。技術的な内容なので、初心者にはちょっと辛いかも知れませんが、ひとつのトピックとして気楽に読んでください。

DLLについては、ある人からこんな意見をメールでもらいました。一応、彼はプログラミング未経験者ではありません。(初心者には違わないですが)

個人的にはDLL、好きではなかったり。

結構容量的、ファイル的にぼこすか増えて収拾つかなくなるかも。というか、無意味にDLLを呼び出しされて訳判らない(既にYGSがもぬけのから的)

ソースが氾濫するのが嫌。オープンソースの意味が薄れて、スクリプトのありがたみ(他人のを見て勉強する)が阻害されると思う。

ただ、気軽に拡張できるのは確かだし、便利だし、楽かもだし…

DLLのような外部ライブラリをimportしないで、このような小さなプログラミング言語(ygs2Kのことね)が自己の閉塞性を補う方法があるのでしょうか?これがまず私の第一の疑問です。

外部のライブラリとのコネクションの確立は、別にDLLのimportでなくとも、ActiveX(≒OLE2)でも、構いませんし、もっと独自の方法を提供しても良いかも知れません。あるいは、ygs2K自体にユーザー関数を追加できることは、スーパープログラマへの道第6C回 弟子失踪(奈落の果て) 99/8/22で書いている通りなので、そういうのもアリでしょう。

手段は、確かにさまざまです。しかし、どの方法をとったとしても、彼の指摘する「ソースの氾濫」「他人のソースで勉強する」「DLLを呼び出されて訳がわからない」「YGSがもぬけのから的」という問題を回避することは出来ないでしょう。(少なくとも私には想像も及びません)

彼はDLLの欠陥(あるいは自分のDLLに対して持っている印象)を語っているだけで、他の方法と比較して善し悪しを言っているわけでもなく、まして代替的な案を提起しようとしているわけでもなく、予測トラブルを自己の印象を交えて書いているのかも知れません。要するに「やねさん、アンタ、何もわかっちゃいないようだけど(あるいは、わかっちゃいると思うけど)、DLLにゃー気をつけたほうがいいよ」と。

まあ彼の言わんとしていることは理解できます。おそらく彼の描く理想とは、ygs2Kに可能な限り関数を追加し、言語として“完全”なものにしていくことだと思います。その理念の背景には、ひょっとするとポータビリティの問題があるのかも知れません。つまり、ygs2Kをそのまま他のプラットフォームに移植したとき、ソースレベルのコンパチビリテイが確保できると、そう言いたいのかも知れません。それはそれでひとつの考えかたです。

しかし、(これは、パラダイムレベルの話になるので、安易に結論を出すのは避けたいのですが)プログラミング言語というのは、それ自身の言語セットのなかにライブラリの仕様を含めるべきではないというのが私の考えかたです。つまり、プログラミング言語は彼の言葉を借りて言うならば、限りなくもぬけの殻であるべきです。逆に、ライブラリはプラットフォームを越えた共通仕様が存在すべきです。(例:OpenGL) そうしておけば、自分でプログラミング言語を実装したとき、煩雑なライブラリまで実装する必要がありませんし、逆にライブラリが共通なので、プログラミング言語ごとのライブラリの差異に戸惑うこともありません。容易に他者のプログラミング言語を利用することができます。

まあ、いま、そんな理想についてどうこう言っても仕方ありません。そんなスケールの大きな話でもないかも知れません。なにしろygs2Kの場合、変数も32ビット整数型しかないので、関数をexport/importすると言っても自ずと限界があります。そもそも、ygs2K側のインターフェースがActiveXとか何らかの方法で公開されていない限りは、ユーザー側のDLLからではグラフィック表示を行なうことすら出来ないからです。そして、グラフィック関連、サウンド関連で、すでにygs2Kが内部的に提供している関数にべったり依存しているわけで、Javaのようにimportしているわけでもなく、もぬけの殻にはほど遠い状態になっているからです。

ということは、ユーザー側のDLLの活用方法としては、Sin,Cos関数の提供程度の補助的使用に限られてくるかも知れません。そう。たいしたものではないのです。補助的手段として、お気軽極楽に使ってください。

そんなわけで、「ygs2Kにこういう機能が不足してるんで、こんなDLL作ってみましたー」という方、おられましたらぜひメールください。こちらからリンクを紹介させていただきますので。


§7.だからFontに悩まされる(99/10/14)

思想とか、理念とか眠たいこと言ってんじゃないぜ!てやんでい!プログラムにそんなんいらんのや!オイラが欲してるんは、なんでβ6から文字表示がおかしゅうなってしもたんかっちゅーこっちゃ。てやんでい!ちなみに、てやんでい!というのは挨拶みたいなものだぜ、てやんでい!悪気はないんだぜ、てやんでい!

Mr.江戸っ子

β5までは、フォントに関してはディフォルトフォントで特にフォント名を指定していませんでした。てやんでい!

そうするとWindowsNTでは、MSゴシックが指定したのと同じ状態になっていたようですが、Windows95/98では、幅の狭いフォント(標準ゴシック?)が選択されていたようで、その表示のされ方に差異があったわけです。そこで、今回からは、MSゴシックをディフォルトで指定するようにしました。これで、95/98とNTとで同じような文字表示がされるようになったというわけです。てやんでい!

しかし、その結果、日本語環境でないとうまく表示されないなんてこともあるかも知れません。(もともとUNICODEは非対応なので、まー、いいかなーといまのところ考えています。将来的にUNICODEに対応させる予定はありますが、そうなってくると、やはり海外版WindowsにはMS 明朝なんてありませんから、文字フォントの食い違いが発生するわけです。世界各国、どのWindowsででも同じように表示されるようにするためには、ビットマップを使って文字を用意するしか無いわけですね。ついでに言えば、いまのところUNICODEはWindowsNTでしか使えないので現段階でUNICODE専用にしてしまうのは、時期尚早かと思っています) てやんでい!

Mr.江戸っ子さん、こんな説明でよろしいで良いでしょうか。てやんでい!(挨拶)

おたくが、追加するゆうとった機能、まだついとらんやんけ。これがつけられへんのやったら、トイチの利子分だけでも払ろてもらわんとあかんなぁ。それか、次バージョンで追加予定の機能を教えてくれるかや。あんたが生き残る道は、ふたつにひとつでっせー!

ミナミの鬼。萬田銀次郎

私はミナミの鬼から借金した覚えはありませんが(笑)、このメールに限らず、最近、ygs2kのバージョンアップに関するメールが多く、ひとつひとつメールで回答するのが面倒になってきたため次バージョンで追加予定の機能リストをまず紹介しておくことにします。

次バージョンでの対応予定(の数はやる気の度合い:p)

☆☆☆ 低レベルファイルI/O → 書き出し/読み込み
☆☆☆ 文字列操作のための関数 → 文字列の途中から取り出す/文字を数値化する等
☆☆☆ マウス入力 → マウスの座標入力/ソフトウェアマウスカーソル
☆☆☆ プレーン拡張 → プレーンの回転blt機能,Secondaryプレーンを任意のプレーンと入れ換る機能
☆☆☆  / * %等をひとつの式のなかで連続使用すると計算を誤るbug-fix。(例 x = 12/3/2;)
☆☆  
関数追加 → 三角関数sin,cos
☆   ハイスコア暗号化書出し機能
☆   構造体

とりあえず、次のバージョンは来週頭ぐらいまでにアップできるといいなーとか。(単なる希望です。遅れても怒んないでね) ミナミの鬼、萬田はん。こんなもんでよろしおまっか?

☆ その他、いろいろ

確か、β5以降ではlong以外にintと書けるとようにしました。内容はlongと同じなのですが、普段あまり使わないlongと書くのがなんとなく気持ち悪いという人、intと書いて気分を変えてみてはいかがでしょうか(笑)

それから、β6では配列の初期化子を記述できるようにしました。int x[3] = { 1,2,3 }; みたいな感じで、たらたら書けます。これ、結構要望多かったので、追加しましたので使ってみてください。(ただしグローバル変数のみ)

あと、構造体、これ実装しようか迷っているのですが、一応、次バージョンの努力目標として掲げておきます。難しくはないのですが、結構、実装は面倒なのです。多分、実装してもしばらくはバグバグでしょうけれど。(笑)

マウスは案外要望多かったので驚いています。DirectDrawを使用しているんで、ソフトウェアでマウスカーソルを描画しないとカーソルがちらつくんです。ゲームなんで、マウスなんていらねーやーと思っていたら、「マウスはきっと対応されていると思うのですが、その関数が見当たりません」だとかメール言われて、すんませーんってな感じだったので(笑)

それから、yaneuraoGameSDKβ2のほうは、VisualC++5.0ででもコンパイル出来るようにしました。(最終テストはしていないので、もし動かなかったらゴメンなりよ) VisualC++があれば、独自のユーザー関数も追加して遊べるので、VisualC++をお持ちの方は、そういうのもトライしてみられてはいかがでしょうか。

なんだかこの連載も、サポート情報ばかりで、ゲーム制作講座はどうなったんやー!と自分で突っ込みを入れそうになりますが、最近、ロバートさん(Downloadコーナーから紹介させてもらってるところね!)のページをずーっと眺めて、あーやっぱ、教えるっちゅーのは一種の才能やなーと思って感慨にふけっております。こんなやねうらおが、高校一種数学の教育免状なんか持っていて良いものか…日本の教育制度はどこかまちがっとる!と思わずにはいられないやねうらおでありました。(と言って、もらった教育免状はもう返さんけどね:笑)