以前、知人がプログラム勉強中、という話を書いた。
これが、すごい勢いで上達中。
半年前には「ポインタって何?」みたいなレベルだったのが、昔の雑誌の BASIC のプログラムを C 言語に変換して移植する、くらいのことはできるようになった。
といっても、数か月かかって1本のゲームを移植した、というレベルだけど。
そして、その最中に何度も質問されたのだけど、どんどん質問が具体的になる。
面白かったので、最近受けた質問を書いてみよう。
▼教科書に載っているプログラムと、ゲームの違いについて
言語の教科書に載っているようなプログラムは、1本道で別の処理が間に挟まることはない。
たとえば、繰り返し計算が必要な場合、for 文などでループして一気に計算してしまう。
でも、ゲームだと、1回の処理では少しづつ計算して、すべてのキャラについてそれを繰り返す。
こういうことは教科書には載ってないけど、いったいどこで学んだの?
僕の答え。
「言語の教科書」には載ってないけど、ゲーム作りの教科書みたいな本には書いてある。
また、昔のパソコン少年の多くが呼んでいた雑誌、「ベーマガ」こと、マイコン BASIC マガジンには、ゲーム作りのコツが書かれた連載が繰り返し掲載されていた。
コンピューターは本来計算の道具で、計算をするプログラムを作るのであれば、一気に計算して結果を出せばよい。
普通はこちらの使い方になるので、教科書もこのやり方で書かれている。
でも、ゲームに限らず、リアルタイムでコンピューターを使う用途…たとえば家電品なんかのプログラムは、一気に計算しないで、長い時間繰り返し少しづつ処理を繰り返している。
例えば洗濯機は、洗濯中でも蓋が明けられたら危険がないように緊急停止しないといけない。
洗濯機だから洗濯に専念する、というわけには行かず、少しづついろいろな処理を同時に行っている。
ゲームもそうしたプログラムの作り方の一種。
微小時間に区切って、その時間の中で必要な計算だけをするので、「時間で微分している」ともいえる。
そして、これを何回も処理して、実際の時間の中で連続させることで「積分」して、本来得たかった結果を得る。
▼ゲームのキャラ制御について
元の移植ゲームは、ずっと同じ内容を繰り返しているようなゲームだった。
構造がわかってきたので改造して、ボスを出そうとしたらしい。
ボスは最後だけしか出てこないが、メインループの中で処理はしないといけない。
ここで、ボスがいるかどうかをフラグに持っていて、「ボス登場時だけ、ボスを動かす関数を呼ぶ」という処理にしたらしい。
ここで疑問。
ゲーム中のほとんどの時間ボスは出てないのだが、毎回ループの中でフラグをチェックしているのが無駄な気がする。
こういうやり方しかないの?
また、新しいボスを1体出そうとしただけで、その「出現」管理フラグだけでなく、ボスの位置や現在の状態など、管理しないといけない変数が大量に増えた。
普通のゲームだと、いろいろな種類の敵が出るのが普通だけど、こういうデータを全部管理している物なの?
僕の答え。
この疑問を持つようになったら、もう C 言語ではなくて C++ に進むタイミング(笑)
C++ では、変数とプログラムを強く結びつけることで、変数管理の手間を感じにくいようにしている。
また、フラグをもって処理を制御するのではなく、以下のような方法もある。
まず、ゲーム中の各種の処理の関数は「呼び出すだけ」で良いようにしておく。
必要な時は、毎ループ呼び出される。引数などは持たない。
(もしくは、すべての関数で引数の持ち方を共通化しておく)
ポインタはデータの入っている配列などを示すもの、と思われがちだが、プログラムもメモリにあるのでポインタに入れることができる。
(と話したら、この知人はそのことは知っていた。ただ、そんなこともできる、というだけで使い方の具体例はわからないようだった)
例えばポインタの配列を用意して、最初は全部 0 を入れておく。
新しく処理したい敵などが出現した場合、この配列に、敵の処理関数のポインタを入れる。
0 の所を探して入れるようにする。
そして、敵が撃破されたり退場したりした場合、配列を 0 に戻す。
あとは、メインループの中で、配列の値を取り出して、0 なら無視、そうでなければ関数として呼び出す。
これで、フラグなしで敵の関数呼び出しを制御できる。
実際にはもう少し工夫しないと使いにくいのだけど、これと C++ のデータ領域の持ち方を組み合わせてやると、非常にゲームを作りやすくなる。
最初にリンクした半年前の質問と比べて、質問のレベルが段違いなのがお分かりいただけるだろうか。
彼が移植したゲームは、BASIC の移植なので「テキスト文字」の組み合わせで作られている、1980年代っぽさが強いゲームだ。
でも、内部処理については十分な勉強になったようだ。
次は、スプライトライブラリを使ってもう少しグラフィカルなゲームを作りたいらしい。
自分で手を動かして、十分悩んでから質問してくるので、その質問がいつも鋭い。物事の核心を突いてくるのだ。
彼から質問されて答えるのが、結構楽しみだ。
同じテーマの日記(最近の一覧)
別年同日の日記
申し訳ありませんが、現在意見投稿をできない状態にしています。 |