Sorry ? This Page Is Not Only For X68er.

VBツールプログラマ的
VCゲームプログラミング試行

by泰統総蒔

我らがサークルX680x0はゲームを創るサークルなのでプログラマーも多いです。
そこで、せっかくだからプログラム言語周りについて
ちょっとレクチャーしてみましょう。
コレを読んで新たにプログラムに興味を持つ人が出てきてくれるとかなりうれしいです。
…いないに一票。
ちなみにこの記事の中に間違った記述があったとしても、
それを読んだ人が何らかの被害を被ってしまったとしても、私は責任を負えません。

また、間違った記述があったとしてもそれでコレを書いている人間、
ひいてはサークルや学校のレベルを疑ってはいけません。
(以上、言い訳終了)

ついでにいうと、無駄な部分を強調表示してあっても、
決してつっこんではいけません。
…ていうか、つっこんでも良いけど無駄ッス。

一応初心者でも読める内容、っていうか、
熟練者には生ぬるい内容になっているかも知れませんが、
予めご了承下さい。
…コレって中途半端って言うのかもしれないなぁ…
(素粒子レベルまで砕けちりぬれられぬれりろ)。


私はサークル内ではプログラマとして活動しています。
プログラム、勿論ゲームプログラムを実際に組む人ですね。
ですが、実は私は元々ツールプログラマなのです。
高校1年の時にVB(VisualBasic)を手に入れてから、
大学に入るまで簡単なツールプログラム位しか
(そのわりにレジストリを弄るプログラムとかを作っていたのは内緒だ)
創ったことがなかったのです。…一応怪しいゲームを創ったことがありましたが。
ここでは、そんなVBツールプログラマが
VCでゲームを創る上での苦労話でもさせていただくことに致します。

まず前に創っていた(今も創るけど)VBツールの話から行きましょう。
VBは、知ってる人は知っていると思いますが、
ツール制作にこの上なく向いています。
なぜなら、画面上にボタンや文字表示部分など部品を並べるという
至極簡単なデザイン方法ができて、
ツール制作に便利な
イベントドリブン式のプログラム開発環境であるためです。

イベントドリブンとは何か。
正直言って細かい説明は大変なので、簡単に説明しましょう。
…プログラムをちょっとかじっている人でなくてはわからないと思いますけど。
VBでは、よくある起動時から最後までずっと回し続ける
ループ構造などを意識する必要がありません。

ボタンが押されたらどうする、メニューが選ばれたらどうする、のように、
このイベントが起きたらこの処理をする、
といったことを記述していくというプログラム方法ができるのですが、
これがツール制作にはとても向いているのです。
まぁ、VC++(VisualC++)なんかでもMFCを用いたりすれば
イベントドリブンを使えるみたいですけどね(使ってないのでわかりません)。

そんなわけで、私はプログラムを始めてから大学にはいるまでの3年弱(2年強か)、
イベントドリブンプログラムしか組んだことがなかったのです。
コレがゲームを創る上で問題になりました。
まずVBでゲームを創ろうと思ったんですが、
一般的である、メインループから入力状況をチェックして処理、出力をする、
という考え自体がなかなか身に付かなかったのです。
これがかなり痛い。
そもそも、ゲームを創る上では
コントロール(部品)の配置というコト自体あまりやらないので、
普段VBが勝手にやっている処理をわざわざAPIを呼び出したりして
処理しなくてはいけないのですから結構大変でした。
慣れるまでわ。


☆参考

●VBツールプログラマの視点
○タイマーなどによる基本ループ構造
|他のイベントでの変数変更をチェックする
|変数内容を考慮して様々な処理を行う
|描画を行う

○フォームのキー入力受付イベント
|入力状態に応じて変数を弄る

ポイントは基本ループとキー入力受付が全く同期していないこと。
処理中でないときにフォームがキー入力を受け付ければ、
イベント(その入力とか)に応じた処理が行われるのである。
ちなみにこの受付ですが、
プログラマの制御なしに勝手に行われます。
楽だけどゲームを創る上では扱い難いです。


●リストドリブン思考を取り入れたVBゲーム思考
○メインループ
|WindowsAPIなどを用いてキーなどの取得を行う
|取得内容を考慮して様々な処理を行う
|描画を行う

