日経ソフトウエア11月号に記事を書かせていただきました

タイトルのとおりです。

日経ソフトウエアトップページ
該当号もくじ

「特集1:初級から中級まで一気に! C言語超入門」のPart3, Part4を書いています。

Part4では最終的にこんなゲームを作っています(Windows限定)。

画面の下にいる男の子がプレイヤーです。これをカーソルキーで左右に動かして、上から落ちてくるものをよけます。石はまっすぐに、ボールはプレイヤーを狙って斜めに、ハサミは開いたり閉じたりしながら落ちてきます。包丁は等加速度直線運動でストンと落ちてくるので、画面の下のほうでは相当高速になりかなり怖いです。

たかだか数十ページの「超入門」記事で、WindowsAPIを叩いてゲームまで作ってしまうのは無茶なような気もしますが、いずれにしたって本当の入門者が、1回限りの雑誌の記事でバリバリCが書けるようになるはずもないわけで、いろいろなレベルの人が、それぞれ何らかの新しいことを学ぶきっかけになれたらよいかと思っています。

内容的には、WindowsAPIの話とかには深くは立ち入らず、Part3では一般的なポインタの話、Part4では、落下物を管理するためmalloc()で構造体を確保して連結リストにしたり、いろいろな種類の落下物を管理するため構造体と列挙型と共用体のコンボを使ったり、落下物を動かす処理をディスパッチするために関数ポインタテーブルを作ったりしています。手前味噌ですが、Cのテクニックのうちよく使うものを結構カバーしているのではないでしょうか。

さて、先日の言い訳ですが、上記ゲームにおいて、ボールは、出現時点でのプレイヤーの場所を「狙って」落ちてきます。よって普通に考えれば、atan2()で角度を求めてcos()とsin()でX軸、Y軸方向の移動量を求めるべきところです。いくら私が文系出身で数学が苦手だからって、この程度のことならできます。

しかし、このゲームでは、垂直方向の移動量は一定とし、左右方向の移動量をプレイヤーのX座標との差をウインドウ高さで割り算して出しています。よって、ボールが垂直に落ちてくるときより、斜めに落ちてくるときの方が移動速度が速くなります。複数のボールが同時に落ちてくるときなど、垂直方向の移動速度が全部同じなので、違和感があるようにも思います。

とはいえ、小中学生は三角関数は習っていないでしょうし、高校生以上でも「数式を見ただけで拒否反応を示す」人はかなりいます。それを考えれば、多少動きが不自然になったとしても、三角関数は使わないほうがいいんじゃないかな、ということでこうしています。

いやまあ、石が等速度でゆっくり落ちてくるようなゲームで、動きが自然とか不自然とかもないような気はしますけど。