1.銃を持ったプレイヤーが画面に向かって撃つ
 今回の自由課題では、画面内だけでゲームが完結するのではなく、外部のデバイス(本課題では銃)の動きを画面に反映させたいと思いました。銃と画面を別にすることで、ユーザーがより直感的に操作できるのに加え、何より銃があった方が本物の射的のようにユーザー自身がゲームに溶け込むことができるからです。

 そのためには、画面側の処理と銃側の処理を行わなければなりません。今回、画面側は1年間学んできたFPGAボードで処理し、銃は今までの自分が得た知識を使って簡単なものを作りました。

 ここで、シューティングゲームの重要なデバイスである銃について説明します。今回自作した銃を下に示しました。

製作した銃
[画像のクリックで拡大表示]

 主な入力インタフェースとしては、プッシュスイッチとチルトスイッチ(傾きセンサー)があります。銃口には青色LEDと赤色LEDがそれぞれ8つずつ、計16個のLEDが並んでいます。銃のトリガーはプッシュスイッチとなっていて、これを押すと銃口部分の赤色LEDが光ります。“装弾数”は3発に設定されており、3回“トリガーを引く”と“球切れ”となります。銃の上部分を見ると残弾数が分かるようになっています。ユーザーは任意のタイミングで銃口を上に傾けることでリロードすることができます。これはチルトスイッチで検知しています。これらの入出力はPICマイコンで制御され、電源と共に銃の内部に組み込まれています。

2.銃とFPGAボードは線で結ばない
 当初の予定では、銃とFPGAボードを有線で接続する予定でした。しかし、講師からのアドバイスを受け、無線化することにしました。

 ここで、課題になったのが、銃の照準(銃の位置測定)と銃を撃ったことの判定をどうするかです。これらについては、カメラを用いたキャプチャー回路を応用することで、解決できました。

 銃口には、前述の通り、青色LEDと赤色LEDが8つずつ、計16個のLEDがあります。常時青色LEDを点灯させ、FPGA側のカメラでその光を捉えることで照準を合わせることができます同様に、トリガーを引いたときに赤色LEDが点灯するようにして、その光をカメラで捉えることで撃ったことを認識できます。

 青色LEDの光を捉える際には、専用のRGB値の範囲を決めておき、キャプチャー回路で捉えた画面でその範囲内にRGB値の座標の重心位置を計算しました。赤色LEDに関しても同様に範囲を決めて画面内で赤色LEDの量を測定しました。

 実際には、画面の中に銃以外の物が入ってくるので照準が定まらなかったり、射出判定の誤認識があったりしました。これらは4.で述べる画面の工夫によって解決することができました。

銃のトリガーを引いていないとき(左)と引いたとき(右)の銃口の状態
[画像のクリックで拡大表示]