この方法ではもうVCでのプログラミングとナニも変わりませんね。
私は元々VBでのAPI操作には慣れていたのであまり問題はありませんでした。
MSDNライブラリ(ヘルプの類)のVC用のAPI説明を見れば、
VBに移植するのは割と簡単ですし。
ちなみにVBでWindowsAPIを使う場合、
Cでの#includeの代わりにAPI一つ一つを
しっかり宣言しなくはいけないのでちょっと面倒です。
また、DirectXを取り入れた場合でも基本的にこの考え方は変わりません。
更に言っておくと、この方法ならタイマーさえ要りません。
Cのプログラムのように、起動時に呼び出されたルーチンで
全ての処理をやってやればいいのです。
ただし、細かくサブルーチン分割をしないと、
素晴らしくカオスを撒き散らす
楽しいプログラムになること必至です。

それだけは絶対に避けましょう。

●VC&DirectXでのゲーム開発
○メインループ
|WindowsAPIなどを用いてキーなどの取得を行う
|取得内容を考慮して様々な処理を行う
|描画を行う

っていうか、概要はVBリストドリブンと全く一緒。
命令自体は違っても、処理の流れ自体は同じで構わないってコトです。
明らかに違うのは初期化などの部分。同じだったら怖いんですけどね。

…プログラムをやっていない人はAPIがわからないかも知れませんね。
ぶっちゃけて言うとプログラムを構成する基本関数群って感じですかねぇ。
Windowsの基本機能は大体APIで開発者にも提供されているので、
OSができることは大体何とかなるモノです。


ちなみに私はVBの時点でDirectXに手を出しています。
DirectX7になってMicroSoftが
DirectX for VisualBasicというモノを発表し、
VBでもDirectXが割と簡単に弄れるようになったからです。
ですが、ココまで来ると、
もはやVBである必要性は希薄になってきてしまいました。
確かにVisualBasic独特の強力な(気がする)
トレース(デバッグ)能力などはそれなりに発揮できるモノの、
もはやイベントドリブンでゲームを創る意味は無い上に、
コンポーネント(要するに部品)ばらまき型のプログラミングはできないからです。

そして、こういった過程を経た後に、
せっかくだからVCでやろう、という考えがやっと湧いてきたのです。
ですが、ここには大きな敵がいやがりました。
それは、VCはVBのようにナニも考えずに
ウインドウを出すことができたりしないのですね(泣)。

はい、アホ丸出しです。
…MFCは別(別っていうかさっぱりわからないあたりダメダメです)。

だがその問題は、DirectXを使うための
フリーのライブラリを利用することで
さくっと解決しやがりました。素晴らしい。

こうして何とかVCでのプログラムを始めることができるようになったのです。
でも…ある意味予想通りってヤツでしょうか。
始めたばっかりの言語・開発環境で開発が捗るわけがないのですわ。
さっぱりさっぱりです。
頭の上には扇子を持った妖精さん達が回っています♪
とにかく今までとは全く違うわけで、
それこそVBでは基本関数だったモノが
VCではめんどくさい処理を重ねねばならなかったり。
そしてその逆もまた然り。おかげでゲームの基本が構築されていくと共に、
そのカオス度も著しく上昇していくのでした。
話にならん。

ところが。こうやってプログラムのカオス度を激しく上昇させているウチに、
割とVCのうまい記述方法がそれなりにわかってくるのです。
というわけで再構築。
すると、まるで別人の書いたようなソースコードに…なるかも?
なんていうか、やっぱりサブルーチンへの書き出しによる
メインループの簡略化って重要です(ある意味泣)。

こうしてVBツールプログラマはVCゲームプログラマへと
めたもるふぉーぜしていくのでした。
…でも、VBユーザーってポインタ使わないから
使い方がさっぱりわからないのでは?クラスも使わないのでは?
…私だけですか。そうですか。いや、クラスは一応使ってますが。

最後に、VBにおける怖いゲームプログラム製作法
お送りして終わりにしたいと思います。
怖いシューティング系ゲーム製作法ですね。


○つくりかた

まずフォームを用意します。

次に、フォーム上にキャラや弾や的などを
実際に画面に表示する分だけ配置します。
もちろんピクチャボックスかイメージボックスで。
背景の透過がしたければアイコン画像でも使いましょう。簡単に背景の透過ができます。

ここで重要なのは、
アニメーションさせたければそのコマ数だけ準備することです。

そして、フォームのキー受付とかはForm_KeyDownとかで、
出現/消滅系はVisible、移動はMoveで制御します。

勿論処理のオオモトはタイマーコントロール。

さぁ、これでク○ゲー制作方法はわかったね♪
頑張って創って、是非とも私に見せてください。


以上、泰統総蒔の朝まで国会生中継でした(チガウチガウ)。

文責(責任はとりません←無意味) 泰統総蒔